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 Client の削除

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 を使用している場合は、libcrypto.solibssl.so など、NDK API の一部でない暗号化ライブラリにリンクしないでください。これらのライブラリは パブリック API ではなく、リリースや端末に対する通知なしで変更されたり、機能しなくなったりする可能性があります。また、セキュリティ上の脆弱性のリスクにさらされる場合もあります。代わりに、ネイティブ コードを変更して JNI 経由で Java の暗号化 API を呼び出すか、他の暗号化ライブラリに静的リンクします。

ハードウェア識別子へのアクセス

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

Bluetooth スキャンや Wi-Fi スキャンを介して近くの外部端末のハードウェア識別子にアクセスするには、アプリに 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_MUTEADJUST_UNMUTE を渡します。

テキストの選択

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

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

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

Android Support Library revision 22.2 を使用している場合、フローティング ツール バーに下位互換性はなく、デフォルトで appcompat が代わりに ActionMode オブジェクトを制御することに注意してください。このため、フローティング ツールバーが表示されなくなります。AppCompatActivityActionMode がサポートされるようにするには、getDelegate() を呼び出して、返された AppCompatDelegate オブジェクトで setHandleNativeActionModesEnabled() を呼び出し、入力パラメータを false に設定します。この呼び出しによって、ActionMode オブジェクトの制御がフレームワークに返されます。Android 6.0(API レベルl 23)を実行する端末ではフレームワークによる ActionBar やフローティング ツールバー モードのサポートが可能ですが、Android 5.1(API レベル 22)以前の端末では ActionBar モードのみがサポートされます。

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

このリリースではグローバル ブックマークのサポートが削除されました。android.provider.Browser.getAllBookmarks() メソッドと android.provider.Browser.saveBookmark() メソッドが削除されました。同様に、READ_HISTORY_BOOKMARKSWRITE_HISTORY_BOOKMARKS パーミッションも削除されました。アプリが Android 6.0(API レベル 23)以上を対象としている場合は、グローバル プロバイダからブックマークにアクセスしたり、ブックマーク パーミッションを使用したりしないでください。代わりに、アプリでブックマーク データを内部的に保存してください。

Android キーストアの変更点

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

停止時に暗号化を必要としないキーが、ロック画面の(ユーザーや端末の管理者などによる)無効時やリセット時に削除されなくなりました。停止時に暗号化を必要とするキーは、これらのイベント時に削除されます。

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

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

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

カメラ サービスの変更点

このリリースでは、カメラ サービスの共有リソースへのアクセス モデルが、以前の「先着順」モデルから「優先度順」に変更されました。このサービス動作の変更には、次のようなものがあります。

  • カメラデバイスを開いて構成するなど、カメラのサブシステム リソースへのアクセスは、クライアント アプリケーション プロセスの「優先度」に基づいて与えられます。通常、ユーザーに表示されているアクティビティやフォアグラウンドにあるアクティビティのあるアプリケーション プロセスの優先度が最も高く、より確実にカメラ リソースを取得して使用できます。
  • 優先度の低いアプリでアクティブなカメラ クライアントは、より優先度の高いアプリケーションがカメラを使おうとした際に使用が中断される場合があります。廃止された Camera API では、使用が中断されたクライアントに onError() が呼び出されます。Camera2 API では、使用が中断されたクライアントに onDisconnected() が呼び出されます。
  • 適切なカメラ ハードウェア付きの端末では、それぞれのアプリケーション プロセスを個別に起動して、別のカメラ端末を同時に使用することができます。ただし、このようなマルチプロセスのユースケースでは、同時アクセスによってパフォーマンスや起動しているカメラデバイスの性能が著しく低下する場合があります。そうした状態をカメラ サービスで検出して禁止できるようになりました。この変更によって、同じカメラ端末にアクセスしようとしているアプリが他になくても、優先度の低いクライアントによる使用が中断される場合があります。
  • 現在のユーザーを変更すると、アプリ内で前のユーザー アカウントで所有していたアクティブなカメラ クライアントが中断させられることになります。カメラへのアクセスは、現在の端末ユーザーが所有するユーザー プロファイルのみに制限されます。つまり、ユーザーが別のアカウントに切り替えた場合、たとえば、「ゲスト」 アカウントはカメラのサブシステムを使用するプロセスを実行したままにすることはできません。

ランタイム

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

このリリースでは、動的リンカーの動作がアップデートされました。動的リンカーでは、ライブラリの soname とそのパスの違いを認識でき(public bug 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 設定の削除:プロファイル オーナーによって追加された Wi-Fi 設定(addNetwork() メソッドへの呼び出しなどを介して)は、その仕事用プロファイルが削除されると同時に削除されます。
  • Wi-Fi 設定のロック:アクティブなデバイス オーナーによって作成された Wi-Fi 設定は、WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN がゼロ以外の場合、ユーザーが修正したり削除したりできなくなりました。ユーザーが自分の Wi-Fi 設定を作成したり変更したりすることはできます。アクティブなデバイス オーナーには Wi-Fi 設定(デバイス オーナーが作成していないものを含む)を編集または削除する権限があります。
  • Google アカウントの追加によるデバイス ポリシー コントローラのダウンロード:デバイス ポリシー コントローラ(DPC)アプリ経由で管理する必要のある Google アカウントがマネージド コンテキスト外で端末に追加されると、アカウントの追加フローでユーザーに適切な DPC をインストールするよう要求します。この動作は、初回の端末セットアップ ウィザードにおいて [Settings] > [Accounts] で追加されるアカウントにも適用されます。
  • 特定の 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_PROFILEACTION_PROVISION_MANAGED_DEVICE インテントから開始されたセットアップ フローの同期部分でユーザーが取り消しを行った場合、システムは RESULT_CANCELED 結果コードを返すようになりました。
  • 他の API の変更点:
    • データ使用:android.app.usage.NetworkUsageStats クラスはNetworkStats に名前が変更されました。
  • グローバル設定の変更点: