Android 15 Betaバージョンリリース!開発者は新しいバージョン制限にどう対応するか?
Android 15が最近Beta版としてリリースされました
新バージョンは VanillaIceCream バニラアイスクリーム と呼ばれています
以下はロードマップです:
詳細なスケジュールは:公式サイト を参照してください
過去には FLAG_STOPPED というタグが存在しました
その動作は現在アプリが 停止状態 であるかどうかを示していました
過去の 停止状態 の判定は、ユーザーがアプリを強制停止したときに設定され、アプリはこの状態を保持しました。
- 一方、システムがアプリを
停止状態から外すには
過去には ユーザーがアプリをクリックして開く、または一部のインタラクティブウィンドウを開くことで状態を変更できました
↪ ここに公式の 原文 があります:
directly launching the app or indirectly interacting with the app.
(through the sharesheet or a widget, selecting the app as live wallpaper, etc.)
Android 14では ユーザーがアプリをクリックして開く と 一部のインタラクティブウィンドウを間接的に開く ことが可能でした
例として sharesheet、ウィジェット、ライブ壁紙として選択 などが挙げられています
-
最新の
Android 15システムにおけるFLAG_STOPPEDには以下の変更と拡張があります。-
現在、システムが
FLAG_STOPPEDと判定した場合、すべてのpending intentsの操作が停止されます -
システムが
FLAG_STOPPEDから離れると判断した場合、ACTION_BOOT_COMPLETEDブロードキャストが送信されます公式には、このブロードキャストを通じて開発者が pending intent を復元できると述べています。
↪ ここに公式の
原文説明があります。15におけるFLAG_STOPPED判定の調整について: -
Apps should only be removed from the stopped state through direct or indirect user action.
つまり、直接的または間接的なユーザーアクションのみがシステムによって 停止状態 と判定されることを変更します
-
上記から、この状態の判定がより厳格になったことが理解できます
↪ ただし、上記の原文には
indirect user actionが具体的に何を指すのか明確に記載されていません。今後の参考にしてください
-
さらに、
Application StartInfo.wasForceStopped()メソッドを使用して上記の状態を判定できます。
- 公式はRAMの利用戦略を最適化しました
過去にはAndroidは 4 KBメモリページサイズ のみをサポートしていました
現在は 16 KBページサイズ に引き上げられました
来年にはGoogle Playに導入される予定です(15には既にありますが、その時点で16KBコンパイルのアプリが強制されるかは不明です ✨)
ページサイズの引き上げは主に RAM集約型の作業 を最適化し、より効率的に使用できるようにするためです
これはソフトウェアの最適化に関するものです
主に将来 メーカーがより大きく、より高性能なRAMを開発する 際にアプリがスムーズに動作し、互換性を持つようにするためです
✅ ページサイズ はメモリ内の操作単位を表すもので、通常は2の累乗です。例:2KB、4KB、8KBなど。
-
アプリ開発者への影響:↪ Ndkを使用してコンパイルする場合、またはSDKを直接または間接的に使用してコンパイルする場合、
16 KBページサイズのアプリを再設定する必要があるかもしれません
↪ 短期的にはプロジェクトに大きな影響はないでしょう
↪ 将来Google Playに正式にリリースされると、16 KBページサイズに関連する問題が発生する可能性があります
✅ 互換性の問題が発生した場合は、公式サイトを参考にしてコンパイル方法を調整してください
-
Android Studio内のAPK Analyzerを使用して、ネイティブコードが使用されているかどうかを判断できます(または逆コンパイルして確認)↪ apkをAndroid Studioにドラッグします
↪ libフォルダに任意の
.soファイル(共有オブジェクト)が表示されるか確認します
表示される場合、アプリはネイティブコードでコンパイルされています
libや.soが表示されない場合は、ネイティブコードが使用されていない可能性があります
✅ 公式によると、ネイティブコードを使用している場合は、16KBデバイスにアプリを再構築する必要があります。
以下は初期判断の参考です:
↪ 任意のC/C++(ネイティブ)コードを使用している場合、通常はNDK関連やJNIなどを含む。
↪ 任意のサードパーティライブラリがネイティブライブラリを使用している場合。
↪ 任意のサードパーティのビルダーがネイティブライブラリを使用している場合。
- 下図は
16 KBページサイズの機能が最適化された後の
システムパフォーマンスの向上を示しています
アプリを開くにはパスワードが必要です
ただし、公式には現在バグがあるとされています
エミュレーターでもこの機能は見つかりませんでした
しかし、公式はこの機能がアプリの可視性を制限することを述べています
プライベートスペース内のアプリは可視性が制限されているため、
後でこの機能が使用可能になったときに、自分のアプリを入れて問題がないか確認できます
例:QueryAllPackagesPermission`の機能が予期通りに動作するかどうか不明です
その時に試してみてください
Android 15では、ターゲットが24以上でないとインストールできません
インストールできない場合はINSTALL_FAILED_DEPRECATED_SDK_VERSIONと表示されます
以下のコマンドを使用して、規定に合わないapkをインストールできます
adb install --bypass-low-target-sdk-block FILENAME.apk
UI/UX調整
開発者がアプリ内で設定できるようにしました
<application
...
android:enableOnBackInvokedCallback="true"
... >
...
</application>
✅ 予測バックアニメーションとは何かを確認する :参考
↪ 強制的に起動するとForegroundServiceStartNotAllowedExceptionがスローされます
-
dataSyncに対する最終審判↪ dataSyncのサービスは現在、24時間内に6時間しか実行できません。時間が来るとシステムは
Service.onTimeout(int, int)を呼び出しますこの時、タイムアウトを受け取ってから数秒以内に
Service.stopSelf()を呼び出す必要があります↪ 時間が来ても
stopSelfを呼び出さない場合、次のエラーが発生しますA foreground service of ##fgs_type did not stop within its timeout: ##component_name.↪ システムが
Service.onTimeout(int, int)を呼び出すと、そのサービスはもはやフォアグラウンドサービスとは見なされません↪ 現在のbeta2バージョンではスローされるエラーは
ANRと見なされますが、後のバージョンではexceptionに変更されます。↪ 上記の制限はすべてのdataSyncサービスに適用されます。例えば、24時間内にすでに4時間dataSyncを実行している場合、他のdataSyncは残り2時間しか実行できません ↪ または公式が推奨する他の方法に移行することを検討してください:代替案
-
新しいフォアグラウンドサービスタイプの追加:mediaProcessing
↪ このタイプは上記のdataSyncと同じルールが適用されます
↪
mediaProcessingのサービスは現在、24時間内に6時間しか実行できません。時間が来るとシステムはService.onTimeout(int, int)を呼び出しますこの時、タイムアウトを受け取ってから数秒以内に
Service.stopSelf()を呼び出す必要があります↪ システムが
Service.onTimeout(int, int)を呼び出すと、そのサービスはもはやフォアグラウンドサービスとは見なされません↪ 公式が提供する代替案は上記のdataSyncとは異なります:代替案
-
上記のタイプのタイマーをリセットするには、ドキュメントに記載されているように
ユーザーがアプリを前景に移動する必要があります
-
特殊なケースを使用することもできます
- こちらをクリック
- ただし、公式には説明を提供し、審査を通過する必要があります
現在は新しいステップが必要です:TYPE_APPLICATION_OVERLAYを使用してオーバーレイウィンドウを起動し、それが可視である必要があります
↪ 上記の新しい要件を満たさない場合、ForegroundServiceStartNotAllowedExceptionがスローされます。
- ターゲットSDKがAndroid 15以上のアプリは、
おやすみモードDo Not Disturb (DND)のグローバルステートやポリシーの設定をサポートしなくなります。
↪ 以前setInterruptionFilter(INTERRUPTION_FILTER_ALL)を使用して設定していたアプリに影響します。
- Android 15では、この変更に伴いAPIの使用方法が調整されました。使用する場合は注意が必要です。
以下の関数で文字列をフォーマットする際に例外が追加されました。
- String.format(String, Object[])
- String.format(Locale, String, Object[])
- Formatter.format(String, Object[])
- Formatter.format(Locale, String, Object[])
↪ $0を誤用した場合、IllegalFormatArgumentIndexException: Illegal format argument index = 0 がスローされます。
//work
val formattedString = String.format("Name: %1$s, Age: %2$d", name, age);
//exception
val formattedString = String.format("Name: %0$s, Age: %1$d", name, age);
- このissueに対応して、
Randomクラスが調整されました。 現在、Random.ints()はRandom.nextInt()と同じ値を返さなくなりました。 したがって、現在では両者が==であることを期待すべきではありません。- Random.ints(long)
- Random.ints(long, int, int)
- Random.ints(int, int)
- Random.ints()
<application android:allowCrossUidActivitySwitchFromBelow="false" >
実際の変更としては、開こうとしているアクティビティとスタックの最上層のアプリのUIDが一致しない場合、開くことができません。
↪ これはアプリが他の異なるアプリを開くのを防ぐためです。
- その他のバックグラウンドでのアクティビティ起動に関する制限
- 現在、
PendingIntentはデフォルトでバックグラウンドアクティビティの起動をブロックします。
- 現在、
他のUIが影響を受ける可能性がある場合は注意が必要です。
↪ 上記の3番目の画像は、windowInsets.getInsetsなどを使用して調整した後のものです。
またはmaterial 3を使用することもできます。
elegantTextHeight attribute defaults to true:デフォルトでelegantTextHeight属性がtrueになります。
-
Stable configuration:configurationに関連する動作の調整。画面の向きやシステムバーのサイズの判断に影響する可能性があります。 -
Locale-aware default line height for EditText:異なる言語に応じてEditTextの高さが異なる可能性があります。
✅ 変更後の状態が受け入れ可能かどうか確認してください。
取り消すには、useLocalePreferredLineHeightForMinimum属性をfalseに設定します。
TextView width changes for complex letter shapes:複雑な文字のためにデフォルトの文字幅の割り当てルールが調整されました。
複雑な文字により多くのスペースを提供します。
✅ 無効化/有効化したい場合は、setShiftDrawingOffsetForStartOverhang属性を設定します。
- その他のUI/UXの詳細については、こちらのより完全なリファレンスを参照してください:こちらをクリック
✅ オーディオフォーカス (audio focus) を学ぶ こちらをクリック
✅ `非SDK`:Javaのメソッドが含まれます。これらのインターフェースはSDKの内部実装の詳細であり、予告なしに変更される可能性があります。