Android 9 へのアプリの移行

Android 9(API レベル 28)では、アプリで活用できる新しい機能と API が導入され、動作が変更されています。このドキュメントでは、アプリを Android 9 に移行する手順を 2 つの重要なフェーズに分けて概説します。

  1. Android 9 との基本的な互換性を確認する

    既存のアプリが新しいバージョンのプラットフォームで完全に機能することを確認します。この段階では、新しい API の使用やアプリの targetSdkVersion の変更は行いませんが、軽微な変更が必要になる場合があります。

  2. 新しいプラットフォームをターゲットとして、Android 9 SDK でコンパイルし、Android 9 の機能を使ってビルドする

    プラットフォームの新機能を活用する準備ができたら、targetSdkVersion28 に更新し、アプリが引き続き想定どおりに動作することを確認してから、新しい API の使用を開始します。

Android 9 を搭載するデバイスを準備する

互換性のあるデバイスをお持ちの場合は、メーカーからデバイス用の Android 9 システム イメージを入手してください。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 との互換性を確認する手順

互換性テストを実施する

Android 9 との互換性のテストの大部分は、アプリのリリース準備時に行うのと同じタイプのテストです。この段階で、アプリの中核品質ガイドラインテストのベスト プラクティスを確認することをおすすめします。

ただし、テストにはもう 1 つの側面があります。Android 9 では、Android プラットフォームに変更が加えられており、targetSdkVersion を変更しない場合でも、アプリの動作に影響したり、アプリが完全に機能しなくなったりするおそれがあります。このため、表 1 の主な変更点を確認し、その変更に対応するために実装する修正をテストすることが重要です。

表 1. Android 9 デバイスで実行されるすべてのアプリに影響する主な変更点。

変更 まとめ
非 SDK インターフェースの制限 特定の非 SDK インターフェースへのアクセスは、アクセスが直接、JNI、リフレクションのいずれであってもブロックされるようになりました。制限付きインターフェースにアクセスしようとすると、NoSuchFieldExceptionNoSuchMethodException などのエラーが発生します。詳しくは、非 SDK インターフェースの制限をご覧ください。
暗号プロバイダの削除 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 の機能を使用する手順

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 に、変更の一覧と詳細情報へのリンクを示します。

表 2. targetSdkVersion が 28 に設定されている場合にアプリに影響する主な変更点。

変更 まとめ
フォアグラウンド サービスの権限 フォアグラウンド サービスを使用するアプリは、最初に 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 をご覧ください。