PackageManagerService 学习记录 基于7.1.1源码
参考:
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源码的更多相关文章
- 机器学习实战(Machine Learning in Action)学习笔记————03.决策树原理、源码解析及测试
机器学习实战(Machine Learning in Action)学习笔记————03.决策树原理.源码解析及测试 关键字:决策树.python.源码解析.测试作者:米仓山下时间:2018-10-2 ...
- JDK1.8源码分析01之学习建议(可以延伸其他源码学习)
序言:目前有个计划就是准备看一下源码,来提升自己的技术实力.同时现在好多面试官都喜欢问源码,问你是否读过JDK源码等等? 针对如何阅读源码,也请教了我的老师.下面就先来看看老师的回答,也许会有帮助呢. ...
- Netty 学习(十):ChannelPipeline源码说明
Netty 学习(十):ChannelPipeline源码说明 作者: Grey 原文地址: 博客园:Netty 学习(十):ChannelPipeline源码说明 CSDN:Netty 学习(十): ...
- 基于Eclipse搭建Hadoop源码环境
Hadoop使用ant+ivy组织工程,无法直接导入Eclipse中.本文将介绍如何基于Eclipse搭建Hadoop源码环境. 准备工作 本文使用的操作系统为CentOS.需要的软件版本:hadoo ...
- 深度学习(七十一)darknet 源码阅读
深度学习(七十一)darknet 源码阅读
- 基于SpringBoot的Environment源码理解实现分散配置
前提 org.springframework.core.env.Environment是当前应用运行环境的公开接口,主要包括应用程序运行环境的两个关键方面:配置文件(profiles)和属性.Envi ...
- Spring Cloud 学习 之 Spring Cloud Eureka(源码分析)
Spring Cloud 学习 之 Spring Cloud Eureka(源码分析) Spring Boot版本:2.1.4.RELEASE Spring Cloud版本:Greenwich.SR1 ...
- Java并发包源码学习系列:线程池ScheduledThreadPoolExecutor源码解析
目录 ScheduledThreadPoolExecutor概述 类图结构 ScheduledExecutorService ScheduledFutureTask FutureTask schedu ...
- 记录小白实习生的HashMap源码 put元素 的学习和一些疑问
首先看HashMap存储结构 transient Node<K,V>[] table; static class Node<K,V> implements Map.Entry& ...
随机推荐
- CentOS7.0 采用压缩包 安装Nginx 1.7.4和添加Tomcat为系统服务 nginx结合tomcat
CentOS7.0 采用压缩包 安装Nginx 1.7.4 一.安装准备首先由于nginx的一些模块依赖一些lib库,所以在安装nginx之前,必须先安装这些lib库,这些依赖库主要有g++.gcc ...
- C Mergeable Stack(list超好用)
ZOJ 4016 list用法https://www.cnblogs.com/LLLAIH/p/10673068.html 一开始用普通的栈做,超内存,链表模拟栈也没写出来orz.补题发现list超 ...
- Tex和LaTeX认识
TeX (文本排版系统) 利用TeX可以很容易地生成高质量的dvi文件,打印输出.特别是在处理复杂的数学公式时.利用诸如是LaTeX等终端软件,TeX就能够排版出精美的文本. LaTeX LaTeX( ...
- 在Maven中新增自定的jar包
引言: 在软件项目中,Maven提供了一体化的类库管理系统,非常实用.但是,如果新增的类库jar在网络上无法获取到,如何在本地按照Maven的规则添加进来呢?本文将通过一个小例子展示新增过程. 背景介 ...
- STM32F401 外部中断误触发问题
现象:调试STM32F411低功耗的时候,使用的PA1做个唤醒源,发现在没有触发EXTI的时候,MCU居然被唤醒. 原因:PA1配置成EXTI(上拉输入),经常被误触发 解决方式:将PA1配置成浮空输 ...
- QUARTZ系列之二-监听器
Listener 1.是什么: perform actions based on events occurring within the scheduler. 2.分类:a.TriggerListen ...
- Web用户登录---验证码的设计与实现
在开发中验证码是比较常用到有效防止这种问题对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试的方式. 验证码生成步骤:1.获得随机生成的颜色,画出随机线条生成背景底.2.String cod ...
- Selenium+TestNG+Maven+Jenkins+SVN(转载)
转载自:https://blog.csdn.net/u014202301/article/details/72354069 一. 创建Maven项目,下载Selenium和TestNG的依赖(依赖可以 ...
- 配置ESP8266 NONOS SDK时由于工具链版本差异引发的故障
前几天部署ESP8266_NONOS_SDK时遇到了一个看似奇怪的问题,描述如下: examples例程可以通过编译,但烧写到ESP8266模块后,程序无法正常运行,编译和烧写的相关配置均无误.在bo ...
- C语言之标准头文件模板
/*======================================================================================* * 版权 : xxx ...