• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1page.title=ダイレクト ブート
2page.keywords=preview,sdk,direct boot
3page.tags=androidn
4page.image=images/cards/card-nyc_2x.jpg
5
6@jd:body
7
8<div id="tb-wrapper">
9<div id="tb">
10  <h2>このドキュメントの内容</h2>
11  <ol>
12    <li><a href="#run">ダイレクト ブート中に実行するためのアクセスを要求する</a></li>
13    <li><a href="#access">端末暗号化ストレージにアクセスする</a></li>
14    <li><a href="#notification">ユーザーによる端末のロック解除の通知を受信する</a></li>
15    <li><a href="#migrating">既存のデータを移行する</a></li>
16    <li><a href="#testing">暗号化対応アプリをテストする</a></li>
17  </ol>
18</div>
19</div>
20
21<p>Android N は、電源を入れたときにユーザーが端末のロックを解除していない場合、セキュリティで保護された <i>ダイレクト ブート</i> モードで実行します。
22
23この機能をサポートするため、システムで次の 2 つの保存先を使用できるようになります。</p>
24
25<ul>
26<li><i>認証情報暗号化ストレージ。</i>これはデフォルトの保存先で、ユーザーが端末のロックを解除した後にだけ使用できます。
27</li>
28<li><i>端末暗号化ストレージ。</i>この保存先は、ダイレクト ブート モード中とユーザーが端末のロックを解除した後の両方で使用できます。
29</li>
30</ul>
31
32<p>デフォルトで、ダイレクト ブート モード中はアプリは実行されません。ダイレクト ブート モード中にアプリで操作を実行する必要がある場合、このモードで実行するアプリ コンポーネントを登録できます。
33
34ダイレクト ブート モードでアプリの実行が必要になる一般的な使用例は次のとおりです。
35</p>
36
37<ul>
38<li>アラーム クロック アプリなど、通知がスケジュールされているアプリ。
39</li>
40<li>SMS アプリなど、重要なユーザー通知を表示するアプリ。</li>
41<li>Talkback など、ユーザー補助機能サービスを提供するアプリ。</li>
42</ul>
43
44<p>ダイレクト ブート モードで実行中にアプリがデータにアクセスする必要がある場合は、端末暗号化ストレージを使用します。
45端末暗号化ストレージにはキーで暗号化されたデータが保存され、端末がセキュアブートに成功した場合にのみこのデータを使用できます。
46
47</p>
48
49<p>ユーザーの認証情報に関連付けたキーで暗号化しなければならない PIN やパスワードなどのデータには、認証情報暗号化ストレージを使用します。認証情報暗号化ストレージは、ユーザーが端末のロック解除に成功した後に使用可能になり、ユーザーが端末を再起動するまでアクセスできます。
50
51
52ユーザーが端末をロック解除した後にロック画面を有効にしても、認証情報暗号化ストレージはロックされません。
53
54</p>
55
56<h2 id="run">ダイレクト ブート中に実行するためのアクセスを要求する</h2>
57
58<p>ダイレクト ブート モード中にアプリを実行したり、端末暗号化ストレージにアクセスしたりするには、アプリ コンポーネントの登録が必要です。
59
60アプリをシステムに登録するには、コンポーネントが
61<i>暗号化対応するように指定します。</i>コンポーネントが暗号化対応するよう指定するには、マニフェスト内で
62<code>android:directBootAware</code> 属性を true に設定します。<p>
63
64<p>暗号化対応コンポーネントを登録しておくと、端末を再起動したときにシステムから
65<code>LOCKED_BOOT_COMPLETED</code> ブロードキャスト メッセージを受信できます。
66この時点で端末暗号化ストレージが使用できるようになり、ダイレクト ブート モード中にコンポーネントが実行しなければならないタスクを実行できます。たとえば、スケジュールしたアラームのトリガーなどが該当します。
67
68</p>
69
70<p>次のコード スニペットは、アプリのマニフェスト内で
71{@link android.content.BroadcastReceiver} を暗号化対応として登録し、<code>LOCKED_BOOT_COMPLETED</code> のインテント フィルタを追加する方法の例を示しています。
72</p>
73
74<pre>
75&lt;receiver
76  android:directBootAware="true" &gt;
77  ...
78  &lt;intent-filter&gt;
79    &lt;action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" /&gt;
80  &lt;/intent-filter&gt;
81&lt;/receiver&gt;
82</pre>
83
84<p>ユーザーが端末のロックを解除すると、すべてのコンポーネントは端末暗号化ストレージと認証情報暗号化ストレージの両方にアクセスできます。
85</p>
86
87<h2 id="access">端末暗号化ストレージにアクセスする</h2>
88
89<p>端末暗号化ストレージにアクセスするには、
90<code>Context.createDeviceProtectedStorageContext()</code> を呼び出して追加の
91{@link android.content.Context} インスタンスを作成します。このコンテキストで実行されたストレージ API 呼び出しはすべて、端末暗号化ストレージにアクセスします。
92次の例では、端末暗号化ストレージにアクセスして既存のアプリのデータ ファイルを開きます。
93
94</p>
95
96<pre>
97Context directBootContext = appContext.createDeviceProtectedStorageContext();
98// Access appDataFilename that lives in device encrypted storage
99FileInputStream inStream = directBootContext.openFileInput(appDataFilename);
100// Use inStream to read content...
101</pre>
102
103<p>端末暗号化ストレージは、ダイレクト ブート モード中にアクセスが必要な情報のみに使用してください。汎用的な暗号化された保存先として、端末暗号化ストレージを使用することはできません。ユーザーの個人情報や、ダイレクト ブート モード中に特に必要ではない暗号化されたデータには、認証情報暗号化ストレージを使用してください。
104
105
106
107</p>
108
109<h2 id="notification">ユーザーによる端末のロック解除の通知を受信する</h2>
110
111<p>再起動後にユーザーが端末のロックを解除すると、アプリは認証情報暗号化ストレージへのアクセスに切り替えて、ユーザーの認証情報に応じて通常のシステム サービスを使用します。
112
113</p>
114
115<p>再起動後、ユーザーが端末のロックを解除したときに通知を受信するには、実行中のコンポーネントから {@link android.content.BroadcastReceiver} を登録して、<code>ACTION_USER_UNLOCKED</code> メッセージをリッスンするようにします。
116
117または、既存の {@link android.content.Intent#ACTION_BOOT_COMPLETED
118ACTION_BOOT_COMPLETED} メッセージを受信することもできます。このメッセージは、端末が起動してユーザーが端末のロックを解除したことを示すようになりました。
119
120</p>
121
122<p>
123<code>UserManager.isUserUnlocked()</code> を呼び出して、ユーザーが端末のロックを解除したかを直接問い合わせることもできます。</p>
124
125<h2 id="migrating">既存のデータを移行する</h2>
126
127<p>ユーザーが端末をアップデートしてダイレクト ブート モードを使用できるようになると、既存のデータを端末暗号化ストレージに移行しなければならない場合があります。
128
129<code>Context.moveSharedPreferencesFrom()</code> および
130<code>Context.moveDatabaseFrom()</code> を使用すると、設定およびデータベースのデータを認証情報暗号化ストレージと端末暗号化ストレージ間で移行できます。
131</p>
132
133<p>どのデータを認証情報暗号化ストレージから端末暗号化ストレージに移行するかは、慎重に判断してください。
134パスワードや承認トークンなどのユーザーの個人情報は、端末暗号化ストレージに移行しないでください。
135
136場合によっては、この 2 つの暗号化された保存先に、データセットを振り分けて管理する必要があります。
137</p>
138
139<h2 id="testing">暗号化対応アプリをテストする</h2>
140
141<p>新しいダイレクト ブート モードを使用して、暗号化対応アプリをテストしてみましょう。ダイレクト ブートを有効にする方法は 2 つあります。
142</p>
143
144<p class="caution"><strong>警告:</strong>ダイレクト ブートを有効にすると、端末上のすべてのユーザーデータが消去されます。
145</p>
146
147<p>Android N がインストールされたサポート対象端末では、次のいずれかの方法を使用してダイレクト ブートを有効にします。
148</p>
149
150<ul>
151<li>端末で、<b>[Developer options]</b> がまだ有効になっていない場合は、次の手順で有効にします。<b>[Settings] &gt; [About phone]</b> で <b>[Build number]</b> を 7 回タップします。
152
153[Developer options] 画面が表示されたら、<b>[Settings] &gt; [Developer options]</b> で <b>[Convert to file encryption]</b> を選択します。
154
155</li>
156<li>次の adb shell コマンドを使用して、ダイレクト ブート モードを有効にします。
157<pre class="no-pretty-print">
158$ adb reboot-bootloader
159$ fastboot --wipe-and-use-fbe
160</pre>
161</li>
162</ul>
163
164<p>テスト端末でモードの切り替えが必要な場合、エミュレーションされたダイレクト ブート モードも使用できます。
165データが失われるおそれがありますので、EMULATED モードは開発中にのみ使用してください。
166エミュレーションされたダイレクト ブート モードを有効にするには、端末でロック パターンを設定します。ロック パターンの設定時にセキュリティで保護されたスタートアップ画面について確認メッセージが表示された場合は、[No thanks] を選択します。次に、次の adb shell コマンドを使用します。
167
168
169</p>
170
171<pre class="no-pretty-print">
172$ adb shell sm set-emulate-fbe true
173</pre>
174
175<p>エミュレーションされたダイレクト ブート モードを無効にするには、次のコマンドを使用します。</p>
176
177<pre class="no-pretty-print">
178$ adb shell sm set-emulate-fbe false
179</pre>
180
181<p>これらのコマンドを使用すると、端末が再起動されます。</p>
182