Android N引入了一个新特性: Direct Boot Mode—— 设备启动后进入的一个新模式,直到用户解锁(unlock)设备此阶段结束。
在此 Direct Boot Mode 下 APP 比较适合做一些:
- Alarm、clock 类的操作,如闹钟
- 需要做重要的或紧急的通知,如短信应用
- 底层服务类,如辅助工具服务
请注意,以上并非详尽的用例列表,我们期待看到还有哪些类型的应用能够从直接启动模式获益。
1.如何使应用程序支持直接启动
为了让您的应用能够在用户解锁设备之前运行,您必须在清单文件中将组件显式标记为支持直接启动:
manifest 中加入:
<activity|provider|receiver|service ...
android:directBootAware=”true”>
APP在进入DBM后会收到系统的广播消息: Intent.ACTION_LOCKED_BOOT_COMPLETED
—— 新增
用户解锁手机后,APP会收到另一条: Intent.ACTION_BOOT_COMPLETED
—— 一直有
数据存储:
使用设备保护存储区为了支持应用在用户提供解锁私有应用数据所需的凭据之前的正常运行,所有 Android N 设备现在均提供两个数据存储位置:-
[credential encrypted storage]凭据保护存储区,这是所有应用的默认存储位置,仅在用户解锁设备后可用。
-
[device encrypted storage]设备保护存储区,这是一个新的存储位置,当设备启动后(包括直接启动期间)随时都可访问该位置。
应用中被标记为支持直接启动的组件必须使用设备保护存储区来存储直接启动模式期间应用操作所需的任何数据。在用户解锁设备后,用户仍可访问凭据保护存储区。
要访问设备保护存储区,您需要为所有文件相关的 API 另外创建并使用一个 Context 对象:
-
Context deviceProtectedContext = context.createDeviceProtectedStorageContext();
-
deviceProtectedContext.openFileInput( ... )
当您的应用更新到支持直接启动的版本之后,您之前保存的共享首选项或数据库可能需要迁移到设备保护存储区。在访问该存储区之前,即使数据已从旧版本或其他设备中备份并恢复,您仍应使用 Context.moveSharedPreferencesFrom() 和 Context.moveDatabaseFrom(),以确保应用能够继续正常运行。
注意事项:
1.您应审慎考虑要在设备保护存储区中存储哪些数据。应尽量减少在设备保护存储区中存储的数据,以确保您的应用在直接启动期间正常运行为限。例如,在短信应用中,您可以存储一个访问令牌,其作用域仅限于能够访问服务器上的新消息数量。所有敏感的私人信息(例如完整的短信历史记录和读/写访问令牌)仍应保存在凭据保护存储区中。
2.另外需要提醒的一点是:在直接启动期间,应用只能访问其他支持直接启动的应用和组件。如果您的应用依赖外部服务和 Activity,请确保妥善处理外部服务和 Activity 不可用的情形。默认情况下,Intent 过滤器仅匹配当前用户状态(已锁定/已解锁)下可用的组件。现在有两个新的标志,可用于向 Package Manager 显式声明需要枚举哪些组件:PackageManager.MATCH_DIRECT_BOOT_AWARE 和 PackageManager.MATCH_DIRECT_BOOT_UNAWARE。
3.DBM模式下的APP只能和同在此模式中的APP通信。
第一次使用直接启动创建设备保护存储区的方法:
一台安装了Android N的设备,第一次使用要创建这个Device protected storage[设备保护存储区]加密分区,方式有:
- 设备的setting中修改:Settings > Developer options > Convert to file encryption
- fastboot中修改:
$ adb reboot-bootloader $ fastboot --wipe-and-use-fbe
或者,您也可以使用模拟的直接启动模式。若要启用模拟直接启动模式,请在设备上设置锁定模式,如果在设置锁定模式时系统提示安全启动屏幕,则选择“No thanks”,然后使用以下 adb shell 命令启用和禁用模拟:
-
$ adb shell sm set-emulate-fbe true
-
$ adb shell sm set-emulate-fbe false
请注意,使用这些命令会导致设备重启。您只应在测试设备上使用模拟直接启动模式,因为该模式可能导致数据丢失。
欢迎阅读,讨论,指正.