原文地址:http://android-developers.blogspot.com/2016/04/developing-for-direct-boot.html
从Android N开始,在用户解锁设备前,设备可以在第一时间进入新的模式(Direct Boot)。在这种模式下,操作系统是正常运行的,但对应用私有数据的访问会受到限制,并且只有升级到 Direct Boot award 的应用可以运行。
Direct Boot 适合我的应用吗?
并不是所有的应用都应该运行在 Direct Boot 模式的,所以在编写你的代码前,先检查一下你的应用是否符合以下几种情况:
- 定时发出警报的应用,如闹钟
- 提供重要且及时通知的应用,如短信
- 为其他应用或系统提供服务的应用,如后台服务
让你的应用成为Direct Boot award
为了让你的应用可以运行在锁定状态下,你必须在manifest中显式标记组件为Direct Boot award
<activity|provider|receiver|service ...
android:directBootAware=”true”>
你可以从应用中选出需要标记为 Direct Boot award的组件作为一个子集,但如果你用的是自定义的application类,当所有组件被标记为 Direct Boot award 时,你的应用会被默认的标记为 Direct Boot award 。
对那些需要在操作系统进入Direct Boot模式就开始运行的应用,我们提供了一个新的Intent.ACTION_LOCKED_BOOT_COMPLETED广播。在用户解锁设备后,所有的应用仍会收到Intent.ACTION_BOOT_COMPLETED广播。
使用设备受保护的储存区
为了在用户提供解锁应用私有数据的签名前运行应用,所有的Android N设备为数据提供了两个储存区:
- Credential protected storage,这是所有应用的默认存储区域,只有在用户解锁设备后才能使用
- Device protected storage,这是新的储存区域。当设备启动后,可以在任何时刻访问这个储存区域,包括在Direct Boot模式中
为了访问Device protected storage,你需要为所有文件相关的APIs创建并使用间接的Context对象
Context deviceProtectedContext = context.createDeviceProtectedStorageContext();
deviceProtectedContext.openFileInput( ... )
当你的应用升级到Direct Boot award版本,你可能需要把一些以前保存的设置参数或者数据库迁移到Device protected storage中去。在访问这些设置和数据之前,你应该使用Context.moveSharedPreferencesFrom()和Context.moveDatabaseFrom(),这样即使数据是从旧版本或其他设备中备份和恢复的,应用也可以继续正常工作。
注意事项
你应该小心考虑在Device protected storage中储存什么数据。这些数据应该是能让应用运行在Direct Boot模式的最小数据集。例如,在消息应用中,你可以用小区域存储一个仅能访问新消息数量的访问令牌。所有敏感的私人信息,例如完整的信息历史记录和读写访问令牌,仍应该存放在Credential protected storage中。
另一个要注意的是,在Direct Boot模式中,应用只能访问其他的Direct Boot award应用和组件。如果你的应用依赖于外部Services和Activities时,请确保妥善处理外部Services和Activities不可用的情况。Intent filters会默认匹配当前状态下(锁定/解锁)可用的组件。这里有两个新的标识可以明确的告诉Package Manager哪些组件是可用的:
- PackageManager.MATCH_DIRECT_BOOT_AWARE
- PackageManager.MATCH_DIRECT_BOOT_UNAWARE
在Android N设备发布之前,你可以用Android N Preview builds测试你的应用。在Nexus 5X 和 Nexus 6P上,你可以通过Settings > Developer options > Convert to file encryption清除所有用户数据并使你的设备完全运行在Direct Boot模式。或者,你可以重启并进入Bootloader,然后发出以下命令:
$ adb reboot-bootloader
$ fastboot --wipe-and-use-fbe
警告:这两种方法都会使你的设备恢复出厂设置并删除所有的用户数据。
此外,你可以用虚拟Direct Boot模式。如果出现提示安全启动屏幕时请选择“No thanks”,然后用下面的adb shell命令启动/关闭虚拟Direct Boot模式:
$ adb shell sm set-emulate-fbe true
$ adb shell sm set-emulate-fbe false
请注意,使用这些命令会使你的设备重启。你应该只在测试设备上使用虚拟Direct Boot模式,因为这有可能导致数据丢失。