動作の変更点: 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 権限をリクエストする必要があります。これは normal 権限であり、リクエストしたアプリに自動で付与されます。

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 インチの仮想デバイスでは、大画面でコードをテストできます。

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