Android 9(API レベル 28)では、アプリで活用できる新しい機能と API が導入されているほか、動作が変更されています。このドキュメントでは、アプリを Android 9 に移行する手順を 2 つの主要なフェーズに分けて概説します。
- Android 9 との基本的な互換性を確認する
既存のアプリが新しいバージョンのプラットフォームで完全に機能することを確認します。 この段階では、新しい API の使用やアプリの
targetSdkVersion
の変更は行いませんが、軽微な変更が必要になる場合があります。 - 新しいプラットフォームをターゲットに設定し、Android 9 SDK でコンパイルして、Android 9 の機能を使ってビルドする
プラットフォームの新機能を活用する準備ができたら、
targetSdkVersion
を28
に更新し、アプリが引き続き想定どおりに機能することを確認してから、新しい API の使用を開始します。
Android 9 搭載デバイスを準備する
対応デバイスをお持ちの場合は、メーカーからデバイス用の Android 9 システム イメージを入手してください。Google Pixel デバイス用のファクトリー イメージについては、こちらをクリックしてください。システム イメージを書き込む一般的な手順については、こちらをご覧ください。
Android Emulator 用の Android 9 システム イメージをダウンロードすることもできます。SDK Manager で [Android API 28] に [Google APIs Intel x86 Atom System Image] と表示されます。
注: Android 9 Emulator のシステム イメージは、Android Studio 3.1 以降でダウンロードできます。Android Studio 3.2 は最大互換性を提供します。 詳しくは、Android 9 SDK を入手するをご覧ください。
Android 9 との互換性を確認する
ここでの目標は、既存のアプリが Android 9 でそのまま動作することを確認することです。プラットフォームの変更がアプリの動作に影響する可能性があるため、調整が必要になる場合があります。ただし、新しい API の使用や targetSdkVersion
の変更は必要ありません。
互換性テストを実施する
Android 9 との互換性テストのほとんどは、アプリのリリース準備時と同じタイプのテストです。この段階で、アプリの中核品質ガイドラインとテストのベスト プラクティスを確認することをおすすめします。
ただし、テストにはもう 1 つの側面があります。Android 9 では、targetSdkVersion
を変更しない場合でも、アプリの動作に影響したり、アプリが完全に機能しなくなったりする可能性がある、Android プラットフォームの変更が導入されています。このため、表 1 の主な変更点を確認し、変更に対応するために実装する修正をテストすることが重要です。
変更 | 概要 |
---|---|
非 SDK インターフェースの制限 |
特定の非 SDK インターフェースへのアクセスは、直接、JNI、またはリフレクションのいずれを介したアクセスでもブロックされるようになりました。制限付きインターフェースにアクセスしようとすると、NoSuchFieldException や NoSuchMethodException などのエラーが生成されます。詳しくは、非 SDK インターフェースの制限をご覧ください。
|
Crypto プロバイダの削除 |
Android 9 以降、Crypto JCA プロバイダは削除されました。SecureRandom.getInstance("SHA1PRNG", "Crypto") を呼び出すと、NoSuchProviderException がスローされます。 |
より厳格な UTF-8 デコーダ | Android 9 では、Java 言語の UTF-8 デコーダがより厳格になり、Unicode 標準に準拠しています。 |
アイドル状態のアプリからのカメラ、マイク、センサーへのアクセスがブロックされる | アイドル状態のアプリは、カメラ、マイク、SensorManager センサーにアクセスできなくなります。 |
Android 9 で実行されるすべてのアプリに関わる動作変更の詳細なリストについては、動作の変更点のドキュメントをご覧ください。
ターゲット バージョンを更新して Android P の機能を使用する
このセクションでは、targetSdkVersion
を 28 に更新し、Android 9 で利用できる新機能を追加することで、Android 9 の完全なサポートを有効にする方法について説明します。
Android 9 では、新しい API の提供に加え、targetSdkVersion
を 28 に更新したときの動作変更が導入されています。動作変更によっては、互換性の問題を回避するためにコードの変更が必要になる場合があります。そのため、まず Android 9 をターゲットとするアプリに影響する動作変更をすべて確認して、targetSdkVersion
を変更した場合のアプリへの影響を把握する必要があります。
注: アプリの対象を Android 9 にするには、上記のプラットフォームの互換性を確認する手順が前提条件となりますので、先に完了するようにしてください。
Android 9 SDK を入手する
Android Studio 3.1 以降を使用して Android 9 でアプリをビルドするための SDK パッケージを入手できます。 Android 9 の新機能がまだ必要なく、そのバージョンのプラットフォームでコンパイルのみを行いたい場合は、Android Studio 3.1 を使用できます。 Android Studio 3.2 は、Android 9 の機能を完全にサポートしています。
Android 9 アプリをテストする
上記の準備が完了したら、アプリをビルドし、テストを行い、Android 9(API レベル 28)をターゲットとする場合に適切に動作することを確認します。この機会に、アプリの中核品質ガイドラインとテストに関するベスト プラクティスも確認することをおすすめします。
targetSdkVersion
を P に設定してアプリをビルドする場合、特定のプラットフォームの変更点に注意する必要があります。こうした変更の一部は、Android 9 で新機能を実装しない場合でも、アプリの動作に重大な影響を及ぼしたり、アプリ自体に障害が発生したりする可能性があります。
表 2 に、変更点の一覧と詳細情報へのリンクを示します。
変更 | 概要 |
---|---|
フォアグラウンド サービスの権限 | フォアグラウンド サービスを使用するアプリは、最初に FOREGROUND_SERVICE 権限をリクエストする必要があります。これは通常の権限であるため、システムはリクエスト元のアプリに自動的に付与します。権限なしでフォアグラウンド サービスを開始すると、SecurityException がスローされます。 |
Bouncy Castle 暗号のサポート終了 |
Android 9 では、Conscrypt プロバイダが提供する暗号を優先して、Bouncy Castle プロバイダの暗号のサポートが終了しました。Bouncy Castle プロバイダをリクエストする getInstance() の呼び出しでは、NoSuchAlgorithmException エラーが発生します。エラーを解決するには、getInstance() でプロバイダを指定しないでください(つまり、デフォルト実装をリクエストします)。 |
Build.serial への直接アクセスを削除
|
Build.serial 識別子を必要とするアプリは、READ_PHONE_STATE 権限をリクエストしてから、Android 9 で追加された新しい Build.getSerial() メソッドを使用する必要があります。
|
WebView データ ディレクトリの共有の禁止 | アプリは、単一の WebView データ ディレクトリをプロセス間で共有できなくなりました。android.webkit パッケージ内の WebView、CookieManager、またはその他の API を使用するプロセスが複数存在する場合、2 番目のプロセスが WebView メソッドを呼び出すと、アプリがクラッシュします。 |
アプリのデータ ディレクトリへのアクセスが SELinux によってブロックされる | システムは、アプリごとの SELinux 制限を持つアプリごとの SELinux サンドボックスを、各アプリの個人データ ディレクトリに強制します。別のアプリのデータ ディレクトリにパスで直接アクセスすることはできなくなりました。アプリは引き続き、FD を渡すなど、IPC メカニズムを使用してデータを共有できます。 |
Android 9 をターゲットとするアプリの動作変更の詳細なリストについては、動作の変更点のドキュメントをご覧ください。
Android 9 で利用できる新しい機能と API については、Android 9 の機能と API をご覧ください。