应用对于Android系统来说至关重要,系统会有几个时机对APP进行解析,一个是APK安装的时候会进行解析,还有一个就是系统在重启之后会进行解析,这里就简单的记录一下重启的时候APK的解析过程。
一、SystemServer
系统在启动之后从内核层启动第一个用户控件Init进程,再通过Init进程启动系统中第一个java 进程zygote,随之zygote fock出SystemServer,SystemServer再开始启动一些列系统服务,其中就包括PackageMangerService,在startBootstrapServices函数中:
public final void startBootstrapServices(TimingsTraceAndSlog timingsTraceAndSlog) {
.....
// 先调用了PackageManagerService的main函数
Pair<PackageManagerService, IPackageManager> main = PackageManagerService.main(context, installer, domainVerificationService, z, this.mOnlyCore);
// main 函数创建了PackageManagerService 和IPackageManager 的实例
this.mPackageManagerService = (PackageManagerService) main.first;
IPackageManager iPackageManager = (IPackageManager) main.second;
Watchdog.getInstance().resumeWatchingCurrentThread("packagemanagermain");
// 该方法将在 BaseDexClassLoader 中安装一个报告器,同时还将强制报告系统服务器已加载的任何 dex 文件
SystemServerDexLoadReporter.configureSystemServerDexReporter(iPackageManager);
this.mFirstBoot = this.mPackageManagerService.isFirstBoot();
this.mPackageManager = this.mSystemContext.getPackageManager();
二、PackageManagerService
在SystemServer中是先调用PackageManagerService的main函数来初始化它自己的,来看看它做了什么:
public static Pair<PackageManagerService, IPackageManager> main(Context context,
Installer installer, @NonNull DomainVerificationService domainVerificationService,
boolean factoryTest, boolean onlyCore) {
PackageManagerServiceCompilerMapping.checkProperties();
final TimingsTraceAndSlog t = new TimingsTraceAndSlog(TAG + "Timing",
Trace.TRACE_TAG_PACKAGE_MANAGER);
t.traceBegin("create package manager");
final PackageManagerTracedLock lock = new PackageManagerTracedLock();
final Object installLock = new Object();
// 创建自带handler的线程
HandlerThread backgroundThread = new ServiceThread("PackageManagerBg",
Process.THREAD_PRIORITY_BACKGROUND, true /*allowIo*/);
backgroundThread.start();
Handler backgroundHandler = new Handler(backgroundThread.getLooper());
// 创建PackageManagerServiceInjector 用来持有管理其他一系列重要的类实例
PackageManagerServiceInjector injector = new PackageManagerServiceInjector(
context, lock, installer, installLock, new PackageAbiHelperImpl(),
backgroundHandler,
SYSTEM_PARTITIONS,
// 解析compnent的
(i, pm) -> new ComponentResolver(i.getUserManagerService(), pm.mUserNeedsBadging),
// 权限管理服务
(i, pm) -> PermissionManagerService.create(context,
i.getSystemConfig().getAvailableFeatures()),
// 用户管理服务
(i, pm) -> new UserManagerService(context, pm,
new UserDataPreparer(installer, installLock, context, onlyCore),
lock),
// 系统数据库,用来访问系统数据库的
(i, pm) -> new Settings(Environment.getDataDirectory(),
RuntimePermissionsPersistence.createInstance(),
i.getPermissionManagerServiceInternal(),
domainVerificationService, backgroundHandler, lock),
(i, pm) -> AppsFilterImpl.create(i,
i.getLocalService(PackageManagerInternal.class)),
// compat服务用来管理一些系统特性
(i, pm) -> (PlatformCompat) ServiceManager.getService("platform_compat"),
// 系统配置服务,预置的系统的权限、硬件feature还有其他的一些配置在这里面解析
(i, pm) -> SystemConfig.getInstance(),
// 在软件包上运行 dexopt 命令的辅助类。
(i, pm) -> new PackageDexOptimizer(i.getInstaller(), i.getInstallLock(),
i.getContext(), "*dexopt*"),
// dex 行为管理类会保存所有包的dex位置
(i, pm) -> new DexManager(i.getContext(), i.getPackageDexOptimizer(),
i.getInstaller(), i.getInstallLock()),
(i, pm) -> new ArtManagerService(i.getContext(), i.getInstaller(),
i.getInstallLock()),
(i, pm) -> ApexManager.getInstance(),
(i, pm) -> new ViewCompiler(i.getInstallLock(), i.getInstaller()),
(i, pm) -> (IncrementalManager)
i.getContext().getSystemService(Context.INCREMENTAL_SERVICE),
(i, pm) -> new DefaultAppProvider(() -> context.getSystemService(RoleManager.class),
() -> LocalServices.getService(UserManagerInternal.class)),
(i, pm) -> new DisplayMetrics(),
// 包解析类
(i, pm