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& ...
随机推荐
- FPGA——入手(零)
前几天正点原子团队退出了FPGA开发板,我就买了一套.我想的是,多学一点东西,即使到最后积累下的东西少,但是面是广的,以后可以更好的选择一种深入.就入手了新起点FPGA开发板,新起点算是开拓者的阉割版 ...
- python xlrd xlwt
1.什么是xlrd模块? 2.为什么使用xlrd模块? 3.怎样使用xlrd模块? 1.什么是xlrd模块? ♦python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel, ...
- php+mysql 原生事务回滚
<?php $conn = mysql_connect('127.0.0.1', 'root', ''); mysql_select_db('msc_test'); mysql_query('S ...
- Django应用app创建及ORM
一.重要知识点回顾: 1. form表单提交数据的注意事项: 1. 是form不是from,必须要有method和action (action用来指定你的数据提交到后台哪个地方,method用来指定你 ...
- django restfulwork 源码剖析
概要: 1.restful 规范(建议); 2. django rest framework框架 内容回顾: 1.开发模式; - 普通开发模式(前后端放在一起写) - 前后端分离 好处: 后端一套,前 ...
- 第一周pta作业1总结
查找整数 本题要求从输入的N个整数中查找给定的X.如果找到,输出X的位置(从0开始数):如果没有找到,输出"Not Found". 输入格式: 输入在第一行中给出两个正整数N(≤2 ...
- MyBatis学习资料
中文文档:http://www.mybatis.org/mybatis-3/zh/index.html http://blog.csdn.net/neosmith/article/details/61 ...
- Google开源软负载seesaw
https://github.com/google/seesaw ------------------------ 在分布式系统中,负载均衡是非常重要的环节,通过负载均衡将请求派发到网络中的一个或多个 ...
- LINUX | 谷歌云开启SSH及设置root密码
一.设置root密码 1.先选择从浏览器打开ssh连接服务器 2.切换到root账号 sudo -i 3.设置root密码 passwd 然后会要求输入新密码,然后再重复一次密码,输入密码的时候不会显 ...
- vue响应式原理
vue的响应式,数据模型仅仅是普通的Javascript对象.当你修改它们时,视图会进行更新 那么如何追踪变化: 当把普通的js对象传给vue实例的data选项,Vue将遍历此对象的所有属性,并使用O ...