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

来源:互联网 发布:oracle删除字段数据 编辑:程序博客网 时间:2024/06/10 02:36

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) 下章继续…..

0 0
原创粉丝点击