DirectBoot(简称DB)是Android N新引入的一个特性,本质上是对数据访问做了限制。在用户开机但未解锁之前,应用只能访问这个安全区内的数据,从而保护用户隐私安全。
Android N上把数据分成了两块,分别是:

1、凭据保护存储区(credential-protected),这是所有应用的默认存储位置,仅在用户解锁设备后可用。

2、设备保护存储区(device-protected),这是一个新的存储位置,当设备启动后(包括DB阶段)随时都可访问该位置.

由于在DB模式下,用户没有办法访问到凭据保护保护存储区,所以在这个时刻访问sharedPreference时会报错,所以需要在DB模式下访问sharedPreference时需要增加判断,以免程序崩溃。

判断设备当前是否在DB模式:

public static boolean isDirectBootMode(Context context) {

boolean enabled = false;

DevicePolicyManager devicePolicyManager = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);

if (devicePolicyManager != null) {

try{enabled=devicePolicyManager.getStorageEncryptionStatus()==DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE_PER_USER;

} catch (IllegalStateException e) {

return enabled;

如果在DB模式下访问sharedPreference需要做如下处理:

if (StateUtils.isDirectBootMode(context)) {

final Context deviceContext = context.createDeviceProtectedStorageContext();

context=deviceContext //将context替换调再访问

} else {

//todo

要使app在Direct Boot模式下能运行,除了在Manifest里进行的显示声明外(android:directBootAware=”true”),需要将在Direct Boot模式下运行时涉及的数据存储到Device protected storage,注意只应该将能使app在Direct Boot模式下运行必须的数据存放在Device protected storage,其他的一些用户敏感数据应该放在Credential protected storage,要访问Device protected storage,需要在使用所有文件相关的API时,用以下的Context(

context.createDeviceProtectedStorageContext()),可以使用moveSharedPreferencesFrom() 和Context.moveDatabaseFrom() 对原来的数据进行转存.

AMS的systemReady中,startHomeOnAll Di splays,起的是com. android .settings/.FallbackHome , 几秒后才起 com.***.***/.DefaultActivity。 开机动画结束后进入开机向导前出现黑屏的原因是: 开机向导没有设置过 android : di rect Boot Aware="true"属性,因此它必须要等动画结束,ACTION_USER_UNLOCKED发送后,fallbackhome才能退出并加载启动开机向导,这样就会引起黑屏现象。 di rect boot Android brings various features for users and developers, one such feature was added in Android 7, called Di rect Boot , but what exactly is Di rect Boot ? Let’s try to find that in the next few m... 当手机已经通电开机但是用户并有解锁锁屏的时候, Android N运行于一个安全的 模式 ,也就是 Di e rect Boot 模式 。 ​ 为了支持 Di e rect Boot 模式 ,系统提供了两个存储数据的地方: 1.Credential encrypted storage,默认存储数据的地方,仅在用户解锁手机后可用。2.Device encrypted storage,主要对应的就是 Di rect Boot 使用的... 安卓各个可以在application、Service、Receiver等组件下加 android : di rect Boot Aware标签提前启动这些组件,被称为直接启动 模式 。那这个参数的意义是啥? Di rect Boot 阻塞开机 Di rect Boot 介绍 当设备已开机但用户尚未解锁设备时, Android 7.0 将在安全的“直接启动” 模式 下运行。为支持此 模式 ,系统为数据提供了两个存储位置: (Credential encrypted storage)凭据加密存储,这是默认存储位置,仅在用户解锁设备后可用。 (Device encrypted storage)设备加密存储,该存储位置在“直接启动” 模式 下和用户解锁设备后均可使用。 默认情况下,应用不会在 Di rect Boot 模式 下运行,如果需要在该 模式 Android M及之前,当开机启动到锁屏界面时,所有程序阻塞,等待用户解锁(即使未设置开机密码,也需要滑屏解锁)后才会继续。 而 Android 7.0引入了 Di rect Boot 模式 ,当手机已经通电开机但是用户并有解锁锁屏的时候, Android N运行于一个安全的 模式 ,也就是 Di e rect Boot 模式 。 而 Di rect Boot 模式 下,仅限于运行一些关... Di rect Boot Mode—— 设备启动后进入的一个新 模式 ,直到用户解锁(unlock)设备此阶段结束。 在此 Di rect Boot Mode 下 APP 比较适合做一些: Alarm、clock 类的操作,如闹钟需要做重要的或紧急的通知,如短信应用底层服务类,如辅助工具服务 请注意,以上并非详尽的用例列表,我们期待看到还有哪些类 问题:自己写了一个应用,在systemserver.java里指定包名和类名使用Intent启动,竟然启动不了?但是使用 am start命令可以启动,发现系统应用需要在 Android Manifest.xml声明 android :defaultToDeviceProtectedStorage=”true” 1.在 Android Manifest.xml里添加 <application 为了支持 Di e rect Boot 模式 ,系统提供了两个存储数据的地方: 1.Credential encrypted storage,默认存储数据的地方,仅在用户解锁手机后可用。 2.Device encrypted storage,主要对应的就是 Di rect Boot 使用的存储空间。在 Di rect Boot 模式 下和用户解锁手机后都可以使用的存储空间 一般情况下,应用是无法在 Di rect Boot ... Android N 引入了一个新的特性 Di rect Boot Mode ,设备启动后进入一个新的 模式 ,直到用户解锁后,此 模式 才会消失。此时若想启动应用,应用必须先向系统注册其组件,然后才能在 Di rect Boot Mode 模式 下运行或访问设备加密存储。 应用通过将组件标记为“加密感知”来注册系统。 若要将您的组件标记为加密感知,请在 Android Manifest.xml中将 android :...