1page.title=Khởi động Trực tiếp 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="qv-wrapper"> 9<div id="qv"> 10 <h2>Trong tài liệu này</h2> 11 <ol> 12 <li><a href="#run">Yêu cầu Truy cập để Chạy trong quá trình Khởi động Trực tiếp</a></li> 13 <li><a href="#access">Truy cập Bộ nhớ Lưu trữ Mã hóa của Thiết bị</a></li> 14 <li><a href="#notification">Nhận thông báo Mở khóa của Người dùng</a></li> 15 <li><a href="#migrating">Chuyển nhập Dữ liệu Có sẵn</a></li> 16 <li><a href="#testing">Kiểm thử Ứng dụng Nhận biết Mã hóa của bạn</a></li> 17 </ol> 18</div> 19</div> 20 21<p>Android N chạy trong chế độ <i>Khởi động Trực tiếp</i> an toàn 22khi thiết bị đã được bật nguồn nhưng người dùng chưa mở khóa 23thiết bị. Để hỗ trợ chế độ này, hệ thống cung cấp hai vị trí lưu trữ dữ liệu:</p> 24 25<ul> 26<li><i>Lưu trữ mã hóa thông tin xác thực</i>, là vị trí lưu trữ mặc định 27và chỉ khả dụng sau khi người dùng đã mở khóa thiết bị.</li> 28<li><i>Lưu trữ mã hóa thiết bị</i>, là vị trí lưu trữ khả dụng cho cả 29chế độ Khởi động Trực tiếp và sau khi người dùng đã mở khóa thiết bị.</li> 30</ul> 31 32<p>Theo mặc định, các ứng dụng không chạy trong quá trình chế độ Khởi động Trực tiếp. 33Nếu ứng dụng của bạn cần thực hiện hành động trong chế độ Khởi động Trực tiếp thì bạn có thể đăng ký 34các thành phần ứng dụng cần chạy trong chế độ này. Một số trường hợp sử dụng phổ biến 35cho các ứng dụng cần chạy trong chế độ Khởi động Trực tiếp gồm:</p> 36 37<ul> 38<li>Ứng dụng có thông báo theo lịch, như ứng dụng 39đồng hồ báo thức.</li> 40<li>Ứng dụng cung cấp các thông báo quan trọng cho người dùng như ứng dụng SMS.</li> 41<li>Ứng dụng cung cấp các dịch vụ trợ năng như Talkback.</li> 42</ul> 43 44<p>Nếu ứng dụng của bạn cần truy cập dữ liệu khi đang chạy trong chế độ Khởi động Trực tiếp thì hãy sử dụng 45lưu trữ mã hóa thiết bị. Bộ nhớ lưu trữ được mã hóa của thiết bị có chứa dữ liệu 46được mã hóa bằng một khóa chỉ khả dụng sau khi thiết bị đã thực hiện một 47lần khởi động được xác thực thành công.</p> 48 49<p>Đối với dữ liệu cần được mã hóa bằng một khóa liên kết tới thông tin xác thực 50của người dùng như mã PIN hoặc mật khẩu thì hãy sử dụng bộ nhớ lưu trữ mã hóa thông tin xác thực. 51Bộ nhớ lưu trữ mã hóa thông tin xác thực chỉ khả dụng sau khi người dùng đã mở khóa 52thành công thiết bị, tính đến khi người dùng khởi động lại thiết bị một lần nữa. Nếu 53người dùng mở màn hình khóa sau khi mở khóa thiết bị thì thao tác này không khóa 54bộ nhớ mã hóa thông tin xác thực.</p> 55 56<h2 id="run">Yêu cầu Truy cập để Chạy trong quá trình Khởi động Trực tiếp</h2> 57 58<p>Các ứng dụng phải đăng ký các thành phần của chúng với hệ thống trước khi chúng 59có thể chạy trong chế độ Khởi động Trực tiếp hoặc truy cập bộ nhớ lưu trữ 60mã hóa thiết bị. Ứng dụng đăng ký với hệ thống bằng cách đánh dấu các thành phần là 61<i>nhận biết mã hóa</i>. Để đánh dấu các thành phần của bạn là nhận biết mã hóa, hãy đặt thuộc tính 62<code>android:encryptionAware</code> thành true trong bản kê khai.<p> 63 64<p>Các thành phần nhận biết mã hóa có thể đăng ký để nhận một thông điệp truyền phát 65<code>LOCKED_BOOT_COMPLETED</code> từ 66hệ thống khi thiết bị được khởi động lại. Lúc này, bộ nhớ lưu trữ 67mã hóa thiết bị sẽ khả dụng và thành phần của bạn có thể thực thi các tác vụ cần được 68chạy trong chế độ Khởi động Trực tiếp, như kích hoạt báo thức đã đặt.</p> 69 70<p>Đoạn mã sau là một ví dụ về cách đăng ký một 71{@link android.content.BroadcastReceiver} là nhận biết mã hóa và thêm một 72bộ lọc ý định cho <code>LOCKED_BOOT_COMPLETED</code> trong bản kê khai của ứng dụng:</p> 73 74<pre> 75<receiever 76 android:encryptionAware="true" > 77 ... 78 <intent-filter> 79 <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" /> 80 </intent-filter> 81</receiver> 82</pre> 83 84<p>Khi người dùng đã mở khóa thiết bị thì mọi thành phần có thể truy cập 85cả bộ nhớ lưu trữ mã hóa thiết bị lẫn bộ nhớ lưu trữ mã hóa thông tin xác thực.</p> 86 87<h2 id="access">Truy cập Bộ nhớ Lưu trữ Mã hóa của Thiết bị</h2> 88 89<p>Để truy cập bộ nhớ lưu trữ mã hóa thiết bị, hãy tạo một thực thể 90{@link android.content.Context} thứ hai bằng cách gọi 91<code>Context.createDeviceEncryptedStorageContext()</code>. Tất cả các lệnh gọi 92API bộ nhớ lưu trữ đều sử dụng bối cảnh này để truy cập bộ nhớ lưu trữ mã hóa thiết bị. 93Ví dụ sau sẽ truy cập bộ nhớ lưu trữ mã hóa của thiết bị và mở một tệp 94dữ liệu ứng dụng có sẵn:</p> 95 96<pre> 97Context directBootContext = Context.createDeviceEncryptedStorageContext(); 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>Chỉ sử dụng bộ nhớ lưu trữ mã hóa của thiết bị 104cho thông tin phải truy cập được trong chế độ Khởi động Trực tiếp. 105Không sử dụng bộ nhớ lưu trữ mã hóa của thiết bị làm bộ lưu trữ mã hóa cho mục đích chung. 106Đối với thông tin cá nhân của người dùng, hoặc dữ liệu được mã hóa không cần thiết 107trong chế độ Khởi động Trực tiếp thì hãy sử dụng bộ nhớ lưu trữ mã hóa thông tin xác thực.</p> 108 109<h2 id="notification">Nhận thông báo Mở khóa của Người dùng</h2> 110 111<p>Một khi người dùng mở khóa thiết bị sau khi khởi động lại, ứng dụng của bạn có thể chuyển sang 112truy cập bộ nhớ lưu trữ mã hóa thông tin xác thực và sử dụng các dịch vụ thông thường của hệ thống 113phụ thuộc vào thông tin xác thực người dùng.</p> 114 115<p>Để nhận thông báo khi người dùng mở khóa thiết bị sau khi khởi động lại, 116hãy đăng ký một {@link android.content.BroadcastReceiver} từ một thành phần đang chạy 117để lắng nghe thông báo <code>ACTION_USER_UNLOCKED</code>. Hoặc bạn có thể 118nhận thông báo có sẵn {@link android.content.Intent#ACTION_BOOT_COMPLETED 119ACTION_BOOT_COMPLETED} lúc này sẽ chỉ báo thiết bị đã khởi động xong và 120người dùng đã mở khóa thiết bị.</p> 121 122<p>Bạn có thể truy vấn trực tiếp để biết người dùng đã mở khóa thiết bị hay chưa bằng cách gọi 123<code>UserManager.isUserUnlocked()</code>.</p> 124 125<h2 id="migrating">Chuyển nhập Dữ liệu Có sẵn</h2> 126 127<p>Nếu người dùng cập nhật thiết bị của họ để sử dụng chế độ Khởi động Trực tiếp thì bạn có thể có dữ liệu 128hiện hữu cần được chuyển nhập sang bộ nhớ lưu trữ mã hóa của thiết bị. Sử dụng 129<code>Context.migrateSharedPreferencesFrom()</code> và 130<code>Context.migrateDatabaseFrom()</code> để chuyển nhập dữ liệu về tùy chọn và cơ sở dữ liệu 131giữa bộ nhớ lưu trữ mã hóa thông tin xác thực và bộ nhớ lưu trữ mã hóa thiết bị.</p> 132 133<p>Hãy phán đoán hợp lý nhất khi quyết định dữ liệu nào nên chuyển nhập từ bộ nhớ lưu trữ mã hóa 134thông tin xác thực sang bộ nhớ lưu trữ mã hóa thiết bị. Bạn không nên di chuyển 135thông tin cá nhân của người dùng như mật khẩu hoặc các mã thông báo cấp quyền sang 136bộ nhớ lưu trữ mã hóa thiết bị. Trong một số trường hợp, bạn có thể cần quản lý 137các bộ dữ liệu riêng biệt trong hai bộ lưu trữ mã hóa.</p> 138 139<h2 id="testing">Kiểm thử Ứng dụng Nhận biết Mã hóa của bạn</h2> 140 141<p>Kiểm thử ứng dụng nhận biết mã hóa bằng cách sử dụng chế độ Khởi động Trực tiếp mới. Có 142hai cách để kích hoạt Khởi động Trực tiếp.</p> 143 144<p class="caution"><strong>Cẩn trọng:</strong> Kích hoạt Khởi động Trực tiếp 145sẽ xóa sạch mọi dữ liệu người dùng trên thiết bị.</p> 146 147<p>Trên các thiết bị được hỗ trợ có Android N được cài đặt, kích hoạt 148Khởi động Trực tiếp bằng cách thực hiện một trong các thao tác sau:</p> 149 150<ul> 151<li>Trên thiết bị, bật <b>Developer options</b> nếu chưa hãy bật bằng cách 152vào <b>Settings > About phone</b> và nhấn vào <b>Build number</b> 153bảy lần. Khi màn hình tùy chọn cho nhà phát triển khả dụng, hãy vào 154<b>Settings > Developer options</b> và chọn 155<b>Convert to file encryption</b>.</li> 156<li>Sử dụng các lệnh shell adb sau để kích hoạt chế độ Khởi động Trực tiếp: 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>Cũng có một chế độ Khởi động Trực tiếp giả lập trong trường hợp bạn cần chuyển đổi 165các chế độ trên thiết bị thử nghiệm. Chỉ nên sử dụng chế độ Giả lập trong quá trình 166phát triển và có thể làm mất dữ liệu. Để kích hoạt chế độ Khởi động Trực tiếp giả lập, 167hãy đặt mẫu hình khóa cho thiết bị, chọn "No thanks" nếu được yêu cầu 168 bật màn hình khởi động bảo mật khi đặt một mẫu hình khóa và sau đó sử dụng 169lệnh shell adb sau:</p> 170 171<pre class="no-pretty-print"> 172$ adb shell sm set-emulate-fbe true 173</pre> 174 175<p>Hãy sử dụng lệnh sau để tắt chế độ Khởi động Trực tiếp giả lập:</p> 176 177<pre class="no-pretty-print"> 178$ adb shell sm set-emulate-fbe false 179</pre> 180 181<p>Sử dụng các lệnh này có thể khiến cho thiết bị khởi động lại.</p> 182