[해결방법] Flutter 오류 - 인텐트 필터를 포함하되 'android:exported' 속성...

Flutter 앱 이전 후 빌드하는 과정에서 Flutter 3.x 버전으로 업그레이드하고 라이브러리도 변경해줬습니다.

AAB로 빌드하고 구글플레이콘솔에 앱을 업데이트하려고 하는데 아래와 같은 에러가 발생했습니다.

더보기

인텐트 필터를 포함하되 'android:exported' 속성을 설정하지 않고 활동, 활동 별칭, 서비스 또는 broadcast receiver가 있는 APK 또는 Android App Bundle을 업로드했습니다. Android 12 이상에는 이 파일을 설치할 수 없습니다. 참조: developer.android.com/about/versions/12/behavior-changes-12#exported

 

에러 문구에도 나와있듯이 Android 12 이상에서는 AndroidManifest.xml 파일에 선언되어 있는 <Activity> 중 <intent-filter>를 사용하는 경우 android:exported 속성을 설정해야 한다는 내용입니다.

 


하루 꼬박 검색하면서 해결  방법을 찾았는데 빙빙 돌다가 이제서야 문제를 해결하게 되었네요.

아래와 같은 순서대로 문제를 해결해보세요.

 

먼저 android/app/src/main/AndroidManifest.xml 파일에는 android:exported 속성은 잘 지정되어 있었기 때문에 라이브러리 중 하나가 지정되어 있지 않다고 추측했습니다.

우선, 어떤 라이브러리가 exported 속성이 지정되어 있지 않은지 찾아봐야겠죠?

http://www.javadecompilers.com/ 

우선 위의 링크에 클릭하고 아래의 이미지 좌측 메뉴에 APK decompiler를 통해 APK 파일을 등록해서 AndroidManifest.xml 파일을 확인합니다. (Flutter의 AAB 파일로 빌드하지 마시고 APK 파일로 빌드를 하셔야해요.)

APK 파일 선택 후 디컴파일을 하면 아래와 같은 이미지가 표시되고 

 

디컴파일이 끝난 APK 파일 내부의 항목은 resouces와 sources 두개의 폴더로 표시되고

resources 폴더의 AndroidManifest.xml 파일을 확인해보면 이렇게 표시됩니다. 프로젝트에서 사용하는 모든 라이브러리의 manifest 파일이 android의 정책에 따라 merge된 결과입니다. (Android의 manifest 파일 merge 정책은 여기서 확인해보세요. https://developer.android.com/studio/build/manifest-merge?hl=ko)

 

그 다음 <intent-filter> 를 검색하여서 어떤 항목이 android:exported 속성을 포함하고 있는지 찾아야 합니다.

저의 경우 아래와 같이 flutter_local_notifications 라이브러리가 문제였었네요. 오래된 8.2.0 버전을 사용하고 있어서 발생한 문제였어요. 

. . .

<receiver android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver">
    <intent-filter>
    <action android:name="android.intent.action.BOOT_COMPLETED"/>
    <action android:name="android.intent.action.MY_PACKAGE_REPLACED"/>
    <action android:name="android.intent.action.QUICKBOOT_POWERON"/>
    <action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
    </intent-filter>
</receiver>

. . .

 

라이브러리의 버전을 올려주면 될거라고는 생각했지만 어떻게 문제를 해결해야할지 알아야 했기 때문에 그대로 진행했답니다.

그리고는 마지막으로 android/app/src/main/AndroidManifest.xml 파일안에 <application></application> 사이에 아래와 같은 항목을 추가해주면 됩니다. 

 <receiver android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver"
              android:exported="true">   
    </receiver> 

 

해당 속성을 추가해줌으로써 최종적으로 merge된 AndroidManifest.xml에 문제가 되었던 라이브러리에 android:exported 항목이 설정되었습니다.

 

이제 다시 AAB 파일로 Flutter Build를 한 다음에 구글플레이콘솔 업로드하면 골치아팠던 문제가 해결된답니다.


 

728x90