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_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 設定の削除: プロファイル オーナーによって追加された Wi-Fi 設定(addNetwork() メソッドへの呼び出しなどを介して)は、その仕事用プロファイルが削除されると同時に削除されます。
  • Wi-Fi 設定のロックダウン: WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN がゼロ以外の場合、アクティブなデバイス オーナーによって作成された Wi-Fi 設定は、ユーザーが修正したり削除したりできなくなりました。ユーザーが自分の Wi-Fi 設定を作成したり変更したりすることはできます。アクティブなデバイス オーナーには Wi-Fi 設定(デバイス オーナーが作成していないものを含む)を編集または削除する権限があります。
  • Google アカウントの追加によるデバイス ポリシー コントローラのダウンロード: デバイス ポリシー コントローラ(DPC)アプリ経由で管理する必要のある Google アカウントがマネージド コンテキスト外で端末に追加されると、アカウントの追加フローでユーザーに適切な DPC をインストールするよう要求します。この動作は、[設定] > [アカウント] で追加したアカウントや、最初のデバイス設定ウィザードで追加されたアカウントにも適用されます。
  • 特定の 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 に変更されました。
  • グローバル設定の変更: