android系统源码之 系统应用安装过程(上)

PackageManagerService是Android系统中最常用的服务之一。它负责系统中Package的管理,应用程序的安装、卸载、信息查询等。
我们在使用PKMS的时候,一般都是这样用的,

PackageManager packageManager = getApplicationContext().getPackageManager();

packageManager是一个抽象类,ApplicationPackageManager现实了它
《android系统源码之 系统应用安装过程(上)》
《android系统源码之 系统应用安装过程(上)》
《android系统源码之 系统应用安装过程(上)》
而APM里的功能都是有mPM的成员变量实现的,它的类型就是IPackageManager。
这个mPM就是PackageManagerService在客户端的一个代理,通过这个代理客户端可以调用到PackageManagerService中的一些方法。
《android系统源码之 系统应用安装过程(上)》
《android系统源码之 系统应用安装过程(上)》
《android系统源码之 系统应用安装过程(上)》

这个是一个aidl文件,这个可以用AndroidStudio工具可以看到它的java类,如下图
《android系统源码之 系统应用安装过程(上)》
《android系统源码之 系统应用安装过程(上)》
《android系统源码之 系统应用安装过程(上)》
PKMS是在SystemServer启动的,在SystemServer的run方法
《android系统源码之 系统应用安装过程(上)》

**那么在PKMS启动之前都有哪些服务已经启动呢,通过源码得知这个几个先于PKMS
Install,msgmonitorservice,AMS,PMS,LightsService,DisplayManagerService。**
《android系统源码之 系统应用安装过程(上)》
《android系统源码之 系统应用安装过程(上)》

这里边最重要的就是这个构造方法,这个方法做了很多工作。主要的功能扫描系统几个目标文件夹中APK,保存Package信息、四大组件信息、权限信息等各种信息。
(1)扫描文件之前工作:
《android系统源码之 系统应用安装过程(上)》

这个Settings类就是管理Android系统运行过程中的一些设置信息。这里会跟XML联系起来的,先不做详解介绍。

《android系统源码之 系统应用安装过程(上)》

然后会解析data/system目录下的package.xml文件,

《android系统源码之 系统应用安装过程(上)》
这里SELinuxMMAC是什么?这个就涉及到了Android机制SEAndroid安全机制,这是个NSA专门在SELinux基础上为Android开发的。
《android系统源码之 系统应用安装过程(上)》
《android系统源码之 系统应用安装过程(上)》

《android系统源码之 系统应用安装过程(上)》
解析完成之后都保存在Setting所对应的的数据结构里边。
(2)扫描目标文件夹

《android系统源码之 系统应用安装过程(上)》
《android系统源码之 系统应用安装过程(上)》

一定会扫描的目录
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
下图是测试手机的根路径
《android系统源码之 系统应用安装过程(上)》

接下来我们我们就来分析scanDirLI(File dir, final int parseFlags, int scanFlags, long currentTime)方法

《android系统源码之 系统应用安装过程(上)》
《android系统源码之 系统应用安装过程(上)》
《android系统源码之 系统应用安装过程(上)》
《android系统源码之 系统应用安装过程(上)》

scanPackageLI()扫描apk,
《android系统源码之 系统应用安装过程(上)》

这个PackageParser主要负责来解析APK文件的

《android系统源码之 系统应用安装过程(上)》
《android系统源码之 系统应用安装过程(上)》

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);
}

《android系统源码之 系统应用安装过程(上)》
《android系统源码之 系统应用安装过程(上)》

这里解析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()
下图是截图函数的一部分

《android系统源码之 系统应用安装过程(上)》

主要解析application节点的这些子节点activity,receiver,provider,library,uses-library,service,然后把这些解析出来的属性生成相应的对象,传入到packageParser内部静态类Package当中。
系统是怎么解析APK里边资源等等信息,这里就是另外一个课题Android资源管理框架(Asset Manager) 下章继续…..

    原文作者:小码哥_WS
    原文地址: https://blog.csdn.net/king1425/article/details/70135813
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞