본문 바로가기
🖥 Programming/📱 Android (Kotlin)

[Android] 외부라이브러리 'android:exported' 해결방법 (Manifest Overriding 처리)

by MinChan-Youn 2022. 8. 22.

안녕하세요~ 챠니입니다! :)

오늘은 Android 12 이상을 대상으로 하는 앱에서 자주 에러가 발생하는 'android:exported'문제에 대해서 알아보겠습니다.

 

    Android 12 이상 앱 'android:exported' 문제점 (외부라이브러리 Android 12이하)

    Android 12 이상을 대상으로 하는 앱은 구성 요소에 인텐트 필터가 정의된 경우 'android:exported'에 대한 명시적 값을 지정해야 합니다.

     

    개발중 제가 만난 에러는 다음과 같습니다.

    Manifest merger failed : android:exported needs to be explicitly specified for <activity>. Apps targeting Android 12 and higher are required to specify an explicit value for `android:exported` when the corresponding component has an intent filter defined. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details.

     

    여기서 중요한 점은!

    제가 작업하는 프로젝트는 Android 12 이상을 대상으로하는 앱이므로 'android:exported'처리가 다 되어있는 상황이였습니다.

     

    그렇다면?

    확인결과 외부라이브러리가 Android 10(SDK 30)을 기준인 라이브러리를 사용하는 과정에서 발생한 오류였습니다.

     

    그렇다면 어떻게 해결을 하는가??

    해결방법은 아래와 같습니다.

     

     

     

    외부라이브러리 Android 12이상 'android:exported' 어떻게 해결해야하는가?

    Android Developer에서는 다음과 같이 설명하고 있습니다.

    https://developer.android.com/studio/build/manage-manifests

     

    매니페스트 파일 관리  |  Android 개발자  |  Android Developers

    매니페스트 빌드 변수, 매니페스트 병합, 매니페스트 병합 도구에 관해 알아보세요.

    developer.android.com

     

    Manifest(매니페스트 파일관리) 에 대해서 다음 처럼 설명하고 있는데요.

    • <manifest> 요소의 속성은 함께 병합되지 않습니다. 우선순위가 가장 높은 매니페스트의 속성만 사용됩니다.
    • <uses-feature>  <uses-library> 요소의 android:required 속성은 OR 병합을 사용하므로 충돌이 있으면 "true"가 적용되고 하나의 매니페스트에 필요한 기능 또는 라이브러리가 항상 포함됩니다.
    • <uses-sdk> 요소의 속성은 다음과 같은 상황을 제외하고 항상 우선순위가 높은 매니페스트의 값을 사용합니다.
      • 우선순위가 낮은 매니페스트에 더 높은 minSdkVersion 값이 있다면 overrideLibrary 병합 규칙을 적용하지 않는 한 오류가 발생합니다.
      • 우선순위가 낮은 매니페스트에 더 낮은 targetSdkVersion 값이 있으면 병합 도구는 우선순위가 높은 매니페스트의 값을 사용하지만, 가져온 라이브러리가 계속 제대로 작동하는지 확인하는 데 필요한 모든 시스템 권한도 추가합니다(예: 더 높은 버전의 Android에서 권한 제한이 증가한 경우). 이 동작에 관한 자세한 내용은 암시적 시스템 권한 관련 섹션을 참조하세요.
    • <intent-filter> 요소는 매니페스트 간에 일치하지 않습니다. 각각 고유하게 취급되며 병합된 매니페스트의 공통 상위 요소에 추가됩니다.

     

    위 내용을 통해 외부 라이브러리에서 Android 12버전을 사용하기 위해서 설정이 필요한`android:exported'을 다른곳에서 overrideLibrary처리하여 병합 규칙을 적용해야하는 것을 알 수 있습니다.

     

     

    외부라이브러리 Android 12이상 'android:exported' 해결방법(overrideLibrary)

    Android Developer에서는 다음과 같이 설명하고 있습니다.

    https://developer.android.com/studio/build/manage-manifests

     

    외부라이브러리가 다음과 같이 AndroidManifest.xml 파일이 되어있다면

    <!-- 외부라이브러리 AndroidManifest.xml -->
    <activity
        android:name="외.부.라.이.브.러.리">
        <intent-filter>
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    실제 작업 중인 프로젝트에서 activity를 override하고 android:exported 추가하면 되겠습니다.

    <!-- 작업 중인 프로젝트 AndroidManifest.xml -->
    <activity
        android:name="외.부.라.이.브.러.리"
        android:exported="true">
    </activity>

     

     

    자 이제 재 빌드를 통해서 문제가 해결된 것을 볼 수 있습니다!

     

     

     

     

     

     

     

     

     

     

     

    질문 또는 궁굼한 부분은 댓글을 남겨주세요! 친절하게 답변드리겠습니다!

    응원의 댓글은 저에게 큰 힘이 된답니다! :)

    즐거운 하루되세요!

     

    깃허브 보러 놀러오세요 👇 (맞팔환영)

    https://github.com/younminchan

     

    younminchan - Overview

    안드로이드 2년차 개발자 •⚽️/🎤/🥁/🖥/🏃‍♂️/🚴‍♂️/🤟 TechBlog⬇️ minchanyoun.tistory.com - younminchan

    github.com