Android6.0では多くのAPIに変更が加わりました。
もっとも大きな変更点はRuntime Permissionでしょうが、それ以外にも様々な変化が含まれています。
ここでは、既にAndroidアプリを公開している人向けに、既存のアプリにどのような影響が及ぶかについて説明されています。
原文
Android 6.0(API level 23)では新機能や能力とともに、システムやAPIの振る舞いに幾つかの変更が加えられています。
ここでは、理解しておかなくてはいけないアプリに影響を及ぼす重要な変化のハイライトを紹介します。
もし、あなたがこれまでAndroid向けにアプリを公開しているなら、プラットフォームの変更にともなってアプリが影響を受けることに注意してください。
Runtime Permission
今回のリリースでは新しいPermissionモデルが導入され、ユーザーは実行時に直接アプリのPermissionを管理することが出来るようになりました。このモデルによりユーザーはPermissionの確認と管理を行いやすくなります。開発者の利点として新規インストールと自動アップデートが合理化されます。
ユーザーはインストールされたアプリに対してPermissionを個別に許可したり拒否することが出来ます。
アプリがAndroid6.0(API level23)以上をターゲットとしている場合は、実行時にPermissionの要求を行っていることを確認してください。Permissionが許可されているかどうかを確認するにはcheckSelfPermission()を呼びます。Permissionを要求するには新しいrequestPermissions()を呼びます。また、Android6.0(API level 23)をターゲットとしていない場合もアプリが新しいPermission モデルで正しく動作することをテストしておく必要があります。
アプリで新しいPermissionモデルをサポートするための詳細はWorking with System Permissionss
(訳注:あるいはAndroid 6.0のRuntime Permissionに対応する(日本語))を確認してください。アプリにどのような影響があるかを確認する方法はPermissions Best Practicesを見てください。
DozeとApp Standby
このリリースでは端末やアプリが使われていない時の省電力機能が最適化されました。この機能はすべてのアプリに影響を及ぼします。そのためアプリでこの新しいモードをテストしてください。Doze
ユーザーが一定時間端末を充電中でなく、画面がOFFのまま、放置された状態であるなら、デバイスはDozeモードに入ります。このモードはシステムをできるだけスリープ状態にしておきます。このモードに有る時デバイスは定期的に短期間リジュームします。その間アプリは同期を行い、システムは待ち状態の様々な操作を行います。
App Standby
App Standbyはユーザーがアプリを一定期間活発に使っていない場合に、アプリが待機状態であると判定します。システムは端末が充電されていない時、待機状態のアプリに対して通信を無効化し、同期やジョブを休止します。
省電力機能の変更についてより詳細を学ぶにはAndroid 6.0 Changes | Android Developersを読んでください。
Apache HTTP Clientの削除
Android6.0ではApache HTTP Clientをサポートしなくなりました。もし、アプリでこのClientを使用しておりかつ、対象がAndroid2.3(API level9)以上であるならば、代わりにHttpURLConnectionクラスを使用してください。このAPIはtransparent圧縮とレスポンスのキャッシュによりネットワーク使用量を減らし、電力消費量を最小化してくれるため、より効率的です。Apache HTTP API群を使い続けるのであれば、最初にbuild.gradleファイルへ 以下のcompile-time dependencyを宣言する必要があります。
android {
useLibrary 'org.apache.http.legacy'
}
BoringSSL
AndroidはOpenSSLからBoringSSLライブラリに移行しています。もし、アプリ内でNDKを使用しているならば、libcrypto.so や libssl.so のようなNDK APIの一部でない暗号化ライブラリにリンクしてはいけません。これらのライブラリは公開されたAPI群ではなく、リリースや端末に寄っては警告なしに変更されたりなくなってしまうことがありえます。くわえて、脆弱性によりセキュリティの問題に直面するかもしれません。
代わりに、JNI経由でJavaの暗号化APIを呼ぶか静的リンクで暗号化Libraryを呼ぶようにネイティブコードを修正してください。
ハードウェア識別子へのアクセス
ユーザーのデーターを保護するために、このリリースではWi-FiとBluetoothAPI群を使うアプリにおいて、プログラムでデバイスのローカルハードウェア識別子へアクセスすることが出来なくなりました。WifiInfo.getMacAddress()とBluetoothAdapter.getAddress()は常に02:00:00:00:00:00を返すようになります。
BluetoothやWi-Fiスキャンによって近くのアクセス可能なハードウェア識別子へアクセスするにはACCESS_FINE_LOCATIONかACCESS_COARSE_LOCATIONpermissionが必要です。
・WifiManager.getScanResults()
・BluetoothDevice.ACTION_FOUND
・BluetoothLeScanner.startScan()
メモ:Android6.0(API level23)がWi-FiやBluetoothスキャンを始めた時、外部デバイスに対してはランダムなMACアドレスが使われます。
Notifications
このリリースではNotification.setLatestEventInfo()メソッドが削除されます。Notificationを作るにはその代わりにNotification.Builderクラスを使用してください。Notificationを繰り返し更新するにはNotification.Builderインスタンスを再度利用します。更新されたNotificationのインスタンスを取得するにはbuild()を呼びます。
adb shell dumpsys notificationコマンドはnotificationテキストを出力しなくなりました。Notificationオブジェクト内のテキストを出力するには代わりにadb shell dumpsys notification --noredactコマンドを使用します。
AudioManagerの変更
AudioManagerクラスを使って特定のストリームの音量を直接変更したりミュートにすることは出来なくなります。setStreamSolo()メソッドは非推奨となりました。かわりにrequestAudioFocus()を呼ぶ必要があります。同様に、setStreamMute()メソッドは非推奨となりました。代わりにadjustStreamVolume()にADJUST_MUTEやADJUST_UNMUTEを渡してください。
テキストの選択
ユーザーがアプリ内でテキストを選択する時、floating toolbar内で切り取り、コピー、貼り付けといったテキスト選択アクションを表示できます。ユーザーとの対話はcontextual action barと同様に、Enabling the contextual action mode for individual views内で記載して実装します。テキスト選択のFloating toolbarを実装するためには、既存のアプリに以下の変更を加えます。
1.ViewあるいはActivityでActionModeを呼ぶために、startActionMode(Callback) の代わりにstartActionMode(Callback, ActionMode.TYPE_FLOATING).を呼びます。
2.既存のActionMode.Callbackの実装の代わりにActionMode.Callback2を継承します。
3.Rectオブジェクト(矩形で選択されたテキストなど)と同調するために、onGetContentRect()メソッドをOverrideします。
4.選択された矩形がもう必要なく無効にしたい時、無効にする要素がこれ一つであるならinvalidateContentRect()メソッドを呼びます。
Android Support Library22.2ではfloating toolbarの以前のバージョンへの互換性は提供されず、AppCompatはデフォルトとしてActionModeオブジェクト上でコントロールされるので注意してください。このため、floating toolbarは表示されなくなります。
AppCompatActivityでActionModeをサポートするにはgetDelegate()を呼び、戻り値のAppCompatDelegateオブジェクトに対して、setHandleNativeActionModesEnabled()メソッドを引数にfalseをセットして呼んでください。
この呼出ではActionModeオブジェクトのControlが返ります。Android6.0(API level23)が動作するデバイスではActionBarか、floating toolbarモードをサポートすることが出来ます。Android5.1(API level22)以下の端末ではActionBarモードのみがサポートされます。

ブラウザブックマークの変更
このリリースではグローバルブックマークのサポートが削除されました。android.provider.Browser.getAllBookmarks()とandroid.provider.Browser.getAllBookmarks()メソッドが削除され、関連してREAD_HISTORY_BOOKMARKSとWRITE_HISTORY_BOOKMARKSのPermissionも削除されました。もし、アプリのTargetSDKがAndroid6.0()API level23以上の場合global provicerやbookmark permissionによりブックマークにアクセスすることは出来ません。代わりにアプリ内のデータとしてブックマークを保持してください。
Android Keystoreの変更
このリリースではAndroid Keystore providerのDSAがサポートされなくなりました。ECDSAは引き続きサポートされます。セキュアロックスクリーンが無効化されたりリセット(例えばユーザーやデバイス管理者により)された時、暗号化が必要でないキーは削除されません。暗号化が必要なキーは削除されます。
Wi-Fiとネットワークの変更
このリリースではWi-FiとネットワークのAPI群の動きについて以下の変更が加わっています。・アプリは自身で作成したWifiConfigurationの状態を変更することが出来ます。ユーザーや他のアプリが作成したWifiConfigurationを編集したり削除することは許可されません。
・これまで、アプリでenableNetwork()を使用してdisableAllOthers=trueをセットし特定のWi-Fiにデバイスを強制的に接続した場合、デバイスは携帯網などの他のネットワークから切断されていました。このリリースでは他のネットワークから切断されなくなります。
もし貴方のアプリがtargetSdkVersionが20以下であれば選択したWi-Fiネットワークが固定されます。
targetSdkVersionが21以上の場合、openConnection()やbindSocket()、新しいbindProcessToNetwork()メソッドのようなマルチネットワークAPI群を使用することで、確実に選択したネットワークでネットワーク転送を行うことが出来ます。
カメラサービスの変更
このリリースではカメラサービスのリソース共有モデルについて、それまでの早い物順のアクセスモデルから優先度に基づいて処理されるモデルに変更されます。 サービスは以下の変更を含みます。・カメラサブシステムリソースへのアクセス(カメラデバイスを開いたり設定したりを含む)はクライアントアプリケーションプロセスの優先度に基づき与えられます。アプリがユーザーに見えているか最前面のActivityの場合、通常カメラリソースを獲得して使用するための高い優先度が与えられます。
・優先度の低いアプリでアクティブなカメラクライアントは、優先度が高いアプリがカメラを使用したときに、追い出される可能性があります。追い出されたアプリに対して、非推奨のCameraAPIではonError()が呼ばれます。Camera2では、onDisconnected()が呼ばれます。
・カメラハードウェアが対応しているデバイスの場合、異なるアプリが異なるカメラを同時に開いてつかうことが出来ます。しかしながら、複数を同時に使用する場合、それぞれのカメラでパフォーマンスの劣化や、機能の制約を受けることが有ります。カメラサービスによりそれらが計測された場合無効化されることが有ります。
この変更により、優先度の低いクライアントアプリは他のアプリが同じカメラに直接接続していない時であっても追い出されることが有ります。
・カメラへのアクセスは現在のデバイスユーザーのユーザープロファイルに限定されます。カレントユーザーを変更した場合、アクティブなカメラは以前のユーザーアカウントから追い出されます。
これは例えば、ゲストアカウントで使用していたカメラサブシステムが別のユーザーアカウントに変更した時に実行プロセスを残すことが出来ないことを意味します。
Runtime
以前のバージョンのDalvikは間違ったアクセスルールでnewInstance()をチェックしていた問題について、ARTランタイムはnewInstance()メソッドに対するアクセスルールを正しく実装します。アプリでnewInstance()を使用していてアクセスチェックを超えたいときは、引数にtrueをセットしてsetAccessible()を呼んでください。もし、アプリでv7 appcompat libraryかv7 recyclerview libraryを使用している場合はそれらのライブラリーを最新版のものに変えてください。あるいは、あらゆるカスタムクラスで、コンストラクターがXMLからアクセス可能なように更新されることを確認してください。
このリリースでは動的リンクが更新されています。動的リンクはライブラリーのsonameと自身のパスの違いを識別できるようになり(public bug 6670)sonameによる検索が実装されました。従来のアプリは良くないDT_NEEDEDエントリー(通常ビルドを行うマシンの絶対パス)を持っていて読み込みに失敗することが有ります。
dlopen(3) RTLD_LOCALフラグが正しく実装されました。RTLD_LOCALはデフォルトなのでdlopen (3)を呼び出してRTLD_LOCALを明示的に使用しないと影響を受けます(アプリがRTLD_GLOBALを明示的に使用していない場合)
RTLD_LOCALシンボルは(DT_NEEDEDエントリーによりリファレンスがつけられるのとは対照的に)後の dlopen (3) を呼び出すことによってライブラリーが呼び出せなくなります。
以前のバージョンのAndroidで、アプリがtext relocationsによる共有ライブラリーの読み込みが必要だった場合、システムは警告を表示しますが、読み込むことは可能です。このリリースで、target SDKバージョンが23以上だった場合はライブラリをシステムが拒否します。
ライブラリーの読み込みが失敗したことを知るために、 dlopen (3) の失敗ログを取る必要があります。dlerror (3) が返す問題点を説明するテキストを含めます。再配置を行うための方法について学ぶにはこの
guideを呼んでください。
APKの正当性確認
プラットフォームはAPKの正当性確認をより厳しく行うようになりました。ファイルがmanifestで宣言されるがAPK内に存在しなかった場合APKは不正と判別されます。いかなるコンテンツが削除された時も、再度署名を行う必要があります。
USB接続
USBポートに端末が接続された時、標準では充電のみモードとなります。USB接続により端末やそのコンテンツにアクセスするときは各通信についてユーザーが明示的に許可を与える必要があります。もしアプリがUSBポートを経由した端末との通信をサポートしているなら、ユーザーが通信を明示的に許可する必要が有ることに注意してください。Android for Workの変更点
このリリースではAndroid for Worksについて以下の様な変更があります。・Personal context中の仕事用連絡先
Googleダイアラーはユーザーが過去の通話履歴を見た時に仕事用の連絡先が表示されるようになりました。
setCrossProfileCallerIdDisabled()にTrueを渡すことでGoogleダイアラーの通話履歴に仕事用の連絡先が表示されなくなります。setBluetoothContactSharingDisabled()にfalseを設定している時のみ、業務用の連絡先が個人用連絡先とともにBluetooth経由のデバイスに表示されます。デフォルトではtrueが設定されています。
・Wi-Fi設定の削除 仕事用プロファイルが削除された時にプロファイルオーナーがaddNetwork()を呼ぶなどして追加したWi-Fi設定が削除されます。
・Wi-Fi設定のロックダウン アクティブデバイスオーナーによって作られたあらゆるWi-Fi設定はWIFI_DEVICE_OWNER_CONFIGS_LOCKDOWNにゼロ以外を設定することで、ユーザーにより修正したり削除することが出来なくなります。ユーザーは自分自身のWi-Fi設定を作ったり編集することは出来ます。アクティブデバイスオーナーは自分以外の人が作ったものを含めて全てのWi-Fi設定を修正したり削除する特権を持っています。
・Googleアカウントを加える 時にWork Policy Controllerをダウンロードする
Googleアカウントを管理されたContextのデバイス外から追加されたWork Policy Controller(WPC)アプリによって観理する必要がある時、アカウント追加フローでユーザーに適切なWPCをインストールすることを促します。
この挙動は、アカウント設定からアカウントを追加するときも、デバイスの初期セットアップウィザードにも当てはまります。
・特定のDevicePolicyManagerAPIの挙動が変更されます。
→setCameraDisabled()メソッドを呼んでも、呼び出したユーザーのカメラだけに影響します。
管理されたプロファイルからそれを呼んでもプライマリーユーザー上で動いているカメラアプリには影響しません。
→setKeyguardDisabledFeatures()メソッドはデバイスオーナーに加えてプロフィールオーナーでも使用可能になりました。
→プロファイルオーナーは以下のキーガード規制を設定できます。
・KEYGUARD_DISABLE_TRUST_AGENTS、KEYGUARD_DISABLE_FINGERPRINT(プロファイルの親ユーザーがもつKeyguard設定に影響します)
・KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS管理者プロファイルのアプリに寄って作成されたNotificationのみに影響します。
→createAndInitializeUser()とcreateUser()メソッドは非推奨になりました。
→setScreenCaptureDisabled()メソッドは指定したユーザーのアプリが全面にある時、assist structureもブロックします。
→EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUMは標準でSHA-256となります。SHA-1は後方互換性のために継続してサポートされますが、将来的に削除される予定です。
EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUMはSHA-256のみを受け入れます。
→Android 6.0(API level23)に存在していたデバイス初期化APIは削除されました。
→EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERSが削除されました。そのため、NFC bumpプロビジョニングはプログラムでデバイスのファクトリーリセットプロテクトを解除することが出来なくなります。
→管理されたデバイスのNFCプロビジョニングによって、デバイスオーナーアプリにデータを送るためにEXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE extraが使用可能になりました。
→Work Profileやassist layer等no
Android for Work API群は M runtime permissionに最適化されました。
新しいDevicePolicyManager permission API群はM以前のアプリには影響しません。
→ACTION_PROVISION_MANAGED_PROFILEあるいはACTION_PROVISION_MANAGED_DEVICE intentを通じて開始されたセットアップフローの同期処理がユーザーによってキャンセルされた場合、システムは戻り値RESULT_CANCELEDを返すようになりました。
・その他API群の変化
→Data Usage:android.app.usage.NetworkUsageStatsクラスはNetworkStatsにリネームされました。
・グローバル設定の変更
→以下の設定はsetGlobalSettings()によって設定できなくなります。
・BLUETOOTH_ON
・DEVELOPMENT_SETTINGS_ENABLED
・MODE_RINGER
・NETWORK_PREFERENCE
・WIFI_ON
→以下の設定がsetGlobalSettings()によって設定できるようになります。
・WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN
Except as noted, this content is licensed under Creative Commons Attribution 2.5. For details and restrictions, see the Content License.