本文只分析手机加密后,启动到输入密码的界面的流程。
一. 加密后,系统服务针对加密功能做了什么?
最先启动的是SystemServer,调用ServerThread的initAndLoop()方法,开始启动系统的其他的服务。
在该文件中搜索“crypt”,得到如下内容:
1.
private static final String ENCRYPTING_STATE = "trigger_restart_min_framework";
private static final String ENCRYPTED_STATE = "1";
从常量字符串的英文可以看出来是在手机加密完毕后重启进入最小framework系统的状态。
2.
Slog.i(TAG, "Package Manager");
// Only run "core" apps if we're encrypting the device.
String cryptState = SystemProperties.get("vold.decrypt");
if (ENCRYPTING_STATE.equals(cryptState)) {
Slog.w(TAG, "Detected encryption in progress - only parsing core apps");
onlyCore = true;
} else if (ENCRYPTED_STATE.equals(cryptState)) {
Slog.w(TAG, "Device encrypted - only parsing core apps");
onlyCore = true;
}
log中已经注明了,对于Package Manager来说,在加密状态下,只加载核心(core)应用,那么什么样的应用算是core应用呢?这也是本文重点关注的内容。我们在接下来的内容中进行探索。
接着看代码,vold.decrypt在第一次加密重启时,设置为” trigger_restart_min_framework“, 当加密完毕后重启时,就会被设置为”1”。此时onlyCore被设置为true。
3
.
pm = PackageManagerService.main(context, installer,
factoryTest != SystemServer.FACTORY_TEST_OFF,
onlyCore);
try {
firstBoot = pm.isFirstBoot();
} catch (RemoteException e) {
}
调用PackageManagerService的静态方法main()开始创建PackageManagerService的对象,并做一些初始化工作。可以看到,main()方法的最后一个参数就是上一