Android 12 - IntentFilter의 exported 명시적 선언

Android 11 이하에서, AndroidManifest에 Activity, Service 또는 Broadcast receiver를 선언할 때 android:exported를 명시적으로 선언하지 않았습니다. 기본 값은 exported=true이기 때문에, 외부에 공개하고 싶지 않을 때만 exported=false로 선언하면 되었습니다.

<activity android:name="com.example.app.backgroundService">
    <intent-filter>
        <action android:name="com.example.app.START_BACKGROUND" />
    </intent-filter>
</activity>

Android 12 변경사항: exported 명시적 선언

Android 12 디바이스에서 SDK API 31(android 12)을 Target sdk로 설정한 앱은 intent-filter를 선언한 Activity 등의 Component에 exported를 명시적으로 선언해야 합니다. 그렇지 않으면 아래와 같은 에러를 발생시키며 설치가 실패합니다.

Targeting S+ (version 10000 and above) requires that an explicit value for
android:exported be defined when intent filters are present
The application could not be installed: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED

SDK API 31을 타겟팅하는 앱이라도, intent-filter가 없는 Component는 exported 선언을 생략할 수 있습니다.

다음과 같이 명시적으로 exported를 선언해야 합니다.

<service android:name="com.example.app.backgroundService"
         android:exported="false">
    <intent-filter>
        <action android:name="com.example.app.START_BACKGROUND" />
    </intent-filter>
</service>

intent-filter는 외부에 앱의 Component를 공개하기 위한 방법 중에 하나 입니다. 암시적 인텐트의 리졸빙을 통해서 내 앱의 Component가 실행될 수 있기 때문입니다.

반면에, 내 앱 내부에서만 암시적 인텐트로 Component를 실행시키기 위한 목적으로 쓰이는 경우도 많은데, exported를 설정하지 않아 외부에 공개되었고, 이 때문에 암시적 인텐트의 리졸빙에 영향을 주게 될 수도 있습니다.

구글은 이런 문제를 줄이고자, 명시적으로 exported를 선언하도록 앱 설치에서 제한을 둔 것 같습니다.

Loading script...

Related Posts

codechachaCopyright ©2019 codechacha