将棋プログラミング

(将棋に関する)ソフトウェア開発のノウハウ等。

Android 12 対応

アプリをアップデートしようとしたところ、次のエラーが表示された。

現在、お客様のアプリは 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 を最新版にすることで、この問題は解決した。