アプリをアップデートしようとしたところ、次のエラーが表示された。
現在、お客様のアプリは API レベル 30 を対象にしています。セキュリティとパフォーマンスが最適化された最新の API を利用するには、API レベル 31 以上を対象にする必要があります。アプリの対象 API レベルを 31 以上に変更してください。
2022年11月より、アプリのアップデートは API レベル 31 以降を対象としないといけなくなっていた。
developer.android.com
まず、単純に、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 を最新版にすることで、この問題は解決した。