Android 6.0 の変更点

Android 6.0(API レベル 23)には、新機能のほか、さまざまなシステム変更と API の動作変更が含まれています。このドキュメントでは、アプリで把握して考慮すべき主な変更点について説明します。

以前に Android 向けのアプリを公開したことがある場合は、こうしたプラットフォームの変更がアプリに影響することに留意してください。

実行時の権限

このリリースでは、新しい権限モデルが導入され、ユーザーが実行時にアプリの権限を直接管理できるようになりました。このモデルにより、ユーザーによる権限の可視性と管理性が向上し、アプリ デベロッパーはインストールと自動更新のプロセスが合理化されます。ユーザーは、インストール済みのアプリに対して権限を個別に付与または取り消すことができます。

Android 6.0(API レベル 23)以降をターゲットとするアプリでは、必ず実行時に権限を確認してリクエストしてください。アプリに権限が付与されているかどうかを確認するには、新しい checkSelfPermission() メソッドを呼び出します。権限をリクエストするには、新しい requestPermissions() メソッドを呼び出します。アプリが Android 6.0(API レベル 23)をターゲットとしていない場合でも、新しい権限モデルでアプリをテストする必要があります。

アプリで新しい権限モデルをサポートする方法については、 システム権限の操作をご覧ください。アプリへの影響を評価する方法については、権限の使用に関する注意事項をご覧ください。

Doze とアプリ スタンバイ

このリリースでは、アイドル状態のデバイスとアプリに対する新しい省電力の最適化機能が導入されています。これらの機能はすべてのアプリに影響するため、これらの新しいモードでアプリをテストしてください。

  • Doze: ユーザーがデバイスを電源から外し、画面がオフの状態で一定の時間静止させると、デバイスは Doze モードになり、システムのスリープ状態を維持しようとします。このモードでは、デバイスは定期的に通常の動作を短期間、再開するため、アプリの同期が行われ、システムは保留中の処理を実行できます。
  • アプリ スタンバイ: アプリ スタンバイにより、システムは、ユーザーがアプリをアクティブに使用していないときに、アプリがアイドル状態であると判断できます。この判断は、ユーザーが一定時間アプリに触れないと行われます。デバイスが電源から外されると、システムはネットワーク アクセスを無効にし、アイドル状態と見なしたアプリの同期とジョブを一時停止します。

省電力に関するこれらの変更の詳細については、Doze とアプリ スタンバイの最適化をご覧ください。

Apache HTTP クライアントの削除

Android 6.0 リリースでは、Apache HTTP クライアントのサポートが削除されました。アプリがこのクライアントを使用していて、Android 2.3(API レベル 9)以降をターゲットとしている場合は、代わりに HttpURLConnection クラスを使用します。この API は透過的な圧縮とレスポンスのキャッシュによってネットワーク使用量を削減し、消費電力を最小限に抑えるため、より効率的です。Apache HTTP API を引き続き使用するには、まず build.gradle ファイルで次のコンパイル時依存関係を宣言する必要があります。

android {
    useLibrary 'org.apache.http.legacy'
}

BoringSSL

Android は、OpenSSL から BoringSSL ライブラリに移行しています。アプリで Android NDK を使用している場合は、NDK API の一部ではない暗号ライブラリ(libcrypto.solibssl.so など)にリンクしないでください。これらのライブラリは公開 API ではなく、リリースやデバイス間で予告なく変更または破損する可能性があります。 また、セキュリティの脆弱性にさらされる可能性もあります。代わりに、ネイティブ コードを変更して、JNI 経由で Java 暗号 API を呼び出すか、任意の暗号ライブラリに静的にリンクします。

ハードウェア ID へのアクセス

ユーザーのデータ保護を強化するため、このリリース以降、Android は Wi-Fi API と Bluetooth API を使用したアプリによる、デバイスのローカル ハードウェア識別子へのプログラムによるアクセスを削除します。WifiInfo.getMacAddress() メソッドと BluetoothAdapter.getAddress() メソッドが定数値 02:00:00:00:00:00 を返すようになりました。

Bluetooth や Wi-Fi のスキャンを介して付近の外部デバイスのハードウェア ID にアクセスするには、アプリに ACCESS_FINE_LOCATION 権限または ACCESS_COARSE_LOCATION 権限が付与されている必要があります。

: Android 6.0(API レベル 23)を搭載したデバイスがバックグラウンドで Wi-Fi スキャンまたは Bluetooth スキャンを開始すると、そのオペレーションはランダム化された MAC アドレスから発生したものとして外部デバイスに表示されます。

通知

このリリースでは、Notification.setLatestEventInfo() メソッドを削除しました。代わりに Notification.Builder クラスを使用して通知を作成してください。通知を繰り返し更新するには、Notification.Builder インスタンスを再利用します。build() メソッドを呼び出して、更新された Notification インスタンスを取得します。

adb shell dumpsys notification コマンドは通知テキストを出力しなくなりました。通知オブジェクトのテキストを出力するには、代わりに adb shell dumpsys notification --noredact コマンドを使用します。

AudioManager の変更

AudioManager クラスで音量を直接設定することや、特定のストリームをミュートすることは、サポートされなくなりました。setStreamSolo() メソッドは非推奨となったため、代わりに requestAudioFocus() メソッドを呼び出す必要があります。同様に、setStreamMute() メソッドのサポートは終了しています。代わりに adjustStreamVolume() メソッドを呼び出して、方向値 ADJUST_MUTE または ADJUST_UNMUTE を渡します。

テキストの選択

フローティング ツールバー内に新しいテキスト選択機能を表示する画面

ユーザーがアプリでテキストを選択したときに、フローティング ツールバーに、切り取りコピー貼り付けなどのテキスト選択アクションを表示できるようになりました。ユーザー操作の実装は、 個々のビューに対してコンテキスト アクション モードを有効にするで説明されているように、コンテキスト アクションバーの実装に似ています。

テキスト選択用のフローティング ツールバーを実装するには、既存のアプリに次の変更を加えます。

  1. View オブジェクトまたは Activity オブジェクトで、ActionMode 呼び出しを startActionMode(Callback) から startActionMode(Callback, ActionMode.TYPE_FLOATING) に変更します。
  2. ActionMode.Callback の既存の実装を使用して、ActionMode.Callback2 を拡張します。
  3. onGetContentRect() メソッドをオーバーライドして、ビュー内のコンテンツ Rect オブジェクト(テキスト選択の長方形など)の座標を指定します。
  4. 長方形の配置が無効になり、これが唯一の要素で無効になる場合は、invalidateContentRect() メソッドを呼び出します。

Android サポート ライブラリのリビジョン 22.2 を使用している場合は、フローティング ツールバーには下位互換性がなく、デフォルトでは appcompat が ActionMode オブジェクトを制御することに注意してください。これにより、フローティング ツールバーが表示されなくなります。AppCompatActivityActionMode のサポートを有効にするには、getDelegate() を呼び出し、返された AppCompatDelegate オブジェクトで setHandleNativeActionModesEnabled() を呼び出し、入力パラメータを false に設定します。この呼び出しにより、ActionMode オブジェクトの制御がフレームワークに返されます。Android 6.0(API レベル 23)を搭載したデバイスでは、フレームワークで ActionBar またはフローティング ツールバー モードをサポートできますが、Android 5.1(API レベル 22)以前を搭載したデバイスでは ActionBar モードのみがサポートされます。

ブラウザのブックマークの変更

このリリースで、グローバル ブックマークのサポートが削除されました。android.provider.Browser.getAllBookmarks() メソッドと android.provider.Browser.saveBookmark() メソッドが削除されました。同様に、READ_HISTORY_BOOKMARKS 権限と WRITE_HISTORY_BOOKMARKS 権限も削除されます。アプリが Android 6.0(API レベル 23)以降をターゲットとしている場合は、グローバル プロバイダからブックマークにアクセスしたり、ブックマーク権限を使用したりしないでください。代わりに、アプリはブックマーク データを内部に保存する必要があります。

Android Keystore の変更

このリリースで、Android Keystore プロバイダは DSA をサポートしなくなりました。ECDSA は引き続きサポートされます。

保存データの暗号化を必要としない鍵は、セキュアロック画面を(ユーザーやデバイスの管理者などによって)無効にまたはリセットしても、削除されなくなります。保存データの暗号化を必要とする鍵は、これらのイベント中に削除されます。

Wi-Fi とネットワークの変更

このリリースでは、Wi-Fi API とネットワーク API の動作が次のように変更されます。

  • これで、WifiConfiguration オブジェクトを自分で作成した場合にのみ、アプリでそのオブジェクトの状態を変更できるようになりました。ユーザーまたは他のアプリによって作成された WifiConfiguration オブジェクトの変更または削除は許可されません。
  • 以前は、アプリが disableAllOthers=true 設定で enableNetwork() を使用してデバイスを特定の Wi-Fi ネットワークに接続すると、デバイスはモバイルデータなどの他のネットワークから切断されていました。このリリースでは、デバイスがそのような他のネットワークから切断されることがなくなりました。アプリの targetSdkVersion“20” 以下の場合、選択した Wi-Fi ネットワークに固定されています。アプリの targetSdkVersion“21” 以上の場合は、マルチネットワーク API(openConnection()bindSocket()、新しい bindProcessToNetwork() メソッドなど)を使用して、選択したネットワークにネットワーク トラフィックが送信されるようにします。

カメラサービスの変更

このリリースでは、カメラサービスの共有リソースにアクセスするためのモデルが、以前の「先着順」のアクセスモデルから、優先度の高いプロセスを優先するアクセスモデルに変更されました。サービスの動作の変更点は次のとおりです。

  • カメラデバイスを開いて設定することなど、カメラのサブシステム リソースへのアクセスは、クライアント アプリ プロセスの「優先度」に基づいて付与されます。一般的に、ユーザーが認識できるアクティビティやフォアグラウンドでのアクティビティを含むアプリ プロセスの優先度は高く、カメラリソースの取得と使用の信頼性が高まります。
  • 優先度の低いアプリのアクティブなカメラ クライアントは、優先度の高いアプリがカメラを使用しようとしたときに「強制排除」されることがあります。非推奨の Camera API では、これにより強制排除されたクライアントに対して onError() が呼び出されます。これにより、Camera2 API では、強制排除されたクライアントに対して onDisconnected() が呼び出されます。
  • 適切なカメラ ハードウェアを備えたデバイスでは、個別のアプリプロセスを個別に開いて、別々のカメラデバイスを同時に使用できます。ただし、同時アクセスにより開いているカメラデバイスのパフォーマンスや機能が大幅に低下するマルチプロセスのユースケースは、カメラサービスで検出され、許可されなくなりました。この変更により、同じカメラデバイスに直接アクセスするアプリが他にない場合でも、優先度の低いクライアントで「エビクション」が発生する可能性があります。
  • 現在のユーザーを変更すると、以前のユーザー アカウントが所有していたアプリ内のアクティブなカメラ クライアントが削除されます。カメラへのアクセスは、現在のデバイス ユーザーが所有するユーザー プロファイルに限定されます。 つまり、たとえば「ゲスト」アカウントでは、ユーザーが別のアカウントに切り替えたときに、カメラ サブシステムを使用するプロセスを実行したままにすることはできません。

ランタイム

ART ランタイムで newInstance() メソッドのアクセスルールが適切に実装されるようになりました。この変更により、以前のバージョンで Dalvik がアクセスルールを間違ってチェックしていた問題が修正されました。アプリで newInstance() メソッドを使用しているときに、アクセス チェックをオーバーライドする場合は、入力パラメータを true に設定して setAccessible() メソッドを呼び出します。アプリで v7 appcompat ライブラリまたは v7 recyclerview ライブラリを使用している場合は、これらのライブラリの最新バージョンを使用するようアプリを更新する必要があります。それ以外の場合は、XML から参照されるカスタムクラスを更新して、クラス コンストラクタにアクセスできるようにしてください。

このリリースでは、ダイナミック リンカーの動作が更新されました。ダイナミック リンカーがライブラリの soname とそのパスの違いを認識するようになり( 公開バグ 6670)、soname による検索が実装されました。以前は動作していたが、不正な DT_NEEDED エントリ(通常はビルドマシンのファイル システムの絶対パス)があるアプリは、読み込み時に失敗することがあります。

dlopen(3) RTLD_LOCAL フラグが正しく実装されました。なお、RTLD_LOCAL はデフォルトであり、RTLD_LOCAL を明示的に使用しなかった dlopen(3) の呼び出しは影響を受けます(アプリが RTLD_GLOBAL を明示的に使用した場合を除く)。RTLD_LOCAL により、後で dlopen(3) の呼び出しで読み込まれたライブラリでは、シンボルが利用できなくなります(DT_NEEDED エントリによって参照されるわけではありません)。

以前のバージョンの Android では、アプリがテキストの再配置を使用して共有ライブラリを読み込むようにシステムにリクエストすると、システムは警告を表示しましたが、ライブラリの読み込みは許可していました。このリリース以降、アプリのターゲット SDK バージョンが 23 以降の場合、このライブラリはシステムによって拒否されます。ライブラリの読み込みに失敗したかどうかを検出するには、アプリで dlopen(3) エラーをログに記録し、dlerror(3) 呼び出しから返される問題の説明テキストを含める必要があります。テキストの再配置の処理の詳細については、こちらのガイドをご覧ください。

APK の検証

プラットフォームでの APK の検証がより厳格に行われるようになりました。APK がマニフェストで宣言されているファイルが APK 自体に含まれていない場合、APK が破損していると判断されます。コンテンツが削除された場合は、APK を再署名する必要があります。

USB 接続

USB ポート経由でのデバイス接続がデフォルトで充電専用モードに設定されました。USB 接続を介してデバイスとそのコンテンツにアクセスするには、ユーザーがそのような操作に対して明示的に権限を付与する必要があります。アプリが USB ポートを介したデバイス操作をサポートしている場合は、その操作を明示的に有効にする必要がある点を考慮してください。

Android for Work の変更点

このリリースには、Android for Work で以下の動作変更が含まれます。

  • 個人的な状況での仕事用の連絡先。ユーザーが過去の通話を表示したときに、Google 電話アプリの通話履歴に仕事用の連絡先が表示されるようになりました。setCrossProfileCallerIdDisabled()true に設定すると、仕事用プロファイルの連絡先が Google 電話アプリの通話履歴に表示されなくなります。setBluetoothContactSharingDisabled()false に設定した場合のみ、仕事用の連絡先を個人用の連絡先とともに Bluetooth 経由でデバイスに表示できます。デフォルトでは true に設定されています。
  • Wi-Fi 設定の削除: 仕事用プロファイルが削除されると、プロファイル所有者が(addNetwork() メソッドの呼び出しなどを通じて)追加した Wi-Fi 設定が削除されるようになりました。
  • Wi-Fi 設定のロックダウン: WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN がゼロ以外の場合、アクティブなデバイス所有者によって作成された Wi-Fi 設定は、ユーザーが変更または削除できなくなります。 ユーザーは引き続き自分の Wi-Fi 設定の作成や変更を行えます。アクティブなデバイス オーナーには、Wi-Fi 設定(自分で作成していないものを含む)の編集または削除を行う権限があります。
  • Google アカウントの追加による Device Policy Controller のダウンロード: Device Policy Controller(DPC)アプリによる管理を必要とする Google アカウントが、管理対象コンテキスト以外のデバイスに追加された場合、アカウント追加フローで、適切な WPC のインストールがユーザーに求められるようになりました。この動作は、[設定] > [アカウント] で追加したアカウント、および最初のデバイス設定ウィザードで追加したアカウントにも適用されます。
  • DevicePolicyManager API の特定の動作の変更点:
    • setCameraDisabled() メソッドを呼び出すと、呼び出し元ユーザーのカメラにのみ影響します。管理対象プロファイルから呼び出しても、プライマリ ユーザーで実行されているカメラアプリには影響しません。
    • さらに、setKeyguardDisabledFeatures() メソッドがデバイス所有者だけでなくプロファイル所有者でも使用できるようになりました。
    • プロファイル オーナーは、次のキーガード制限を設定できます。
    • DevicePolicyManager.createAndInitializeUser() メソッドと DevicePolicyManager.createUser() メソッドが非推奨になりました。
    • また、setScreenCaptureDisabled() メソッドは、特定のユーザーのアプリがフォアグラウンドにある場合に、アシスト構造をブロックするようになりました。
    • EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM のデフォルトが SHA-256 になりました。SHA-1 は下位互換性のために引き続きサポートされますが、今後削除される予定です。EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM は SHA-256 のみを受け入れるようになりました。
    • Android 6.0(API レベル 23)にあったデバイス初期化 API が削除されました。
    • EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS が削除されたため、NFC バンプ プロビジョニングで、初期状態にリセットされた保護されたデバイスをプログラムでロック解除することはできません。
    • 管理対象デバイスの NFC プロビジョニング中に、EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE エクストラを使用して、デバイス所有者アプリにデータを渡せるようになりました。
    • Android for Work API は、仕事用プロファイル、アシストレイヤなど、M の実行時の権限向けに最適化されています。新しい DevicePolicyManager 権限 API は M 以前のアプリには影響しません。
    • ACTION_PROVISION_MANAGED_PROFILE または ACTION_PROVISION_MANAGED_DEVICE インテントを介して開始された設定フローの同期部分からユーザーが戻ったときに、システムから RESULT_CANCELED 結果コードが返されるようになりました。
  • その他の API の変更:
    • データ使用量: android.app.usage.NetworkUsageStats クラスの名前が NetworkStats に変更されました。
  • グローバル設定の変更: