参考:

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

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

感谢文章作者

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

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

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信息做对比,以确定是否需要升级;

d)再次调用另一个个重载的scanPackageLI()函数将b步解析的apk信息保存在PMS中,并在该函数中将apk中的so文件提取并复制到lib目录下

PMS的其他功能

除以上启动时执行的任务外,PMS还承担安装apk与查询apk信息的功能,以后分析。

PackageManagerService 学习记录 基于7.1.1源码的更多相关文章

  1. 机器学习实战(Machine Learning in Action)学习笔记————03.决策树原理、源码解析及测试

    机器学习实战(Machine Learning in Action)学习笔记————03.决策树原理.源码解析及测试 关键字:决策树.python.源码解析.测试作者:米仓山下时间:2018-10-2 ...

  2. JDK1.8源码分析01之学习建议(可以延伸其他源码学习)

    序言:目前有个计划就是准备看一下源码,来提升自己的技术实力.同时现在好多面试官都喜欢问源码,问你是否读过JDK源码等等? 针对如何阅读源码,也请教了我的老师.下面就先来看看老师的回答,也许会有帮助呢. ...

  3. Netty 学习(十):ChannelPipeline源码说明

    Netty 学习(十):ChannelPipeline源码说明 作者: Grey 原文地址: 博客园:Netty 学习(十):ChannelPipeline源码说明 CSDN:Netty 学习(十): ...

  4. 基于Eclipse搭建Hadoop源码环境

    Hadoop使用ant+ivy组织工程,无法直接导入Eclipse中.本文将介绍如何基于Eclipse搭建Hadoop源码环境. 准备工作 本文使用的操作系统为CentOS.需要的软件版本:hadoo ...

  5. 深度学习(七十一)darknet 源码阅读

    深度学习(七十一)darknet 源码阅读

  6. 基于SpringBoot的Environment源码理解实现分散配置

    前提 org.springframework.core.env.Environment是当前应用运行环境的公开接口,主要包括应用程序运行环境的两个关键方面:配置文件(profiles)和属性.Envi ...

  7. Spring Cloud 学习 之 Spring Cloud Eureka(源码分析)

    Spring Cloud 学习 之 Spring Cloud Eureka(源码分析) Spring Boot版本:2.1.4.RELEASE Spring Cloud版本:Greenwich.SR1 ...

  8. Java并发包源码学习系列:线程池ScheduledThreadPoolExecutor源码解析

    目录 ScheduledThreadPoolExecutor概述 类图结构 ScheduledExecutorService ScheduledFutureTask FutureTask schedu ...

  9. 记录小白实习生的HashMap源码 put元素 的学习和一些疑问

    首先看HashMap存储结构 transient Node<K,V>[] table; static class Node<K,V> implements Map.Entry& ...

随机推荐

  1. Base64图片转Blob对象

    //将Base64图片转成Blob对象 //@args: base64Url:编码字符串,contentType:类型. function base64UrltoBlob(base64Url, con ...

  2. centos mysql 修改mysql用户密码

    查看服务器版本: cat /etc/redhat-release 查看mysql 版本: mysql -u root -p use mysql; ###mysql 5.7以上.. update use ...

  3. Django项目创建

    一.创建方式 1.命令行创建: 2.pycharm创建项目: 二.创建MySQL数据库 三.修改配置文件链接数据库 修改python连接数据库方式 四.Django配置 1.添加app项目 2.修改h ...

  4. JS 中offset 的小bug 与解决方案。

    一.发现bug准备工作,先定义一个div,然后给div加上样式    效果图如图所示: 二.编写正常的代码,同时给div加上一个id     会发现div图会向左缩进...直至消失. 三.添加代码bo ...

  5. Mac gitk安装与优化

    一.mac系统安装gitk gitk是git的一个bin工具,如果git不包含gitk只能说明当前使用的git版本过老. 因此我们只需要安装最新的git就可以了.安装git方法如下: 首先安装brew ...

  6. 问题:页面输出正常,php写入sqlserver乱码/空白。

    问题一:php连接sqlsever2005,输入中文,然后查询sqlserver中对应的数据,由于提交中文是UTF-8,而sqlserver的中文为GBK,所以字段无法匹配,没有查询结果. 问题二,p ...

  7. vue--组件基础

    组件是可复用的 vue 实例,它与new Vue 接收相同的参数,例如:data.methods.computed.watch 以及生命周期钩子.除了 el 等. 1.组件注册必须有一个组件名. 组件 ...

  8. H5-手机震动

    //手机震动function vibration(){ navigator.vibrate = navigator.vibrate || navigator.webkitVibrate || navi ...

  9. form表单的三个属性 action 、mothod 、 enctype。

    form_action: 表单数据提交到此页面 下面的表单拥有两个输入字段以及一个提交按钮,当提交表单时,表单数据会提交到名为 "form_action.asp" 的页面: < ...

  10. 定时器&改变定时器的执行频率

    static System.Threading.Timer timer; static void Main(string[] args) { Console.WriteLine("Press ...