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 では Android プラットフォームに変更が加えられており、targetSdkVersion を変更していなくてもアプリの動作に影響したり、アプリが完全に機能しなくなったりするおそれがあります。このため、表 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 API 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() メソッド リスト実装で、Collections.sort()ConcurrentModificationException をスローするようになりました。 動作の変更: コレクションの処理

Android 8.0(API レベル 26)で行われた動作変更の詳細については、Android 8.0 での動作の変更点をご覧ください。

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