了解了Android系统的启动过程的读者应该知道,Android的所有Java服务都是通过SystemServer进程启动的,并且驻留在SystemServer进程中。SystemServer进程在启动时,通过创建一个ServerThread线程来启动所有服务,本文主要介绍Android服务中PackageManagerService服务启动过程。首先介绍一些PackageManagerService服务下的相关类关系图:
在SystemServer进程的ServerThread线程中,执行以下代码启动PackageManagerService服务:
- // 通过读取属性来判断运行核心应用
- String cryptState = SystemProperties.get("vold.decrypt");
- boolean onlyCore = false;
- 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;
- }
- //启动PackageManagerService
- pm = PackageManagerService.main(context,
- factoryTest != SystemServer.FACTORY_TEST_OFF,
- onlyCore);
- boolean firstBoot = false;
- //判断PackageManagerService是否是第一次启动,SystemServer进程被杀后会被重启
- try {
- firstBoot = pm.isFirstBoot();
- } catch (RemoteException e) {
- }
- //PackageManagerService执行dex优化
- ...
- try {
- pm.performBootDexOpt();
- } catch (Throwable e) {
- reportWtf("performing boot dexopt", e);
- }
首先启动PackageManagerService,然后判断该服务是否是第一次启动,接着执行dex优化。
- public static final IPackageManager main(Context context, boolean factoryTest,
- boolean onlyCore) {
- //构造PackageManagerService服务对象
- PackageManagerService m = new PackageManagerService(context, factoryTest, onlyCore);
- //注册PackageManagerService服务
- ServiceManager.addService("package", m);
- return m;
- }