Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

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 9] の下に [Google APIs Intel x86 Atom System Image] として表示されます。

注:Android 9 エミュレータのシステム イメージは Android Studio 3.1 以降でダウンロード可能であり、Android Studio 3.2 で最も互換性が高くなります。詳細については、Android 9 の SDK を入手するをご覧ください。

Android 9 との互換性を確かめる

ここでの目的は、既存のアプリが Android 9 でそのまま動作することを確かめることです。一部のプラットフォームの変更がアプリの動作に影響を与える可能性があるため、調整が必要なことがありますが、新規 API を使用したり、targetSdkVersion を変更したりする必要はありません。

互換性テストを実行する

Android 9 との互換性テストの大半の部分は、アプリのリリースに向けたテストと同じタイプのテストです。よって、このタイミングでアプリの中核部分の品質ガイドラインテストのベスト プラクティスを確認することをお勧めします。

ただし、テストには別の目的もあります。Android 9 では、targetSdkVersion を変更しなくても、アプリの動作に影響を与える、またはアプリがまったく機能しなくなる可能性のある、Android プラットフォームへの変更が導入されています。そのため、表 1 に示す主な変更点を確認し、この変更に対処するために実装した修正内容をテストすることが重要になります。

表 1. Android 9 端末で実行されるすべてのアプリに影響を与える主な変更点

変更 概要
非 SDK インターフェースの制限 特定の非 SDK インターフェースへのアクセスは、直接的なアクセスであれ、JNI またはリフレクション経由のアクセスであれ、今後はブロックされます。制限されたインターフェースにアクセスを試みると、NoSuchFieldExceptionNoSuchMethodException などのエラーが発生します。詳細については、非 SDK インターフェースの制限をご覧ください。
Crypto プロバイダの廃止 Android 9 より、Crypto JCA プロバイダは削除されました。以後、SecureRandom.getInstance("SHA1PRNG", "Crypto") を呼び出すと、NoSuchProviderException がスローされます。
より厳密な UTF-8 デコーダ Android 9 より、Java 向けの UTF-8 デコーダがさらに厳密になり、Unicode 標準に準拠するようになります。
アイドル状態のアプリによるカメラ、マイク、センサーへのアクセスを禁止 アイドル状態のアプリは、カメラ、マイク、SensorManager センサーにアクセスできなくなりました。

Android 9 で動作するすべてのアプリに関わる動作変更の詳細については、動作の変更点のドキュメントをご覧ください。

ターゲット バージョンを更新して Android P の機能を使用する

このセクションでは、Android 9 を完全にサポートするために、targetSdkVersion を 28 に変更し、Android 9 で利用可能な新機能を追加する方法について説明します。

Android 9 には、新しい API の追加に加えて、targetSdkVersion を 28 にアップデートした際に有効になる動作変更が含まれています。一部の変更によってアプリが機能しなくなるのを防ぐため、コードの変更が必要な場合があります。よって、最初に Android 9 を対象とするアプリに関わる動作の変更点を確認して、targetSdkVersion を変更した際のアプリへの影響を把握してください。

注:アプリが Android 9 を対象とするには、上記の「プラットフォームの互換性を確かめる」のセクションで説明した手順を踏んでいることが条件となりますので、先にそちらの作業を完了してください。

Android 9 SDK の入手

SDK パッケージを入手すると、Android Studio 3.1 またはそれ以降のバージョンを使用して Android 9 でアプリをビルドできます。Android 9 の新機能がまだ必要なく、単に既存バージョンを 9 のプラットフォームでコンパイルするだけの場合は、Android Studio 3.1 を使用できます。Android Studio 3.2 は Android 9 の機能を完全にサポートしています。

いずれかのバージョンの Android Studio をセットアップするには、Preview SDK のセットアップに記載されているステップに従ってください。

Android 9 アプリのテスト

上記の準備が完了したら、アプリをビルドしてテストを進め、Android 9 (API レベル 28)を対象とした場合に、アプリが正しく動作するかを確認します。このタイミングでもアプリの中核品質ガイドラインテストのベスト プラクティスを確認することをお勧めします。

targetSdkVersion を P に設定してアプリをビルドする場合、特定のプラットフォームの変更点に注意する必要があります。Android 9 の新機能を実装していない場合でも、一部の変更点のためにアプリの動作に影響が出る、またはアプリがまったく機能しなくなる可能性があります。

表 2 にそのような変更点の一覧と詳細情報へのリンクを示します。

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

変更 概要
フォアグラウンド サービスのパーミッション フォアグラウンド サービスを使用する必要があるアプリは、まず FOREGROUND_SERVICE パーミッションをリクエストする必要があります。これは Normal パーミッションなので、リクエストしたアプリに自動で付与されます。このパーミッションがない状態でフォアグラウンド サービスを開始すると、SecurityException がスローされます。
Bouncy Castle 暗号のサポートの終了 Android 9 では Conscrypt プロバイダの暗号を優先的に使用するため、Bouncy Castle プロバイダの一部の暗号のサポートを終了します。getInstance() を呼び出して Bouncy Castle プロバイダをリクエストすると、NoSuchAlgorithmException エラーが発生します。このエラーを回避するには、特定のプロバイダを指定せずに getInstance() を呼び出します(このようにすると、デフォルト実装のプロバイダがリクエストされます)。
Build.serial への直接アクセスの廃止 Build.SERIAL 識別子が必要なアプリは、READ_PHONE_STATE パーミッションをリクエストしてから、Android 9 で新たに追加された Build.getSerial() メソッドを使用することが必要になりました。
WebView データ ディレクトリの共有禁止 以後、アプリは単一の WebView データ ディレクトリを複数のプロセスで共有できません。WebView、CookieManager、その他の android.webkit パッケージの API を使用するプロセスが複数ある場合は、2 つ目のプロセスが WebView メソッドを呼び出した際にアプリがクラッシュします。
SELinux がアプリのデータディレクトリへのアクセスをブロック 各アプリのプライベート データ ディレクトリに対して、アプリ単位の SELinux 制限がついたアプリ単位の SELinux サンドボックスが適用されます。別のアプリのデータ ディレクトリへのパス指定による直接アクセスは、禁止されます。ファイル記述子を渡すなどの IPC メカニズムを使用してアプリでデータを共有することは、引き続き可能です。

Android 9 を対象とするアプリに関わる動作の変更点の全容については、動作の変更点のドキュメントをご覧ください。

Android 9 で利用可能な新しい機能と API の詳細については、Android 9 の機能と API をご覧ください。