k-shinn’s 雑記

技術メモを書き溜められたら良いな

Android12beta触ろうとして早速詰まった所

Android12beta版が発表されまして、早速試そうとしたところで色々詰まったのでその備忘録です。

前提として、既存のプロジェクトを12に移行して試す場合です。 公式ドキュメント的には以下の辺りからの内容です。

developer.android.com

developer.android.com

intent-filter付きのコンポーネントへのexported設定

ドキュメント的には以下の内容です。

intent-filter を含むActivityやServiceには、 android:exported="true/false" を設定する事が必須になりました。 ざっくりとした理解としては、アプリの外に公開する必要がある―外部から開かれるためのfilterには "true"、そうでないものは "false" になるようです。

つまるところ、起動時のActivityのへの指定は "true" になるようです。

    <application
        ...
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

これを指定しないとそもそもインストールで失敗するのはドキュメントの通りなのですが、起動時のActivityを間違って "false" にしてしまい、以下のgifのようになりました…。

f:id:k-shinn:20210524234008g:plain:w200

intentの受け取り手が見つからなくて失敗しているような挙動でしょうか。

例としてドキュメントに載っているものがBackgroundServiceの "false" 設定だけだったので、適当にコピペしてたら間違うかもしれないので注意です。

PendingIntentの可変性宣言

こちらも必須になった系のものです。 ドキュメントは以下です。

タイトル通り、PendingIntentを使う際に PendingIntent.FLAG_MUTABLE または PendingIntent.FLAG_IMMUTABLE のフラグを付けるのが必須になっています。

可能な限り FLAG_IMMUTABLE を推奨とのことですが、通知内のダイレクト返信アクションバブルを使用する際にはこの限りでは無いそうです。 あくまでも必要に迫られた場合のみということですね。

なお困ったことに、依存するLibraryもこの影響を受けてしまうようです。

私の環境ではデバッグ用途のLibraryが使用していたらしく、起動時に以下のErrorを吐いてしまいました。

    java.lang.IllegalArgumentException: /* PACKAGE_NAME */: Targeting S+ (version 10000 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.

PendingIntentの作成時にスローされるので、意図せず内包している可能性があり注意が必要です。

sdkVersionの構文

最初に弄る箇所の話なのですが、お恥ずかしい話なので最後に書きます...。

compileSdkVersiontargetSdkVersion は "31" ではない…というだけの話です。 最初に何も考えず"31"って書いてBuild失敗してしばらく首を傾げてました…。

正しくはドキュメントの通り以下です…。

android {
    compileSdkVersion("android-S")

    defaultConfig {
        targetSdkVersion("S")
    }
}

起動時に躓くと気分的にとても消耗してしまうので、気を付けたいところです。