您的位置:首页 > 其它

[置顶] 源码阅读--package管理与应用安装

2017-11-21 17:11 411 查看

已安装应用目录结构

在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方法处理签名的验证以及签名信息的收集
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐