page.title=Khởi động Trực tiếp page.keywords=preview,sdk,direct boot page.tags=androidn page.image=images/cards/card-nyc_2x.jpg @jd:body

Trong tài liệu này

  1. Yêu cầu Truy cập để Chạy trong quá trình Khởi động Trực tiếp
  2. Truy cập Bộ nhớ Lưu trữ Mã hóa của Thiết bị
  3. Nhận thông báo Mở khóa của Người dùng
  4. Chuyển nhập Dữ liệu Có sẵn
  5. Kiểm thử Ứng dụng Nhận biết Mã hóa của bạn

Android N chạy trong chế độ Khởi động Trực tiếp an toàn khi thiết bị đã được bật nguồn nhưng người dùng chưa mở khóa thiết bị. Để hỗ trợ chế độ này, hệ thống cung cấp hai vị trí lưu trữ dữ liệu:

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. Nế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ý cá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 cho các ứng dụng cần chạy trong chế độ Khởi động Trực tiếp gồm:

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 lư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 đượ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 lần khởi động được xác thực thành công.

Đố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 củ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. Bộ 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 thà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 ngườ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 bộ nhớ mã hóa thông tin xác thực.

Yêu cầu Truy cập để Chạy trong quá trình Khởi động Trực tiế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 có thể chạy trong chế độ Khởi động Trực tiếp hoặc truy cập bộ nhớ lưu trữ mã 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à nhận biết mã hóa. Để đá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 android:encryptionAware thành true trong bản kê khai.

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 LOCKED_BOOT_COMPLETED từ hệ thống khi thiết bị được khởi động lại. Lúc này, bộ nhớ lưu trữ mã 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 chạy trong chế độ Khởi động Trực tiếp, như kích hoạt báo thức đã đặt.

Đoạn mã sau là một ví dụ về cách đăng ký một {@link android.content.BroadcastReceiver} là nhận biết mã hóa và thêm một bộ lọc ý định cho LOCKED_BOOT_COMPLETED trong bản kê khai của ứng dụng:

<receiever
  android:encryptionAware="true" >
  ...
  <intent-filter>
    <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
  </intent-filter>
</receiver>

Khi người dùng đã mở khóa thiết bị thì mọi thành phần có thể truy cập cả 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.

Truy cập Bộ nhớ Lưu trữ Mã hóa của Thiết bị

Để truy cập bộ nhớ lưu trữ mã hóa thiết bị, hãy tạo một thực thể {@link android.content.Context} thứ hai bằng cách gọi Context.createDeviceEncryptedStorageContext(). Tất cả các lệnh gọi API 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ị. Ví 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 dữ liệu ứng dụng có sẵn:

Context directBootContext = Context.createDeviceEncryptedStorageContext();
// Access appDataFilename that lives in device encrypted storage
FileInputStream inStream = directBootContext.openFileInput(appDataFilename);
// Use inStream to read content...

Chỉ sử dụng bộ nhớ lưu trữ mã hóa của thiết bị cho thông tin phải truy cập được trong chế độ Khởi động Trực tiếp. Khô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. Đố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 trong 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.

Nhận thông báo Mở khóa của Người dùng

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 truy 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 phụ thuộc vào thông tin xác thực người dùng.

Để nhận thông báo khi người dùng mở khóa thiết bị sau khi khởi động lại, hãy đăng ký một {@link android.content.BroadcastReceiver} từ một thành phần đang chạy để lắng nghe thông báo ACTION_USER_UNLOCKED. Hoặc bạn có thể nhận thông báo có sẵn {@link android.content.Intent#ACTION_BOOT_COMPLETED ACTION_BOOT_COMPLETED} lúc này sẽ chỉ báo thiết bị đã khởi động xong và người dùng đã mở khóa thiết bị.

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 UserManager.isUserUnlocked().

Chuyển nhập Dữ liệu Có sẵn

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 hiệ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 Context.migrateSharedPreferencesFrom()Context.migrateDatabaseFrom() để chuyển nhập dữ liệu về tùy chọn và cơ sở dữ liệu giữ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ị.

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 thô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 thô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 bộ 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ý các bộ dữ liệu riêng biệt trong hai bộ lưu trữ mã hóa.

Kiểm thử Ứng dụng Nhận biết Mã hóa của bạn

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ó hai cách để kích hoạt Khởi động Trực tiếp.

Cẩn trọng: Kích hoạt Khởi động Trực tiếp sẽ xóa sạch mọi dữ liệu người dùng trên thiết bị.

Trên các thiết bị được hỗ trợ có Android N được cài đặt, kích hoạt Khởi động Trực tiếp bằng cách thực hiện một trong các thao tác sau:

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 các chế độ trên thiết bị thử nghiệm. Chỉ nên sử dụng chế độ Giả lập trong quá trình phá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, hãy đặt mẫu hình khóa cho thiết bị, chọn "No thanks" nếu được yêu cầu 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 lệnh shell adb sau:

$ adb shell sm set-emulate-fbe true

Hãy sử dụng lệnh sau để tắt chế độ Khởi động Trực tiếp giả lập:

$ adb shell sm set-emulate-fbe false

Sử dụng các lệnh này có thể khiến cho thiết bị khởi động lại.