Android N“直接启动”是什么神奇的功能?


Android N“直接启动”是什么神奇的功能?



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



直接启动适合我的应用吗?并非所有应用都应运行在直接启动模式下,因此,在开始编码之前,请务必先检查您的应用是否符合以下常见的用例:
  • 安排闹铃的应用,如闹钟。

  • 提供重要且及时的通知的应用,如短信应用。

  • 为其他应用或系统提供服务的应用,例如辅助工具服务。


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

让您的应用支持直接启动

为了让您的应用能够在用户解锁设备之前运行,您必须在清单文件中将组件显式标记为支持直接启动:

  1. <activity|provider|receiver|service ...  

  2.     android:directBootAware=”true”>  


您可以选择您的应用中需要支持直接启动的组件子集,但如果您使用的是自定义 Application 类,则假定应用内部标记为支持直接启动的任何组件均支持直接启动。对于需要在直接启动模式下在系统启动之后尽快运行的应用,现在提供一种新的 Intent.ACTION_LOCKED_BOOT_COMPLETED 广播。在用户解锁该设备之后,所有应用仍将收到 Intent.ACTION_BOOT_COMPLETED 广播。

使用设备保护存储区为了支持应用在用户提供解锁私有应用数据所需的凭据之前的正常运行,所有 Android N 设备现在均提供两个数据存储位置:
  • 凭据保护存储区,这是所有应用的默认存储位置,仅在用户解锁设备后可用

  • 设备保护存储区,这是一个新的存储位置,当设备启动后(包括直接启动期间)随时都可访问该位置。

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


要访问设备保护存储区,您需要为所有文件相关的 API 另外创建并使用一个 Context 对象:

  1. Context deviceProtectedContext = context.createDeviceProtectedStorageContext();  

  2. 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 来擦除所有用户数据并启用完整的直接启动模式。或者,您也可以重新启动到引导装载程序并发出相应的快速启动命令:

  1. $ adb reboot-bootloader  

  2. $ fastboot --wipe-and-use-fbe

警告:这两种方法都将执行恢复出厂设置并删除设备中的所有用户数据。


或者,您也可以使用模拟的直接启动模式。若要启用模拟直接启动模式,请在设备上设置锁定模式,如果在设置锁定模式时系统提示安全启动屏幕,则选择“No thanks”,然后使用以下 adb shell 命令启用和禁用模拟:

  1. $ adb shell sm set-emulate-fbe true  

  2. $ adb shell sm set-emulate-fbe false    


请注意,使用这些命令会导致设备重启。您只应在测试设备上使用模拟直接启动模式,因为该模式可能导致数据丢失
### Linux内核在Android启动流程中的作用 Linux内核在Android系统的启动过程中扮演着至关重要的角色,主要体现在以下几个方面: 1. **硬件初始化** 内核负责对设备的硬件进行基本的初始化操作,包括CPU、内存管理子系统、中断控制器等核心组件。这一阶段的工作确保了系统能够正确识别和使用硬件资源,为后续的操作系统功能提供支持[^3]。 2. **加载设备驱动程序** 为了支持各种硬件设备的功能,Linux内核会加载必要的设备驱动程序。这些驱动程序使得操作系统可以与硬件交互,例如访问存储设备、网络接口等[^3]。 3. **挂载根文件系统** 在完成硬件初始化和驱动程序加载后,Linux内核会挂载根文件系统(rootfs),这是用户空间所有进程的基础环境。根文件系统包含了系统运行所需的必要文件和目录结构,例如`/bin`、`/etc`、`/dev`等。 4. **启动init进程** 一旦内核完成了上述初始化任务并成功挂载了根文件系统,它会启动第一个用户空间进程——`init`进程(PID为1)。这个进程是整个Android系统的起点,负责进一步初始化系统环境,并按照配置文件(如`/init.rc`)执行后续的系统启动步骤[^2]。 5. **协调系统启动** `init`进程作为系统启动的核心,在Linux内核的支持下,负责挂载额外的文件系统、设置网络参数、启动守护进程等任务。此外,它还协调启动Android框架层的关键组件,例如Zygote进程和System Server[^2]。 6. **进程管理** Linux内核提供了进程管理的基础机制,`init`进程利用这些机制监视并重新启动在其管理下的关键进程,以确保系统的稳定性。例如,如果某个关键服务崩溃或异常退出,`init`进程会根据配置重新启动该服务。 7. **支持用户空间应用程序** 最终,Linux内核通过提供多任务处理、内存管理、设备驱动接口等功能,为Android框架层和应用程序层提供了底层支持。这使得用户可以通过图形界面与设备交互,并运行各种应用程序[^2]。 #### 示例代码:模拟init进程启动逻辑(非实际源码) ```c // 模拟init进程的启动过程 #include <stdio.h> #include <unistd.h> void mount_rootfs() { printf("Mounting root file system...\n"); } void setup_environment() { printf("Setting up system environment...\n"); } void start_zygote() { printf("Starting Zygote process...\n"); } int main() { mount_rootfs(); setup_environment(); start_zygote(); printf("System initialization complete.\n"); while (1) { // 持续运行以监控和重启子进程 sleep(1); } return 0; } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值