Android N“直接启动”是什么神奇的功能?
从AndroidN开始,在首次开机时,在用户尚未来得及解锁设备之前,设备可直接启动到一种名为DirectBoot(直接启动)的新模式中。...
从 Android N 开始,在首次开机时,在用户尚未来得及解锁设备之前,设备可直接启动到一种名为 Direct Boot(直接启动)的新模式中。在此模式下,操作系统可以全功能运行,但不允许访问私有应用数据,只能运行经过更新、可支持直接启动功能的应用。
直接启动适合我的应用吗?
并非所有应用都应运行在直接启动模式下,因此,在开始编码之前,请务必先检查您的应用是否符合以下常见的用例:
- 安排闹铃的应用,如闹钟。
- 提供重要且及时的通知的应用,如短信应用。
- 为其他应用或系统提供服务的应用,例如辅助工具服务。
让您的应用支持直接启动
为了让您的应用能够在用户解锁设备之前运行,您必须在清单文件中将组件显式标记为支持直接启动:
对于需要在直接启动模式下在系统启动之后尽快运行的应用,现在提供一种新的 Intent.ACTION_LOCKED_BOOT_COMPLETED 广播。在用户解锁该设备之后,所有应用仍将收到 Intent.ACTION_BOOT_COMPLETED 广播。
使用设备保护存储区
为了支持应用在用户提供解锁私有应用数据所需的凭据之前的正常运行,所有 Android N 设备现在均提供两个数据存储位置:
- 凭据保护存储区,这是所有应用的默认存储位置,仅在用户解锁设备后可用。
- 设备保护存储区,这是一个新的存储位置,当设备启动后(包括直接启动期间)随时都可访问该位置。
要访问设备保护存储区,您需要为所有文件相关的 API 另外创建并使用一个 Context 对象:
- Context deviceProtectedContext = context.createDeviceProtectedStorageContext();
- deviceProtectedContext.openFileInput( ... )
注意事项
您应审慎考虑要在设备保护存储区中存储哪些数据。应尽量减少在设备保护存储区中存储的数据,以确保您的应用在直接启动期间正常运行为限。例如,在短信应用中,您可以存储一个访问令牌,其作用域仅限于能够访问服务器上的新消息数量。所有敏感的私人信息(例如完整的短信历史记录和读/写访问令牌)仍应保存在凭据保护存储区中。
另外需要提醒的一点是:在直接启动期间,应用只能访问其他支持直接启动的应用和组件。如果您的应用依赖外部服务和 Activity,请确保妥善处理外部服务和 Activity 不可用的情形。默认情况下,Intent 过滤器仅匹配当前用户状态(已锁定/已解锁)下可用的组件。现在有两个新的标志,可用于向 Package Manager 显式声明需要枚举哪些组件:PackageManager.MATCH_DIRECT_BOOT_AWARE 和 PackageManager.MATCH_DIRECT_BOOT_UNAWARE。
未来计划
在原生支持直接启动的 Android N 设备发布之前,您可以使用 Android N 开发者预览版测试您的应用。在 Nexus 5X 和 Nexus 6P 上,您可以通过使用 Settings > Developer options > Convert to file encryption 来擦除所有用户数据并启用完整的直接启动模式。或者,您也可以重新启动到引导装载程序并发出相应的快速启动命令:
- $ 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
关注 Android Development Patterns Collection,了解更多详情:
plus.sandbox.google.com/collection/sLR0p
原文来自【Android 开发者全球博客】:
android-developers.blogspot.com
中文翻译文章【中国谷歌开发者社区论坛】(文末“阅读原文”):
chinagdg.com/thread-32295-1-1.html
关注 谷歌开发者
微信扫一扫关注公众号