必須事項 Link to heading
これらの項目を対応しないと、クラッシュ、ネットワーク通信の遮断、またはアプリストアからのリジェクトを引き起こします。
Android 17 (APIレベル 37) Link to heading
- 大画面でのリサイズ必須化: 最小幅が600dpのディスプレイでは、システムは開発者による画面方向やリサイズのオプトアウトを無視します。
screenOrientationやresizeableActivity="false"などのマニフェスト属性は破棄され、アプリはフリーフォームのウィンドウ操作と画面方向の変更をネイティブにサポートする必要があります。 - ローカルネットワークのロックダウン: ローカルサブネット上のデバイスと通信するために、アプリは
ACCESS_LOCAL_NETWORKランタイム権限を取得する必要があります。この権限がない場合、ローカルアドレスへのソケット接続の試行はインターセプトされ、カーネルレベルでブロックされます。 - ネイティブライブラリの強化:
System.load()を介してロードされるネイティブライブラリはすべて読み取り専用としてマークされる必要があります。そうしないと、システムは致命的なUnsatisfiedLinkErrorをスローします。 - static finalの整合性: リフレクションを介した
static finalフィールドの変更はIllegalAccessExceptionをスローするようになり、JNIを介した変更は即座にアプリをクラッシュさせます。 - SMS OTPの保護: 乗っ取りを防ぐため、ほとんどのアプリに対して標準的なSMS OTPメッセージへのプログラムによるアクセスが3時間遅延されます。即座にアクセスするには、SMS Retriever APIに移行する必要があります。
- バックグラウンドオーディオの強化: バックグラウンドアプリは、オーディオを再生したりフォーカスを要求したりするために、使用中(while-in-use)機能を持つ有効なフォアグラウンドサービスを備える必要があります。そうでない場合、API呼び出しはサイレントに失敗します。
- Playストアの連絡先ポリシー: 広範な
READ_CONTACTSの使用は、コア機能であることを正当化するための技術的宣言をPlay Consoleで行うか、権限不要のSystem Contacts Pickerへの移行が必要になります。 - ロックフリーのMessageQueue: フレームドロップを減らすため、コアスレッドアーキテクチャがロックフリーになり、
mMessagesやmIdleHandlersなどのプライベートな内部フィールドに対する深いリフレクションが破損します。 - NPU機能の宣言: Neural Processing Unit(NPU)への直接アクセスを必要とするアプリは、ハードウェアによるブロックを防ぐため、マニフェストで
android.hardware.npu機能フラグを明示的に宣言する必要があります。 - Activityの再作成のアップデート: システムは、キーボードの表示設定やカラーモードなどの構成変更に対して、デフォルトでActivityを再起動しなくなりました。アプリがリソースを再読み込みするために完全な再起動に依存している場合は、
android:recreateOnConfigChangesを使用して明示的にオプトインする必要があります。
Android 16 (APIレベル 36) Link to heading
- エッジツーエッジの必須化: エッジツーエッジの強制に対するマニフェストのオプトアウトは非推奨となり無効化されました。アプリはシステムバーの裏に描画することをネイティブにサポートする必要があります。
- 予測型バックナビゲーション: 予測型バックシステムアニメーションがデフォルトで有効になります。
onBackPressedが呼び出されなくなるため、アプリはサポートされているバックナビゲーションAPIを使用する必要があります。
Android 14 & 15 (APIレベル 34-35) Link to heading
- フォアグラウンドサービスのタイプ: アプリは、サービスを開始する前に特定のタイプ(例:
location、mediaPlayback)を宣言し、対応するランタイム権限を取得する必要があります。 - 選択した写真へのアクセス: ユーザーは部分的なメディアアクセスを許可できます。アプリはプロセス外のシステムピッカーをサポートするためにJetpack PickVisualMedia APIを利用する必要があります。
- 実行可能ファイルの強化: 動的にロードされる実行可能ファイル(DEX、JAR)は読み取り専用としてマークされる必要があります。
- 暗黙的インテントの制限: 暗黙的インテントは、エクスポートされていない内部アプリコンポーネントをターゲットにできなくなります。
Android 13 (APIレベル 33) Link to heading
- メディア権限の細分化: 広範な
READ_EXTERNAL_STORAGEは、READ_MEDIA_IMAGES、READ_MEDIA_VIDEO、READ_MEDIA_AUDIOに分割されました。 - 通知権限: 通知を表示するには、アプリは
POST_NOTIFICATIONSランタイム権限を要求する必要があります。
Android 12 (APIレベル 31-32) Link to heading
- より安全なコンポーネントのエクスポート: インテントフィルタを持つすべてのActivityまたはServiceは、
android:exported="true|false"を明示的に宣言する必要があります。 - PendingIntentの可変性: バックグラウンドでの乗っ取りエクスプロイトを防ぐため、すべての
PendingIntentはFLAG_IMMUTABLEまたはFLAG_MUTABLEのいずれかを指定する必要があります。
Android 11 (APIレベル 30) Link to heading
- スコープ別ストレージの必須化: 従来のオプトアウトによる広範なファイルシステムアクセスは恒久的に削除されました。アプリはアプリ固有のディレクトリまたはMediaStore APIを使用する必要があります。
- パッケージの可視性: デフォルトでは、アプリはインストールされているすべてのパッケージをクエリできません。ターゲットはマニフェストの
<queries>ブロック内で宣言する必要があります。
推奨事項 Link to heading
これらのベストプラクティスは、アプリの応答性と効率を維持するためのものです。
- System.gc()の廃止: 最新のARTは、世代別コンカレントマークコンパクションを使用して、一時的なオブジェクトを頻繁に収集します。手動呼び出しは、省電力のために無視されるか、目に見えるUIのジャンクを引き起こす破壊的な一時停止をトリガーすることがよくあります。
- アプリごとのメモリガードレール: システムはデバイスの容量に基づいて厳格なRAM制限を適用し、匿名の常駐セットサイズを追跡します。これらを超えるとサイレントカーネル終了がトリガーされます。
ApplicationExitInfo.getDescription()で「MemoryLimiter」という文字列を検索して特定できます。 - R8フルモードの強制:
android.enableR8.fullMode=falseを削除すると、積極的なツリーシェイキングとメソッドのインライン化が可能になり、DEXサイズと常駐メモリフットプリントが大幅に削減されます。 - ComposeファーストUIの採用: 標準のViewベースのコンポーネントは現在メンテナンスモードに入っています。すべての新しいプラットフォームAPIとツールは、Jetpack Compose専用に構築されています。
- AppFunctionsフレームワーク:
@AppFunctionで機能にアノテーションを付けて「インテリジェンスシステム」に移行します。これにより、AIエージェントはKDocの説明を使用してアプリのワークフローを検出し、実行できるようになります。 - 自発的なメモリの解放: アプリが表示状態から離れるときに
onTrimMemory()を実装して、Bitmapや動画バッファなどの実質的な割り当てを解放し、プロセスがキャッシュされた状態を保つ時間を延ばします。