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
          }
      

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'
          }