我是靠谱客的博主 粗心巨人,最近开发中收集的这篇文章主要介绍源码阅读--package管理与应用安装,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

已安装应用目录结构

在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管理与应用安装的全部内容,希望文章能够帮你解决源码阅读--package管理与应用安装所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部