源码阅读--package管理与应用安装
来源:互联网 发布:软件系统集成方案模板 编辑:程序博客网 时间:2024/06/05 03:17
已安装应用目录结构
在PMS启动初始化时,会扫描一下目录,并安装对应的应用。每个目录下是已安装的应用,每个应用的对应目录包括apk文件,lib库so文件,以及oat文件
/system/app
/data/app
/data/app-asec
/data/app-private
packages.xml文件
在/data/system目录下,packages.xml保存了系统安装的应用相关信息,/frameworks/base/services/core/java/com/android/server/pm/Settings.java负责packages.xml文件的相关操作;在PMS初始化时,会解析该文件,获取当前系统安装应用的信息。
在PackageManagerService初始化时会解析packages.xml,在文件中主要节点有permissions,packages,shared_users;
permissions记录了系统所有权限和安装的应用自定义的权限
package记录了所有安装应用的应用包信息,包括包名,版本code,shareduserid,userid,以及声明的权限等等
shared_users记录了所有的Shareduser相关的信息。
此外文件还记录了系统版本,更新应用等等相关信息Settings类有对应的数据结构存储相关信息。下面是Settings类readLPw方法中解析文件的部分代码,在PMS初始化时会调用该方法。
相关类结构
package模块核心是PackageManagerService,主要成员有mPackage记录所有安装的包信息
mSettings(Settings)处理packages.xml相关逻辑
mHandler(PackageHandler)消息循环接收安装请求,处理文件拷贝,包解析等逻辑
mPackageDexOptimizer(PackageDexOptimizer)优化处理,dex到odex/oat的转换
mInstaller(Installer)dex优化、createAppData等具体实现,连接installd本地服务
PackageManagerService初始化
1.初始化各成员变量;包括创建mSettings对象并添加系统应用的Shareduser,创建mPackageDexOptimizer,mHandlerThread,mHandler对象,初始化用户应用安装目录。
2.获取SyatemConfig对象,读取对应配置;包括向mSettings添加系统配置的权限,保存系统配置的共享库。
3.解析packages.xml文件,移除没有codepath的包,优化共享库。
4.扫描vendor、/system/framework(系统资源)、系统应用安装目录(/system/app、/system/priv-app),安装对应的应用,并根据配置移除某些应用。系统预置应用的安装就是在这时候进行的。
5.扫描用户安装应用目录,并安装应用。
6.更新共享库,更新包last usage times,更新permissions,更新应用数据目录/data/data/packagename。
7.更新后的配置写入到packages.xml文件。
8.对所有CoreApp进行dexopt处理。需要注意的是包的扫描阶段有多个重载函数
时序图中后缀以1开头的是参数中含有File的。
应用安装流程
普通下载apk文件安装,会启动PackageInstallerActivity处理apk的安装。点击确定安装后会启动InstallAppProgress界面,开始安装。调用流程如下:
跟PMS启动安装应用一样这里也调用了scanPackageLI方法。
在scanPackageLI方法中又调用了scanPackageDirtyLI,这里对解析到的PackageParser.Package进行设置,并保存到mPackages对象,保存应用组件到对应数据结构,保存权限信息到对应数据结构。
安装包的解析
上面在scanPackage之前已经解析了apk文件,对apk文件的解析是PackageParser类完成的。主要是使用AssetManager完成AndroidManifest.xml文件的解析。
应用签名
数字签名技术
1、数字签名技术是使用非对称加密技术保证文件安全性的一种手段。
2、使用摘要生成算法生成一串文件对应的数字指纹,并对该指纹进行非对称加密。对外发布文件时把原始文件、加密后的数据指纹、包含非对称加密的公钥和摘要算法的证书合并成一个文件发布。
3、文件签名验证时,提取原始文件、加密指纹、加密证书;使用加密公钥解密数字指纹;使用证书中的摘要算法计算原始文件的数字指纹;对比解密后的指纹与计算得到的指纹,验证文件是否被修改。
apk签名
apk签名包中有一个META-INFO目录,存放了签名信息,使用studio的analyzeapk功能查看
MANIFEST.MF内容如下:保存了所有文件的摘要指纹
CERT.SF:把MANIFEST.MF中的摘要结果复制了一份,要注意的是第三行:记录了MANIFEST.MF文件的摘要,这里CERT.SF文件本身是没有加密的,可以直接以文本文件方式查看,可以推测这里MANIFEST.MF文件的摘要是已经使用私钥加密处理过的。
CERT.RSA是证书文件,可以使用keytool工具查看
签名验证
PackageParser类collectCertificates方法处理签名的验证以及签名信息的收集
- 源码阅读--package管理与应用安装
- 源码阅读--进程管理
- [hadoop源码阅读][2]-package结构
- Android源码阅读笔记(应用安装,LOG抓取等)
- Android系统源码阅读(17):Android 应用的安装
- Sensor传感器源码的阅读与应用开发简单实例
- Sensor传感器源码的阅读与应用开发…
- Sensor传感器源码的阅读与应用开发…
- Memcached内存管理源码阅读
- Sublime添加Package Control 进行应用管理
- 22、软件管理之源码包安装与脚本安装
- Linux软件安装与管理之源码安装方式
- 利用package包管理安装emacs插件
- Sublime Text安装插件管理 Package Control
- 利用package包管理安装emacs插件
- Sublime Text3 - 安装Package Control插件管理
- sublime text3 安装package control 管理插件
- 包头(Package)与包体(Package body)的应用
- 406. Queue Reconstruction by Height
- java8 stream初试,map排序,list去重,统计重复元素个数,获取map的key集合和value集合
- 并行并发多线程
- 一维数组的常见查找法
- iOS五种本地缓存数据方式 96 GitHubPorter 2016.05.19 14:04 字数 3917 阅读 4579评论 1喜欢 8 前言 iOS本地缓存数据方式有五种: 1.直接写文件
- 源码阅读--package管理与应用安装
- 16进制文本文件转二进制文件(C语言)
- UE4 获得player id
- 海明纠错码
- Java Web提交任务到Spark Standalone集群并监控
- js计算字节长度
- log4j 1
- mvn 打包命令
- linker command failed with exit code 1 错误