参考:

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. ajax的4个字母分别是什么意思

    Asynchronous JavaScript and XML 的缩写,异步的JavaScript和XML.在不重新加载整个页面的情况下 ,AJAX 与服务器交换数据并更新部分网页.

  2. java过滤emoji表情

    import java.util.regex.Matcher; import java.util.regex.Pattern; public class test { /** * 表情过滤 * */ ...

  3. python中线程的知识点

    什么是线程? 程序的执行线路.每个进程默认有一条线程.线程包含了程序的具体步骤. 多线程就是一个进程中有除主线程(默认线程)外还有多个线程. 线程与进程的关系(进程包含线程,而线程依赖进程存在) 1. ...

  4. EMF32名词解释

    (EFM32)32位节能微控制器(Energy Friendly Microcontroller 32-bit) (Gecko)壁虎 (Starter Kit)入门套件 (STK)入门套件 (Debu ...

  5. Ontology理论研究和应用建模

    转自:https://www.cnblogs.com/yes-V-can/p/8151275.html 目录 1 关于Ontology 1.1 Ontology的定义 1.2 Ontology的建模元 ...

  6. K-Means算法:图片压缩

    #读取实例图片# from sklearn.datasets import load_sample_image from sklearn.cluster import KMeans import ma ...

  7. docker swarm 集群及可视化界面的安装及配置

    docker swarm 集群及可视化界面的安装及配置 2016-12-14 16:08:46 标签:swarm consul registrator 原创作品,允许转载,转载时请务必以超链接形式标明 ...

  8. k8s之调度约束

    k8s调度约束有两种:第一种,直接指定某台node主机:这种形势将直接跳过调度器.如下: 第二种:先给各node指定标签,然后在通过标签的形势来关联node,这种形势人就会调用到调度器.如下: yao ...

  9. YDWE Keynote

    [YDWE Keynote] 1.使用YDWE制作的地图,需要在禁用黑色阴影.迷雾.否则进入游戏将漆黑一片,什么都看不到. 2. 3. 4. 5. 6.

  10. mysql,查询时间戳

    1.查询当前时间1天前的时间点   select date_sub(now() ,interval 1 day)   2.查询当前时间的时间1天之后的时间点   select data_sub(now ...