page.title=ダイレクト ブート page.keywords=preview,sdk,direct boot page.tags=androidn page.image=images/cards/card-nyc_2x.jpg @jd:body
Android N は 、 電源を入れたときにユーザーが端末のロックを解除していない場合、セキュリティで保護された「ダイレクト ブート」モードで実行します。 この機能をサポートするため、システムで次の 2 つの保存先を使用できるようになります。
デフォルトで、ダイレクト ブート モード中はアプリは実行されません。ダイレクト ブート モード中にアプリでアクションを実行する必要がある場合、このモードで実行するアプリ コンポーネントを登録できます。 ダイレクト ブート モードでアプリの実行が必要になる一般的な使用例は次のとおりです。
ダイレクト ブート モードで実行中にアプリがデータにアクセスする必要がある場合は、端末暗号化ストレージを使用します。 端末暗号化ストレージにはキーで暗号化されたデータが保存され、端末がセキュア ブートに成功した場合にのみこのデータを使用できます。
ユーザーの資格情報に関連付けたキーで暗号化しなければならない PIN やパスワードなどのデータには、資格情報暗号化ストレージを使用します。資格情報暗号化ストレージは、ユーザーが端末のロック解除に成功した後に使用可能になり、ユーザーが端末を再起動するまでアクセスできます。 ユーザーが端末をロック解除した後にロック画面を有効にしても、資格情報暗号化ストレージはロックされません。
ダイレクト ブート モード中にアプリを実行したり、端末暗号化ストレージにアクセスしたりするには、アプリ コンポーネントの登録が必要です。
アプリをシステムに登録するには、コンポーネントが暗号化対応するように指定します。
コンポーネントが暗号化対応するよう指定するには、マニフェスト内で
android:encryptionAware 属性を true に設定します。
暗号化対応コンポーネントを登録しておくと、端末を再起動したときにシステムから
LOCKED_BOOT_COMPLETED ブロードキャスト メッセージを受信できます。
この時点で端末暗号化ストレージが使用できるようになり、ダイレクト ブート モード中にコンポーネントが実行しなければならないタスクを実行できます。たとえば、スケジュールしたアラームのトリガーなどが該当します。
次のコード スニペットは、アプリのマニフェスト内で
{@link android.content.BroadcastReceiver} を暗号化対応として登録し、LOCKED_BOOT_COMPLETED のインテント フィルタを追加する方法の例を示しています。
<receiever
android:encryptionAware="true" >
...
<intent-filter>
<action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
</intent-filter>
</receiver>
ユーザーが端末のロックを解除すると、すべてのコンポーネントは端末暗号化ストレージと資格情報暗号化ストレージの両方にアクセスできます。
暗号化端末ストレージにアクセスするには、
Context.createDeviceEncryptedStorageContext() を呼び出して追加の
{@link android.content.Context} インスタンスを作成します。このコンテキストで実行されたストレージ API 呼び出しはすべて、端末暗号化ストレージにアクセスします。
次の例では、端末暗号化ストレージにアクセスして既存のアプリのデータ ファイルを開きます。
Context directBootContext = Context.createDeviceEncryptedStorageContext(); // Access appDataFilename that lives in device encrypted storage FileInputStream inStream = directBootContext.openFileInput(appDataFilename); // Use inStream to read content...
端末暗号化ストレージは、ダイレクト ブート モード中にアクセスが必要な情報のみに使用してください。汎用的な暗号化された保存先として、端末暗号化ストレージを使用することはできません。ユーザーの個人情報や、ダイレクト ブート モード中に特に必要ではない暗号化されたデータには、資格情報暗号化ストレージを使用してください。
再起動後にユーザーが端末のロックを解除すると、アプリは資格情報暗号化ストレージへのアクセスに切り替えて、ユーザーの資格情報に応じて通常のシステム サービスを使用します。
再起動後、ユーザーが端末のロックを解除したときに通知を受信するには、実行中のコンポーネントから {@link android.content.BroadcastReceiver} を登録して、ACTION_USER_UNLOCKED メッセージをリッスンするようにします。
または、既存の {@link android.content.Intent#ACTION_BOOT_COMPLETED
ACTION_BOOT_COMPLETED} メッセージを受信することもできます。このメッセージは、端末が起動してユーザーが端末のロックを解除したことを示すようになりました。
UserManager.isUserUnlocked() を呼び出して、ユーザーが端末のロックを解除したかを直接問い合わせることもできます。
ユーザーが端末をアップデートしてダイレクト ブート モードを使用できるようになると、既存のデータを端末暗号化ストレージに移行しなければならない場合があります。
Context.migrateSharedPreferencesFrom() および
Context.migrateDatabaseFrom() を使用すると、設定およびデータベースのデータを資格情報暗号化ストレージと端末暗号化ストレージ間で移行できます。
どのデータを資格情報暗号化ストレージから端末暗号化ストレージに移行するかは、慎重に判断してください。 パスワードや認証トークンなどのユーザーの個人情報は、端末暗号化ストレージに移行しないでください。 場合によっては、この 2 つの暗号化された保存先に、データセットを振り分けて管理する必要があります。
新しいダイレクト ブート モードを使用して、暗号化対応アプリをテストしてみましょう。ダイレクト ブートを有効にする方法は 2 つあります。
警告:ダイレクト ブートを有効にすると、端末上のすべてのユーザーデータが消去されます。
Android N がインストールされたサポート対象端末では、次のいずれかの方法を使用してダイレクト ブートを有効にします。
$ adb reboot-bootloader $ fastboot --wipe-and-use-fbe
テスト端末でモードの切り替えが必要な場合、エミュレーションされたダイレクト ブート モードも使用できます。 データが失われるおそれがありますので、EMULATED モードは開発中にのみ使用してください。 エミュレーションされたダイレクト ブート モードを有効にするには、端末でロック パターンを設定します。ロック パターンの設定時にセキュリティで保護されたスタートアップ画面について確認メッセージが表示された場合は、[No thanks] を選択します。次に、次の adb shell コマンドを使用します。
$ adb shell sm set-emulate-fbe true
エミュレーションされたダイレクト ブート モードを無効にするには、次のコマンドを使用します。
$ adb shell sm set-emulate-fbe false
これらのコマンドを使用すると、端末が再起動されます。