PackageManagerService 学习记录 基于7.1.1源码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PackageManagerService 学习记录 基于7.1.1源码相关的知识,希望对你有一定的参考价值。

 

参考:

http://blog.csdn.net/innost/article/details/47253179

http://blog.csdn.net/gaugamela/article/details/52619720

感谢文章作者

 

PackageManagerService是android系统服务,它负责系统中Package的管理,应用程序的安装、卸载、信息查询等。

 

技术分享

 

上图主要展示了PackageManagerService及客户端的通信方式,以及相关类的继承关系。

 

1、PMS的启动

PMS由SystemServer创建,SystemServer调用了PMS的main函数创建PMS实例,

之后依次调用PMS的

isFirstBoot函数,判断本次是否为初次启动。当Zygote或SystemServer退出时,init会再次启动它们,所以这里的FirstBoot是指开机后的第一次启动

performBootDexOpt函数,做dex优化。dex是Android上针对Java字节码的一种优化技术,可提高运行效率

systemReady函数,通知PMS,系统进入就绪状态

主要分析main函数 :

技术分享

PMS在其构造方法中扫描如下目录中的apk文件,解析apk中的清单文件,并创建相应的数据结构保存扫描到package信息,组件信息,权限信息等:

下面具体分析PMS构造方法中扫描APK文件的过程:

A、调用Setting的readLPw方法解析/System/目录下的xml文件,并保存解析的信息,一共有5个文件:

packages.xml: PKMS扫描完目标文件夹后会创建该文件。当系统进行程序安装、卸载和更新等操作时,均会更新该文件。该文件保存了系统中与package相关的一些信息

packages-backup.xml和packages.xml为一组,用于描述系统中所安装的Package的信息,其中backup是临时文件。PKMS先把数据写到backup中,信息都写成功后再改名成非backup的文件。其目的是防止在写文件过程中出错,导致信息丢失。

packages.list:描述系统中存在的所有非系统自带的APK(应用级,即UID大于10000)的信息。当这些程序有变动时,PKMS就会更新该文件

packages-stopped.xml:从系统自带的设置程序中进入应用程序页面,然后在选择强制停止(ForceStop)某个应用时,系统会将该应用的相关信息记录到此文件中。也就是该文件保存系统中被用户强制停止的Package的信息

packages-stopped-backup.xml和packages-stopped.xml为一组,用于描述系统中强制停止运行的pakcage的信息,backup也是临时文件。如果此处存在该临时文件,表明此前系统因为某种原因中断了正常流程

B、解析完XML之后,就是一次扫描各个文件夹中的apk文件,具体会扫描如下5个目录:

/system/frameworks:该目录中的文件都是系统库,例如framework.jar、services.jar、framework-res.apk,不过scanDirLI只扫描APK文件

/system/app:该目录下全是默认的系统应用,例如Browser.apk、SettingsProvider.apk等

/vendor/app:该目录中的文件由厂商提供,即厂商特定的APK文件,不过目前市面上的厂商都把自己的应用放在/system/app目录下

/data/app : 该目录为第三方APK目录,安装的第三方apk都会拷贝到这里

/data/app-private : 安装的受DRM保护的APK文件(这个不理解)

a) PMS的构造方法调用scanDirLI()方法扫描以上文件夹,通过后缀判断以上目录是否有.apk文件,如果则调用scanPackageLI()方法;

b) scanPackageLI()方法中会实例化一个PackageParser对象,并调用PackageParser的parsePackage函数解析apk;

c) 是不解析完apk信息之后,会和A步中解析到的XML中保存的apk信息做对比,以确定是否需要升级;

C、

 

以上是关于PackageManagerService 学习记录 基于7.1.1源码的主要内容,如果未能解决你的问题,请参考以下文章

Android 进阶——系统启动之SystemServer创建并启动PackageManagerService服务

Android 进阶——系统启动之SystemServer创建并启动PackageManagerService服务

Android 进阶——系统启动之SystemServer创建并启动PackageManagerService服务

Android的PackageManagerService10.0源码解读(AndroidManifest.xml解析)

Android的PackageManagerService10.0源码解读(AndroidManifest.xml解析)

Android的PackageManagerService10.0源码解读(AndroidManifest.xml解析)