本站已关停,现有内容仅作科研等非赢利用途使用。特此声明。
查看: 3699|回复: 0
打印 上一主题 下一主题

专为直接启动(Direct Boot)而开发

[复制链接]
跳转到指定楼层
1#
发表于 2016-5-26 11:52:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 truthrudy 于 2016-5-26 14:30 编辑

发布人:开发顾问 Wojtek Kaliciński


从 Android N 开始,在首次开机时,在用户尚未来得及解锁设备之前,设备可直接启动到一种名为 Direct Boot(直接启动)的新模式中。在此模式下,操作系统可以全功能运行,但不允许访问私有应用数据,只能运行经过更新、可支持直接启动功能的应用。


直接启动适合我的应用吗?
并非所有应用都应运行在直接启动模式下,因此,在开始编码之前,请务必先检查您的应用是否符合以下常见的用例:
  • 安排闹铃的应用,如闹钟。
  • 提供重要且及时的通知的应用,如短信应用。
  • 为其他应用或系统提供服务的应用,例如辅助工具服务。

请注意,以上并非详尽的用例列表,我们期待看到还有哪些类型的应用能够从直接启动模式获益。


让您的应用支持直接启动
为了让您的应用能够在用户解锁设备之前运行,您必须在清单文件中将组件显式标记为支持直接启动
<activity|provider|receiver|service ...
       android:directBootAware=”true”>   
您可以选择您的应用中需要支持直接启动的组件子集,但如果您使用的是自定义 Application 类,则假定应用内部标记为支持直接启动的任何组件均支持直接启动。

对于需要在直接启动模式下在系统启动之后尽快运行的应用,现在提供一种新的Intent.ACTION_LOCKED_BOOT_COMPLETED 广播。在用户解锁该设备之后,所有应用仍将收到Intent.ACTION_BOOT_COMPLETED 广播。


使用设备保护存储区
为了支持应用在用户提供解锁私有应用数据所需的凭据之前的正常运行,所有 Android N 设备现在均提供两个数据存储位置:
  • 凭据保护存储区,这是所有应用的默认存储位置,仅在用户解锁设备后可用
  • 设备保护存储区,这是一个新的存储位置,当设备启动后(包括直接启动期间)随时都可访问该位置。

应用中被标记为支持直接启动的组件必须使用设备保护存储区来存储直接启动模式期间应用操作所需的任何数据。在用户解锁设备后,用户仍可访问凭据保护存储区。

要访问设备保护存储区,您需要为所有文件相关的 API 另外创建并使用一个 Context 对象:
Context deviceProtectedContext = context.createDeviceProtectedStorageContext();
deviceProtectedContext.openFileInput( ... )  

当您的应用更新到支持直接启动的版本之后,您之前保存的共享首选项或数据库可能需要迁移到设备保护存储区。在访问该存储区之前,即使数据已从旧版本或其他设备中备份并恢复,您仍应使用 Context.moveSharedPreferencesFrom() 和Context.moveDatabaseFrom(),以确保应用能够继续正常运行。


注意事项
您应审慎考虑要在设备保护存储区中存储哪些数据。应尽量减少在设备保护存储区中存储的数据,以确保您的应用在直接启动期间正常运行为限。例如,在短信应用中,您可以存储一个访问令牌,其作用域仅限于能够访问服务器上的新消息数量。所有敏感的私人信息(例如完整的短信历史记录和读/写访问令牌)仍应保存在凭据保护存储区中。

另外需要提醒的一点是:在直接启动期间,应用只能访问其他支持直接启动的应用和组件。如果您的应用依赖外部服务和 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   

请注意,使用这些命令会导致设备重启。您只应在测试设备上使用模拟直接启动模式,因为该模式可能导致数据丢失。


#BuildBetterApps
关注 Android Development Patterns Collection,了解更多详情!


ChinaGDG.com
回复

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表