Android 10 には、アプリに影響する可能性があるシステム動作の変更が含まれています。このページに記載されている変更は、API 29 以降をターゲットとするアプリにのみ適用されます。アプリで targetSdkVersion を「29」以上に設定している場合は、必要に応じてアプリを変更し、下記の動作に適切に対応できるようにしてください。
Android 10 で動作するすべてのアプリに影響する動作変更のリストも必ずご確認ください。
注: このページに記載されている変更に加えて、Android 10 では、プライバシーに基づく変更や制限が多数導入されています。たとえば、次のようなものがあります。
- 対象範囲別ストレージ
- USB デバイスのシリアル番号へのアクセス
- Wi-Fi の有効化、無効化、設定
- 接続 API の位置情報の利用許可
これらの変更は、対象 API レベル 29 以降を対象とするアプリに影響し、ユーザーのプライバシーを強化します。これらの変更をサポートする方法について詳しくは、プライバシーの変更ページをご覧ください。
非 SDK インターフェースに対する制限の更新
アプリの安定性と互換性を確保するため、Android 9(API レベル 28)以降、アプリで使用できる非 SDK インターフェースが制限されています。Android 10 では、Android デベロッパーの協力と直近の内部テストに基づいて、制限を受ける非 SDK インターフェースのリストが更新されています。Google は、非 SDK インターフェースを制限する前に、その代替となる公開インターフェースを利用可能にすることを目指しています。
Android 10(API レベル 29)をターゲットとしないアプリでは、この変更の一部はすぐには影響しない可能性があります。ただし、現時点で(アプリのターゲット API レベルに応じて)一部の非 SDK インターフェースを利用できていても、非 SDK のメソッドまたはフィールドをそのまま使用し続けると、将来的にアプリが機能しなくなるリスクが高くなります。
アプリが非 SDK インターフェースを使用しているかどうか不明な場合は、アプリをテストして確認できます。アプリが非 SDK インターフェースに依存している場合は、SDK の代替手段への移行を計画してください。ただし Google も、一部のアプリには非 SDK インターフェースを使用する正当なユースケースがあると承知しています。アプリの機能に使用している非 SDK インターフェースの代わりが見つからない場合は、新しい公開 API をリクエストしてください。
詳しくは、非 SDK インターフェースの制限に関する Android 10 での変更点と非 SDK インターフェースの制限をご覧ください。
共有メモリ
Ashmem により /proc/<pid>/maps の Dalvik マップの形式が変更され、マップファイルを直接解析するアプリに影響します。アプリ デベロッパーは、Android 10 以降を搭載したデバイスで /proc/<pid>/maps 形式をテストし、アプリが dalvik マップ形式に依存している場合は、それに応じて解析する必要があります。
Android 10 をターゲットとするアプリは、ashmem(/dev/ashmem)を直接使用できません。代わりに、NDK の ASharedMemory クラスを介して共有メモリにアクセスする必要があります。また、アプリは既存の ashmem ファイル記述子に直接 IOCTL を作成することはできず、代わりに NDK の ASharedMemory クラスまたは Android Java API を使用して共有メモリ領域を作成する必要があります。この変更により、共有メモリを操作する際のセキュリティと堅牢性が向上し、Android 全体のパフォーマンスとセキュリティが向上します。
アプリのホーム ディレクトリに対する実行権限の削除
書き込み可能なアプリのホーム ディレクトリからファイルを実行することは、W^X 違反です。アプリは、アプリの APK ファイル内に埋め込まれているバイナリコードのみを読み込む必要があります。
Android 10 をターゲットとする信頼できないアプリは、アプリのホーム ディレクトリ内のファイルで execve() を直接呼び出すことはできません。
また、Android 10 をターゲットとするアプリでは、dlopen() で開いたファイルの実行コードをメモリ内で変更し、その変更をディスクに書き込むことはできません。これは、書き込み可能なファイル記述子を介してライブラリを PROT_EXEC にマッピングできないためです。そのようなファイルとしては、テキストの再配置を伴う共有オブジェクト ファイル(.so)があります。
Android ランタイムが受け入れるのはシステムが生成した OAT ファイルに限られる
Android ランタイム(ART)は、アプリケーション プロセスから dex2oat を呼び出さなくなりました。この変更により、ART はシステムが生成した OAT ファイルのみを受け入れるようになります。
ART が行う AOT の正確性を強化
以前は、Android ランタイム(ART)によって実行される事前(AOT)コンパイルでは、コンパイル時とランタイム時にクラスパス環境が同じでない場合、ランタイム クラッシュが発生することがありました。Android 10 以降では、これらの環境コンテキストが常に同じである必要があります。その結果、動作が次のように変更されます。
- カスタム クラスローダー(
dalvik.systemパッケージのクラスローダーとは異なり、アプリによって作成されたクラスローダー)は AOT コンパイルされません。これは、ART が実行時にカスタマイズされたクラス検索の実装を認識できないためです。 - セカンダリ dex ファイル(プライマリ APK に含まれていないアプリによって手動で読み込まれる dex ファイル)は、バックグラウンドで AOT コンパイルされます。これは、初回使用時のコンパイルのコストが高すぎて、実行前に不要なレイテンシが発生する可能性があるためです。なお、アプリの場合は、分割を採用して、セカンダリ dex ファイルから移行することをおすすめします。
- Android の共有ライブラリ(Android マニフェストの <library> エントリと <uses-library> エントリ)は、以前のバージョンのプラットフォームで使用されていたものとは異なるクラスローダー階層を使用して実装されています。
全画面表示インテントに関するアクセス権限の変更
Android 10 以降をターゲットとし、全画面インテントを含む通知を使用するアプリは、アプリのマニフェスト ファイルで USE_FULL_SCREEN_INTENT 権限をリクエストする必要があります。これは通常の権限であるため、システムはリクエスト元のアプリに自動的に付与します。
Android 10 以降をターゲットとするアプリが、必要な権限をリクエストせずに全画面インテントを含む通知を作成しようとすると、システムは全画面インテントを無視し、次のログ メッセージを出力します。
Package your-package-name: Use of fullScreenIntent requires the USE_FULL_SCREEN_INTENT permission
折りたたみ式のサポート
Android 10 は、折りたたみ式デバイスと大画面デバイスをサポートするように変更されています。
Android 10 でアプリを実行すると、onResume() メソッドと onPause() メソッドの動作が異なります。マルチウィンドウ モードまたはマルチディスプレイ モードで複数のアプリが同時に表示される場合、表示されるスタック内のフォーカス可能な最上位アクティビティはすべて再開状態になりますが、実際にフォーカスされるのは、そのうちの 1 つ(「最上位の再開」アクティビティ)のみです。Android 10 より前のバージョンで実行している場合、一度に再開できるのはシステム内の 1 つのアクティビティのみで、他の表示されているアクティビティはすべて一時停止されます。
「フォーカス」と、「一番に再開される」アクティビティを混同しないようにしてください。システムは、z オーダーに基づいてアクティビティに優先度を割り当て、ユーザーが最後に操作したアクティビティに高い優先度を付与します。アクティビティは、最上位で再開されていても、フォーカスされていないことがあります(たとえば、通知シェードが展開されている場合)。
Android 10(API レベル 29)以降では、onTopResumedActivityChanged() コールバックに登録することで、アクティビティが最上位の再開位置を取得または失ったときに通知を受け取ることができます。これは、Android 10 より前の再開状態に相当します。アプリが排他的リソースまたはシングルトン リソースを使用していて、他のアプリと共有する必要がある場合に、ヒントとして役立ちます。
resizeableActivity マニフェスト属性の動作も変更されました。アプリが Android 10(API レベル 29)以降で resizeableActivity=false を設定している場合、利用可能な画面サイズが変更されたときや、アプリが別の画面に移動したときに、互換モードに移行することがあります。
アプリは、Android 10 で導入された android:minAspectRatio 属性を使用して、アプリがサポートする画面比率を示すことができます。
バージョン 3.5 以降、Android Studio のエミュレータ ツールには、より大きな画面でコードをテストするための 7.3 インチと 8 インチの仮想デバイスが含まれています。
詳細については、折りたたみ式デバイス向けにアプリを設計するをご覧ください。