말랑한 하루
[Flutter] (Error) Error type 3: Activity class {com.x.y.MainActivity} does not exist. 본문
[Flutter] (Error) Error type 3: Activity class {com.x.y.MainActivity} does not exist.
지수는말랑이 2024. 3. 30. 19:23Error type 3: Activity class {com.x.y.MainActivity} does not exist. OAuth중 하나인 Kakao Login을 구현하면서 만난 문제이다.
Launching lib\\main.dart on sdk gphone64 x86 64 in debug mode...
√ Built build\\app\\outputs\\flutter-apk\\app-debug.apk.
애플리케이션을 실행하면, 위와 같은 상태로 Flutter Launching 상태가 무한히 지속되는데, 단순히 오래걸리는 것이라는 착각은 하지 않는게 좋다.
이에 대한 문제점을 찾기 위해선 아래 명령어를 사용한다.
flutter run -v
※ 만약 VsCode를 사용하고 있다면 main.dart 또는 다양한 페이지 내에서 F5를 눌러 실행하는 것 보다, 위 명령어를 통해, 정확히 실행되는지 확인해보도록 하자.
그렇다면 제목과 같은 Error type 3: Activity class {com.x.y.MainActivity} does not exist. 오류를 만날 수 있다.
해당 오류는 인터넷을 검색하면 다음과 같은 해결 방법을 만나게 된다.
🍒 emulator wipe data
🍒 emulator에 존재하는 application 삭제
이 방법은 Setting → 앱 및 설정 → 모든 앱 보기를 통해 설치되었거나 설치 중 멈춘 애플리케이션을 삭제할 때 활용한다.
직접 emulator에서 삭제하는 방법 이외에, android-sdk의 tools를 찾아가 abd uninstall {packageName}을 진행해도 된다 하는데, 본인의 경우 android-sdk의 경로를 찾지 못했다.
하지만 나의 경우에는, 두 방법 모두 효과가 없었다.
그 이유는 잘못된 AndroidManifest.xml 작성에 존재했다.
나는 Flutter에서 Kakao Login을 진행하고 나서 원래의 앱으로 돌아오기 위해 커스텀 URL 스킴을 설정하여, 앱으로 리다이렉트 될 수 있도록 설정했다.
그리고 추후 사용될 카카오톡 공유 및 메세지를 활용하기 위한 스킴을 추가했었다.
이 과정에서 나는 AndroidManifest.xml을 잘못 작성했다고 말할 수 있다. 내가 xml 파일의 내용을 수정하면서, 해당 오류를 해결했기 때문이다.
나의 잘못은 다음과 같았다.
🍒 카카오톡 공유 및 메세지에 관한 스킴 설정을 새로운 MAIN <intent-filter> tag에 추가한 것
.MainActivity를 name으로 가지는 activity는 기본적으로 다음과 같은<intent-filter> tag를 가지고 있다.
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
그리고 카카오톡 공유 및 메세지에 관한 인텐트는 다음과 같습니다.
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- "kakao${YOUR_NATIVE_APP_KEY}://${PRODUCT_NAME}" 형식의 앱 실행 스킴 설정 -->
<!-- 카카오톡 공유, 카카오톡 메시지 -->
<data android:host="kakaolink"
android:scheme="kakao${KAKAO_NATIVE_APP_KEY}" />
</intent-filter>
하지만 나는 이것을 혼합해서 다음과 같이 사용했습니다.
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<!-- "kakao${YOUR_NATIVE_APP_KEY}://${PRODUCT_NAME}" 형식의 앱 실행 스킴 설정 -->
<!-- 카카오톡 공유, 카카오톡 메시지 -->
<data android:host="kakaolink"
android:scheme="kakao${KAKAO_NATIVE_APP_KEY}" />
</intent-filter>
그래서 내 AndroidManifest 내부에서는 파악할 수 없는 <data>태그로 인해, MainActivity가 생성되지 않아 애플리케이션을 실행할 때, 찾을 수 없다고 말하는 것이라고 생각합니다.
잘못 혼합해서 사용했던 <intent-filter>를 수정하고, 다시 앱을 시작했을 때 내 앱은 정상적으로 설치되고 실행됐습니다.
이 현상에 대해 정확하게 파악하고 넘어가기 위해선 다음 4개의 레퍼런스를 참고하길 바랍니다.
※ https://developer.android.com/guide/components/intents-filters
※ https://developer.android.com/reference/android/content/Intent.html
※ https://developer.android.com/guide/topics/manifest/action-element?hl=ko
※ https://developer.android.com/guide/topics/manifest/category-element?hl=ko