Android 8.0 へのアプリの移行

Android 8.0 では、複数の新機能と API が導入されています。また、何も変更しない場合でも、既存のアプリの動作に影響を与える可能性のある変更点も含まれています。このページでは、移行をサポートするために、互換性テストの実行方法と、アプリをアップデートして Android 8.0 の新機能を使用する方法について説明します。

  1. プラットフォーム互換性を確認する

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

  2. Android 8.0 SDK を使用してアプリをビルドする

    プラットフォームの新機能を利用する準備ができたら、targetSdkVersion を「O」にアップデートし、アプリが引き続き予測どおりに動作していることを確認してから、新規 API の使用を開始します。

プラットフォーム互換性を確認する

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

Android 8.0 を実行する端末を準備する

  • 互換性のある端末(Pixel、Pixel XL、Pixel C、Nexus 5X、Nexus 6P、Nexus Player など)を用意したら、ダウンロード ページから端末用の Android 8.0 システム イメージを入手し、端末への書き込み手順を実行します。
  • あるいは Android Emulator 用の Android 8.0 システム イメージをダウンロードします。システム イメージは、[Android 8.0 Preview] の下の SDK Manager に [Google APIs Intel x86 Atom System Image] としてリストされています。

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

互換性テストを実行する

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

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

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

変更 概要 詳細情報
バックグラウンドでの位置情報アップデートの頻度が低下する アプリがバックグラウンド サービスから位置情報のアップデートを受信する場合、Android 8.0 では、旧バージョンの Android と比較して、アップデートを受信する頻度が低くなっています。特に、バックグラウンド サービスが位置情報のアップデートを受信できるのは 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 での動作の変更点について詳しくは、Android 8.0 での動作変更点もご覧ください。

Android 8.0 の機能を使用してアプリをビルドする

Android 8.0 では新規 API が提供されるだけでなく、表 2 に示すように、targetSdkVersion をアップデートすると他の動作に変更が発生します。ここでは新しいプラットフォームを対象とする開発環境をセットアップする方法と、Android 8.0 API を使用して変更点と新機能をビルドし、テストする方法について説明します。

注: 先に記載したプラットフォーム互換性を確認するための手順は、Android 8.0 のビルドの前提条件となりますので、まずこの手順を完了しておくようにしてください。

Android 8.0 SDK を取得する

  1. Android Studio 3.0 Canary をインストールします。

    Android 8.0 で利用できるすべての新しいデベロッパー機能をサポートするのは Android Studio 3.0 のみです。したがって、Android Studio 3.0 の Canary バージョンを入手してから、Android 8.0 SDK の使用を開始してください。Android Studio の安定バージョンをそのままインストールしておいてもかまいません。

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

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

ビルド設定をアップデートする

compileSdkVersionbuildToolsVersiontargetSdkVersion、Support Library を次のバージョンにアップデートします。

android {
  compileSdkVersion 'android-O'
  buildToolsVersion '26.0.0-rc2'

  defaultConfig {
    targetSdkVersion 'O'
  }
  ...
}

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

// REQUIRED: Google's new Maven repo is required for the latest
// support library that is compatible with Android 8.0
repositories {
    maven {
        url 'https://maven.google.com'
    }
}

この設定のアプリを公開することはできません。「O」バージョンは、Android 8.0 期間中の開発とテストのみで利用可能な一時的な API レベルです。Android 8.0 での変更の公開は、API の最終レベルがリリースされるまでお待ちください。リリース後、設定をもう一度アップデートしてください。

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

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

既存のアプリだけが応答できる明示的なブロードキャスト インテントは、Android 8.0 でも引き続き同じように動作します。

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

Android 8.0 アプリをテストする

上記の準備が完了したら、アプリをビルドし、テストを重ねて、Android 8.0 を対象とするアプリが適切に動作するようにします。ここで、アプリの中核品質に関するガイドラインテストのベスト プラクティスをもう一度確認することをお勧めします。

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

表 2 にこれらの変更点の一覧と詳細情報へのリンクを示しています。

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

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

Android 8.0 での動作の変更点について詳しくは、Android 8.0 での動作変更点をご覧ください。

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