アプリをアップデートしようとしたところ、次のエラーが表示された。
現在、お客様のアプリは API レベル 30 を対象にしています。セキュリティとパフォーマンスが最適化された最新の API を利用するには、API レベル 31 以上を対象にする必要があります。アプリの対象 API レベルを 31 以上に変更してください。
2022年11月より、アプリのアップデートは API レベル 31 以降を対象としないといけなくなっていた。
まず、単純に、build.gradle の compileSdkVersion と targetSdkVersion を 31に上げた。
android { compileSdkVersion 31 defaultConfig { targetSdkVersion 31 } }
再度、アップデートしようとしたところ、次のエラーが表示された。
アップロードされた APK または Android App Bundle には、インテント フィルタを使用するアクティビティ、アクティビティ エイリアス、サービス、またはブロードキャスト レシーバが含まれていますが、'android:exported' プロパティ セットは使用されていません。 このファイルは Android 12 以降にはインストールできません。
Android 12 では、Manifest で、インテント フィルタを使用する activity や receiver, service 等にAndroid:exported="false | true" の記述が必要になった。
<activity android:name="name_of_the_activity>" android:exported="false | true" tools:node="merge" /> <receiver android:name="name_of_the_entry" android:exported="false | true" tools:node="merge" />
起動する activity 等、他から使用される場合は、 exported="true" にしないといけない。
サービスがアプリの内部でのみ使用され、exported="true" にしていると、次の警告が表示される。
Exported service does not require permission.
この場合、exported="false" にすると、警告は消える。
ビルド時、次のエラーが表示された。
Invoke-customs are only supported starting with Android O (--min-api 26)
この場合、build.gradle に次を追加することで、エラーは消えた。
android { compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } }
Android 12 で、使用している SDK 内で、次の Crash が起きた。
java.lang.IllegalArgumentException: Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent. Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if some functionality depends on the PendingIntent being mutable, e.g. if it needs to be used with inline replies or bubbles.
SDK を最新版にすることで、この問題は解決した。