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) 下章继续…..
- android系统源码之 系统应用安装过程(上)
- android系统源码之 系统应用安装过程(下)
- Android系统应用程序安装过程源码分析
- Android 8.0系统源码分析--应用进程启动过程分析
- Android系统源码下载过程
- Android系统源码阅读(17):Android 应用的安装
- android系统应用安装
- android 获取设备上安装的非系统应用信息
- Android源码开发之添加/删除系统应用
- Android系统源码编译之2---安装CURL
- Android源码之路(一.安装Ubuntu系统)
- android 系统源码简单的编译过程
- Android初学------系统设置之获取所有安装应用大小
- Android 应用安装过程源码解析
- 在ubantu系统上下载android源码
- Android之调用系统应用
- Android - 系统应用源码开发入门
- 基于Android源码编译系统应用
- const用法
- android触屏拖动图片
- RactiveJS-02 Nested properties
- ACM必练50题
- iOS-常用 Git 命令清单
- android系统源码之 系统应用安装过程(上)
- 网易面试题——分饼干
- android EditText取消焦点且退出软键盘
- 杭电oj——1004(java版)Let the Balloon Rise
- RactiveJS-03 Expressions
- 【JVM】之 一些未解决问题
- [Java 数值] 数值类型之间的转换
- LabVIEW查找范例教程
- PAT_1025. PAT Ranking