PackageManagerService是Android系统中最常用的服务之一。它负责系统中Package的管理,应用程序的安装、卸载、信息查询等。
我们在使用PKMS的时候,一般都是这样用的,
PackageManager packageManager = getApplicationContext().getPackageManager();
packageManager是一个抽象类,ApplicationPackageManager现实了它
而APM里的功能都是有mPM的成员变量实现的,它的类型就是IPackageManager。
这个mPM就是PackageManagerService在客户端的一个代理,通过这个代理客户端可以调用到PackageManagerService中的一些方法。
这个是一个aidl文件,这个可以用AndroidStudio工具可以看到它的java类,如下图
PKMS是在SystemServer启动的,在SystemServer的run方法
**那么在PKMS启动之前都有哪些服务已经启动呢,通过源码得知这个几个先于PKMS
Install,msgmonitorservice,AMS,PMS,LightsService,DisplayManagerService。**
这里边最重要的就是这个构造方法,这个方法做了很多工作。主要的功能扫描系统几个目标文件夹中APK,保存Package信息、四大组件信息、权限信息等各种信息。
(1)扫描文件之前工作:
这个Settings类就是管理Android系统运行过程中的一些设置信息。这里会跟XML联系起来的,先不做详解介绍。
然后会解析data/system目录下的package.xml文件,
这里SELinuxMMAC是什么?这个就涉及到了Android机制SEAndroid安全机制,这是个NSA专门在SELinux基础上为Android开发的。
解析完成之后都保存在Setting所对应的的数据结构里边。
(2)扫描目标文件夹
一定会扫描的目录
custom/framework
system/ framework
vender/ framework
system/ priv-app
system/ app
vender/ priv-app
vender/ app
vender /operator/app
system/plugin
vender/ plugin
oem/app
触发条件 !SystemProperties.get(“ro.mtk_carrierexpress_pack”).equals(“”)
SystemProperties.get(“persist.operator.optr”)有值
custom/overlay
触发条件 SystemProperties.get(“ro.mtk_carrierexpress_inst_sup”)=“1”,SystemProperties.get(“persist.operator.optr”);有值
custom/usp
system/usp
触发条件mOnlyCore = false ,SystemProperties.get(“vold.decrypt”);这个是一个系统加密的东西,这个不做详细介绍
data/app
data/ app-private
data/ app-ephemeral
下图是测试手机的根路径
接下来我们我们就来分析scanDirLI(File dir, final int parseFlags, int scanFlags, long currentTime)方法
scanPackageLI()扫描apk,
这个PackageParser主要负责来解析APK文件的
parseClusterPackageLite(File packageDir, int flags){
.........
for (File file : files){
if(isApkFile(file)){
final ApkLite lite = parseApkLite(file, flags);
}
}
........
return new PackageLite(codePath, baseApk, splitNames, splitCodePaths,
splitRevisionCodes);
}
这里解析xml,获取签名信息,parseApkLite()这个方法解析AndroidMainfest里边的”package”,”split”,”installLocation “,”versionCode”,”revisionCode”,”coreApp”,返回将上述信息构造好的ApkLite对象。接下来继续分析parseBaseApk方法这个也是轻量级解析XML文件,里边的主要方法是parseBaseApkCommon(),看源码可以知道解析AndroidMainfest里边的这些节点application,overlay,key-sets,permission-group,permission,permission-tree,uses-permission,里边的parseBaseApplication()
下图是截图函数的一部分
主要解析application节点的这些子节点activity,receiver,provider,library,uses-library,service,然后把这些解析出来的属性生成相应的对象,传入到packageParser内部静态类Package当中。
系统是怎么解析APK里边资源等等信息,这里就是另外一个课题Android资源管理框架(Asset Manager) 下章继续…..