Save the date! Android Dev Summit is coming to Sunnyvale, CA on Oct 23-24, 2019.

Android Q の動作変更: Android Q をターゲットにしているアプリ

Android Q プラットフォームには、アプリに影響を与える可能性のある動作変更が含まれています。下記の動作変更は、Android Q 以降をターゲットにしているアプリに限り適用されます。targetSdkVersion を「android-Q」以降に設定しているアプリの場合、必要に応じてアプリを修正し、下記の動作変更に対して適切に対応する必要があります。

Android Q 上で稼働するすべてのアプリに影響する動作変更のリストについても必ずご確認ください。

非 SDK インターフェースに対する制限の更新

アプリの安定性と互換性を確保するため、Android 9(API レベル 28)から、アプリで使用できる非 SDK インターフェースが制限されています。Android Q では、Android デベロッパーの協力や最新の内部テストに基づいて、制限対象となる非 SDK インターフェースのリストが更新されています。

Android Q をターゲットにしているアプリでない場合、変更点によっては、すぐに影響が生じないこともあります。ただし、現時点ではグレーリストに記載されている非 SDK インターフェース(アプリの対象 API レベルによる)を利用できているとしても、そのまま非 SDK の手法やフィールドを使用し続けていると、将来的には高い確率でアプリが機能しなくなるおそれがあります。

アプリが非 SDK インターフェースを使用しているかどうか不明な場合は、アプリをテストして確認することができます。アプリが非 SDK インターフェースを使用している場合は、SDK インターフェースへの移行を計画するようにしてください。現在のアプリの機能に使用している非 SDK インターフェースの代替となる SDK インターフェースが見つからなった場合は、新しい公開 API をリクエストしてください。

詳細については、Android Q で更新された非 SDK インターフェースの制限非 SDK インターフェースの制限をご覧ください。

共有メモリ

ashmem は /proc/<pid>/maps 内の dalvik マップの形式を変更しました。マップファイルを直接解析するアプリが影響を受けます。アプリ デベロッパーは、デバイス上で新しい /proc/<pid>/maps 形式をテストし、アプリが dalvik マップ形式に依存している場合は、それに応じて解析する必要があります。

Android Q をターゲットにしているアプリは、直接 ashmem(/dev/ashmem)を使用することはできなくなりました。代わりに、NDK の ASharedMemory クラスを介して共有メモリにアクセスする必要があります。また、アプリが既存の ashmem ファイル記述子に直接 IOCTL を作成することはできません。代わりに、NDK の ASharedMemory クラスか Android Java API を使用して、共有メモリ領域を作成する必要があります。この変更により、共有メモリを使用する際のセキュリティと堅牢性が向上し、Android 全体のパフォーマンスとセキュリティが向上します。

Android ランタイムが受け入れるのはシステムが生成した OAT ファイルに限られる

Android ランタイム(ART)は、アプリプロセスから dex2oat を呼び出さなくなりました。この変更により、ART が受け入れるのは、システムが生成した OAT ファイルだけになります。

ART が行う AOT の正確性を強化

これまでは、Android ランタイム(ART)が事前(AOT)コンパイルを行う場合、コンパイル時と実行時でクラスパス環境が同じでないと、ランタイムがクラッシュする可能性がありました。Android Q では、この環境コンテキストが同じであることが常に要求されるようになり、その結果、次のように動作が変更されています。

  • カスタム クラスローダ(dalvik.system パッケージ内のクラスローダではなく、アプリによって作成されるクラスローダ)は、AOT コンパイルされていません。これは、実行時にクラス ルックアップ実装がカスタマイズされた場合に ART が認識できないためです。
  • セカンダリ dex ファイル(プライマリ APK 内にないアプリによって手動でロードされる dex ファイル)は、バックグラウンドで AOT コンパイルされるようになりました。これは、初回使用時にコンパイルするのは負荷が高く、実行前に不要な待ち時間が発生する可能性があるためです。アプリの場合は、分割を採用して、セカンダリ dex ファイルから切り離すことをおすすめします。
  • Android の共有ライブラリ(Android マニフェスト内の <library> エントリと <uses-library> エントリ)は、新しいクラスローダ階層で実装されるようになりました。

全画面表示インテントに関するアクセス権限の変更

Android Q 以降をターゲットにしているアプリが、全画面表示インテントを含む通知を使用する場合、アプリのマニフェスト ファイル内で USE_FULL_SCREEN_INTENT アクセス権限をリクエストする必要があります。これは Normal アクセス権限であり、リクエストしたアプリに自動で付与されます。

Android Q 以降をターゲットにしているアプリが、USE_FULL_SCREEN_INTENT アクセス権限をリクエストせずに全画面表示インテントを含む通知を作成しようとすると、全画面表示インテントは無視され、「Package [pkg]: Use of fullScreenIntent requires the USE_FULL_SCREEN_INTENT permission」というログメッセージが出力されます。