Android 8.0 への移行

Android 8.0(API レベル 26)では、一部の動作が変更され、新しい機能やアプリで利用可能な API が追加されています。このドキュメントでは、アプリを Android 8.0 に移行する手順の概要を、次の 2 つのフェーズに分けて説明します。

  1. Android 8.0 との互換性を確認する

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

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

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

Android 8.0 との互換性を確認する

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

Android 8.0 との互換性を確認する

Android 8.0 を実行するデバイスを準備する

  • 互換性のあるデバイス(Google Pixel、Google Pixel XL、Google Pixel C、Nexus 5X、Nexus 6P、Nexus Player)をお持ちの場合は、デバイスに書き込む手順に沿って操作します。
  • または、Android Emulator 用の Android 8.0 システム イメージをダウンロードします。SDK Manager の [Android 8.0] に [Google APIs Intel x86 Atom System Image] として表示されます。

    注: Android 8.0 システム イメージは、Android Studio 3.0 以降からダウンロードできます。詳細については、下記の Android 8.0 SDK を取得するをご覧ください。

互換性テストを実施する

Android 8.0(API レベル 26)との互換性テストの大半は、アプリのリリースに向けたテストと同じタイプのテストです。この機会に、アプリの中核品質ガイドラインテストのおすすめの方法をもう一度確認することをおすすめします。

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

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

変更 概要 その他のリファレンス
バックグラウンドでの位置情報の更新頻度が下がる アプリがバックグラウンド サービスから位置情報の更新を受信する場合、古いバージョンの Android と比較して、Android 8.0(API レベル 26)では、受信する頻度が少なくなります。特に、バックグラウンド サービスが位置情報のアップデートを受信できるのは 1 時間に数回までです。ただし、アプリがフォアグラウンドにある間は、位置情報の更新頻度は変わりません。 バックグラウンドでの位置情報の制限
net.hostname はサポートされなくなりました net.hostname システム プロパティのクエリ結果は null になります。 なし
send(DatagramPacket) からの新しい例外 以前に実行された connect(InetAddress, int) メソッドが失敗した場合、send(DatagramPacket) メソッドは SocketException をスローします。 動作変更: ネットワークと HTTP(S) 接続
AbstractCollection メソッドからの適切な NullPointerException AbstractCollection.removeAll(null)AbstractCollection.retainAll(null) は、常に NullPointerException をスローするようになりました。これまでは、コレクションが空の場合に NullPointerException はスローされませんでした。この変更により、実際の動作がドキュメントと一致するようになります。 動作変更: コレクションの処理
Currency.getDisplayName(null) からの適切な NullPointerException Currency.getDisplayName(null) を呼び出すと、NullPointerException がスローされます。 動作の変更: 言語 / 地域と国際化

Android 8.0(API レベル 26)での動作の変更点について詳しくは、Android 8.0 での動作の変更点もご覧ください。

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

このセクションでは、targetSdkVersion を 26 に更新し、Android 8.0 で利用可能な新機能を追加することにより、Android 8.0(API レベル 26)の完全なサポートを有効にする方法について説明します。

Android 8.0 では、新しい API に加えて、targetSdkVersion を 26 に更新した際に有効になる動作の変更が導入されています。一部の動作変更によるアプリの障害を防ぐため、コードの変更が必要になる場合があります。それにはまず、Android 8.0 をターゲットとするアプリに影響する動作変更をすべて確認して、targetSdkVersion を変更する際のアプリへの影響を把握してください。

注: アプリで Android 8.0 をターゲットとするには、上記の プラットフォームの互換性を確保するための手順を完了していることが条件となるので、先にその手順を完了してください。

ターゲット バージョンを更新して Android 8.0 の機能を利用する手順

Android 8.0 SDK を入手する

Android 8.0(API レベル 26)でアプリをビルドするための SDK パッケージは、最新バージョンの Android Studio を使用して入手できます(Android Studio 3.0 以降をおすすめします)。Android Studio 3.0 以降には、アダプティブ アイコンダウンロード可能なフォントなど、Android 8.0 の機能に役立つツールが含まれています。これらの機能がまだ必要ない場合は、安定版の Android Studio 2.3.3 を使用して Android 8.0 でアプリをビルドし、新しい API を使用できます。

いずれかのバージョンの Android Studio をセットアップする手順は次のとおりです。

  1. Android Studio を起動し、[Tools] > [SDK Manager] をクリックして SDK Manager を開きます。
  2. [SDK Platforms] タブで、[Show Package Details] をオンにします。[Android 8.0 Preview] で次の項目を選択します。
    • Android SDK Platform 26
    • Google APIs Intel x86 Atom System Image(エミュレータでのみ必須)
  3. [SDK Tools] タブに切り替え、利用可能なアップデートがあるすべての項目を選択します(ダッシュ が表示されているチェックボックスごとにクリックします)。これには、次の必須項目の最新バージョンが含まれる必要があります。
    • Android SDK Build-Tools 26.0.0
    • Android SDK Platform-Tools 26.0.0
    • Android Emulator 26.0.0
  4. [OK] をクリックして、選択したすべての SDK パッケージをインストールします。

これで、Android 8.0 を使用した開発を開始できるようになりました。

ビルド構成を更新する

compileSdkVersiontargetSdkVersion、サポート ライブラリのバージョンを、利用可能な最新のリビジョンに更新します。次に例を示します。

android {
  compileSdkVersion 26

  defaultConfig {
    targetSdkVersion 26
  }
  ...
}

dependencies {
  compile 'com.android.support:appcompat-v7:26.0.0'
}

// REQUIRED: Google's new Maven repo is required for the latest
// support library that is compatible with Android 8.0
repositories {
    google()

    // If you're using a version of Gradle lower than 4.1, you must instead use:
    // maven {
    //     url 'https://maven.google.com'
    // }
}

マニフェスト ファイルからブロードキャスト レシーバを削除する

Android 8.0(API レベル 26)ではブロードキャスト レシーバーに対する制限が新たに導入されるため、暗黙的なブロードキャスト インテントに対して登録されているブロードキャスト レシーバーをすべて削除する必要があります。そのままにしても、ビルド時または実行時にアプリが破損することはありませんが、Android 8.0 で実行されるアプリには影響しません。

自分のアプリだけが応答できるブロードキャスト(明示的なブロードキャスト インテントと、アプリのパッケージ名のみに送信されるブロードキャスト)は、Android 8.0 でも引き続き同じように機能します。

この新しい制限には例外があります。Android 8.0 を対象とするアプリで引き続き動作する暗黙的なブロードキャストの一覧については、暗黙的なブロードキャストの例外をご覧ください。

Android 8.0 アプリをテストする

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

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

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

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

変更 概要 その他のリファレンス
プライバシー Android 8.0(API レベル 26)は、システム プロパティ net.dns1、net.dns2、net.dns3、net.dns4 の使用をサポートしていません。 動作の変更: プライバシー
書き込みおよび実行が可能なセグメントの適用 Android 8.0(API レベル 26)では、ネイティブ ライブラリに対し、データの実行とコードの書き込みを禁止するルールが適用されます。 動作の変更点: ネイティブ ライブラリ
ELF ヘッダーとセクションの検証 ダイナミック リンカーは、ELF ヘッダーとセクション ヘッダーの他の値もチェックし、それらの値が無効な場合は失敗します。 動作の変更: ネイティブ ライブラリ
通知 Android 8.0(API レベル 26)バージョンの SDK をターゲットとするアプリでは、ユーザーに通知を投稿するために、1 つ以上の通知チャンネルを実装する必要があります。 API の概要: 通知
List.sort() メソッド このメソッドの実装で Collections.sort() が呼び出されなくなるか、アプリがスタック オーバーフローのために例外をスローします。 動作の変更: コレクションの処理
Collections.sort() メソッド List 実装で、Collections.sort()ConcurrentModificationException をスローするようになりました。 動作の変更: コレクションの処理

Android 8.0(API レベル 26)での動作変更の詳細なリストについては、Android 8.0 の動作の変更点をご覧ください。

Android 8.0(API レベル 26)で利用可能な新機能と API の詳細については、Android 8.0 の機能と API をご覧ください。