0. 環境
[Host OS] Windows 11 Home
1. 手順
Playストアの規約変更があったので、AndroidアプリのSDKバージョンを31に上げました。
(アプリルート)/mobile/build.gradle
- 抜粋 (diff)
android { - compileSdkVersion 30 + compileSdkVersion 31 defaultConfig { - targetSdkVersion 30 + targetSdkVersion 31 }
- 抜粋 (diff)
2. ビルドエラー
(2-1) ビルドと実機へのインストールでエラーが発生
エラー内容
Installation did not succeed. The application could not be installed: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED Installation failed due to: 'null'
(2-2) マニフェスト修正
<intent-filter>
を使っているActivityなどに「android:exported=“true”」が必要になったようです。 (デフォルト値が変わったため、今までと同じにするには、この指定が必要)(アプリルート)/mobile/src/main/AndroidManifest.xml
- 修正例 (diff)
<activity android:name=".ClipboardActivity" + android:exported="true" android:label="@string/title_activity_clipboard"> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/*" /> </intent-filter> </activity>
3. アプリクラッシュ
3-1. ビルドは成功したが、下記アプリクラッシュが発生
エラー内容
java.lang.IllegalArgumentException: com.example.app: 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.
3-2. PendingIntentを修正
PendingIntentを使っている箇所を洗い出し、上記で指摘されたフラグを第4引数に足します。(僕のアプリでは下記が該当)
PendingIntent.getActivity() PendingIntent.getService() PendingIntent.getBroadcast()
修正例(diff)
- sender = PendingIntent.getBroadcast(context, 0, intent, 0); + + int pendingIntentFlag = 0; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + pendingIntentFlag = pendingIntentFlag | PendingIntent.FLAG_IMMUTABLE; + } + sender = PendingIntent.getBroadcast(context, 0, intent, pendingIntentFlag);
3-3. 設定追加
さらに下記の記述も必要でした。
(アプリルート)/mobile/build.gradle
- 抜粋(diff)
dependencies { + implementation 'androidx.work:work-runtime-ktx:2.7.0' }