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 を搭載したデバイスを準備する

  • 対応デバイス(Pixel、Pixel XL、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)との互換性テストでは、アプリのリリース準備時と同じタイプのテストを行います。この段階で、アプリの中核品質ガイドラインテストのベスト プラクティスを確認することをおすすめします。

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

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

変更 概要 その他のリファレンス
バックグラウンドでの位置情報の更新頻度を下げる アプリがバックグラウンド サービスから位置情報の更新を受信する場合、Android 8.0(API レベル 26)では、古いバージョンの Android と比較して、受信する更新の頻度が低くなります。具体的には、バックグラウンド サービスが位置情報の更新データを受信できるのは 1 時間に数回までです。ただし、アプリがフォアグラウンドにある間は、位置情報の更新レートは変更されません。 バックグラウンドでの位置情報の制限
net.hostname のサポートは終了しました net.hostname システム プロパティのクエリを実行すると、結果が null になります。 なし
send(DatagramPacket) からの新しい例外 send(DatagramPacket) メソッドは、以前に実行された connect(InetAddress, int) メソッドが失敗した場合、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 を入手する

SDK パッケージを入手し、最新バージョンの Android Studio(Android Studio 3.0 以降を推奨)を使用して Android 8.0(API レベル 26)でアプリをビルドできます。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 プレビュー] で以下のことを確認します。
    • 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 をご覧ください。