1.前言
在SystemServer初始化过程当中,会调用PackageManagerService.main方法进行pms的初始化,那么我们就看看pms的初始化过程经历了什么。
|
|
2.从pms构造函数说起
pms的构造函数相当长,根据gityuan大神的提示,按照log的打印进行分布查看却是清晰了很多。
2.1 BOOT_PROGRESS_PMS_START
|
|
- 构造Settings对象,添加shareUserId
- 构造SystemConfig,获取mSystemPermissions灯属性
- 创建data/data,data/app/,data/app-lib,data-asec,data/user,data/app-privat等file对象
- 从systemConfig中获取到所有的共享库,添加到mSharedLibraries中,
2.2 PMS_SYSTEM_SCAN_START
|
|
扫描阶段,这个阶段主要是对 包进行解析,得到组件信息等内容,并且根据需要进行dex优化。
首先将BOOTCLASSPATH,SYSTEMSERVERCLASSPATH这两个环境变量下的路径加入到不需要dex优化列表,在我的小米note手机上,BOOTCLASSPATH内容为下,
1/system/bin/sh: /system/framework/core-libart.jar:/system/framework/conscrypt.jar:/system/framework/okhttp.jar:/system/framework/core-junit.jar:/system/framework/bouncycastle.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/telephony-common.jar:/system/framework/voip-common.jar:/system/framework/ims-common.jar:/system/framework/apache-xml.jar:/system/framework/org.apache.http.legacy.boot.jar:/system/framework/tcmiface.jar:/system/framework/qcmediaplayer.jar:/system/framework/WfdCommon.jar:/system/framework/qcom.fmradio.jar:/system/framework/oem-services.jar:/system/framework/com.qti.dpmframework.jar:/system/framework/dpmapi.jar:/system/framework/com.qti.location.sdk.jar:/system/app/miui/miui.apk:/system/app/miuisystem/miuisystem.apk: not found
SYSTEMSERVERCLASSPATH内容为下
1
/system/bin/sh: /system/framework/services.jar:/system/framework/wifi-service.jar:/system/framework/ethernet-service.jar: not found
- 获取构建时指定的cpu指令
- 根据cpu指令得到SharedLibrarie,判断是否需要dex优化,进行dex优化,并加入到alreadyDexOpted列表中
- 将framework/framework-res.apk,framework/core-libart.jar,等加入到已优化列表
- 将framework目录下,其他的apk或者jar,进行dex优化并加入已优化列表
- 收集解析/vendor/overlay,/system/framework,/system/priv-app,/system/app,/vendor/priv-app,/vendor/app,/oem/app目录下app的信息
- 删除系统不存在的包removePackageLI
- 清理安装失败的包 cleanupInstallFailedPackage
- 删除临时文件
- 移除不想干的包中的shared userIDs
2.3 BOOT_PROGRESS_PMS_DATA_SCAN_START
|
|
- mOnlyCore为false的情况下,会扫描/data/app,/data/app-private目录,
2.4 PMS_SCAN_END
|
|
- 当sdk版本不一致时,需要更新权限
- 当这是ota后的首次启动,正常启动则需要清除目录的缓存代码
- 当权限和其他默认项都完成更新,则清理相关信息
- 信息写回packages.xml文件
这部分不是很懂。
2.5 BOOT_PROGRESS_PMS_READY
|
|
- 初始化PackageInstallerService
- gc,回收下内存
3.Settings
这个类负责读取data/system下的几个xml文件。收集其中的一些信息。
- packages.xml 记录所有安装app的信息
- packages-backup.xml 备份文件
- packages-stopped.xml 记录系统被强制停止的文件
- packages-stopped-backup.xml 备份文件
- packages.list 记录应用的数据信息
4.scanDirLI
这个方法会调用scanPackageLI对apk进行扫描解析,在这里,会构造PackageParser.Package对象,并进行解析。
|
|
重点看解析部分的代码。
|
|
三名两个的区别就是 单个apk文件和apks。不管是单个 还是文件夹,都会调用parseBaseApk去解析,
|
|
在这里,会拿到配置文件,调用4个参数的这个方法去解析。这个方法里面都是类似这样的代码。
|
|
用xml解析 去解析配置文件中的各个标签,并且在parseBaseApplication中,会解析初我们的四大组件并存储起来。
|
|
这里就不多说了。
4. dex优化
在Installer中,
|
|
进行参数封装,
|
|
在transact中,通过connect,socket连接installd守护进程,并通过writeCommand写入dex优化命令,用installd来完成dex优化。
参考资料
- gityuan
- Android 5.0 源代码