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を設定していない外部に公開され、このため、暗黙的インテントのリジョルビングに影響を与える可能性があります。

Googleはこのような問題を減らそうと、明示的にexportedを宣言するようにアプリのインストールで制限を置いたものです。

codechachaCopyright ©2019 codechacha