動作の変更点: API 29 以降をターゲットとするアプリ

Android 10 には、アプリに影響する可能性がある最新のシステム動作変更が含まれています。このページに記載されている変更は、API 29 以降をターゲットとするアプリにのみ適用されます。アプリで targetSdkVersion を「29」以上に設定している場合は、必要に応じてアプリを変更して、下記の動作に適切に対応できるようにしてください。

Android 10 で実行されるすべてのアプリに影響する動作変更のリストも必ずご確認ください。

注: Android 10 では、このページに記載されている変更以外にも、プライバシーに基づく次のようなさまざまな変更や制限が導入されています。

  • 対象範囲別ストレージ
  • USB デバイスのシリアル番号へのアクセス
  • Wi-Fi の有効化、無効化、構成が可能
  • Connectivity 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 インチの仮想デバイスが用意されています。

詳細については、折りたたみ式デバイス向けにアプリを設計するをご覧ください。