PackageManager源码分析
在android 4.4源码上进行的分析。
一、PackageManager如何产生的?
我们平时在代码中使用的context.getPackageManager()
那么这个PackageManager是怎样一步一步生成的呢?
context.getPackageManager()->ContextImpl.getPackageManager()
通过查看ContextImpl源码发现返回的是ApplicationPackageManager的对象,
ApplicationPackageManager 是继承 抽象类PackageManager

ApplicationPackageManager只是一个装饰类,真正的实现类是通过ActivityThread.getPackageManager()来获取的
看看ActivityThread源码(这里说一句,我们app的启动入口也在ActivityThread里面)

真正的实现类是通过ServiceManager返回的binder对象而来,
这个实现接口的类就是PackageManagerService

二、PackageManagerService如何工作的?
PackageManagerService是如何创建的呢?
SystemServer.main() -> initAndLoop()

创建后做了啥?
1.首先 扫描安装“system/framework”目录下的jar包
2.扫描 安装系统system/app的应用程序
3.制造商的目录下/vendor/app应用包
4.扫描“data/app”目录,即用户安装的第三方应用
5.扫描" data/app-private"目录,即安装DRM保护的APK文件(一个受保护的歌曲或受保 护的视频是使用 DRM 保护的文件)
1. 从apk, xml中载入pacakge信息, 存储到内部成员变量中, 用于后面的查找. 关键的方法是scanPackageLI().
2. 各种查询操作, 包括query Intent操作.
3. install package和delete package的操作. 还有后面的关键方法是installPackageLI().
4. 广播通知
未完待续
PackageManager源码分析的更多相关文章
- Android Small插件化框架源码分析
Android Small插件化框架源码分析 目录 概述 Small如何使用 插件加载流程 待改进的地方 一.概述 Small是一个写得非常简洁的插件化框架,工程源码位置:https://github ...
- Monkey源码分析之事件注入
本系列的上一篇文章<Monkey源码分析之事件源>中我们描述了monkey是怎么从事件源取得命令,然后将命令转换成事件放到事件队列里面的,但是到现在位置我们还没有了解monkey里面的事件 ...
- documentsUI源码分析
documentsUI源码分析 本文基于Android 6.0的源码,来分析documentsUI模块. 原本基于7.1源码看了两天,但是Android 7.1与6.0中documentsUI模块差异 ...
- Android8.1 SystemUI源码分析之 Notification流程
代码流程 1.先看UI显示,StatuBar加载 CollapsedStatusBarFragment 替换 status_bar_container(状态栏通知显示区域) SystemUI\src\ ...
- Android源码分析(十四)----如何使用SharedPreferencce保存数据
一:SharedPreference如何使用 此文章只是提供一种数据保存的方式, 具体使用场景请根据需求情况自行调整. EditText添加saveData点击事件, 保存数据. diff --git ...
- Android源码分析(五)-----如何从架构师的角度去设计Framework框架
一 : 架构与程序 软件架构是一种思维方式,而程序只是实现思维方式的一种手段,代码固然重要,但是若没有整体的思维架构,一切程序都如水中浮萍. 二 : 框架如何设计 暂时抛开Android Framew ...
- debug:am trace-ipc源码分析
debug:am trace-ipc源码分析 目录 debug:am trace-ipc源码分析 一.使用 官网介绍 命令提示 小结 二.源码分析 ActivityManagerShellComman ...
- Android12系统源码分析:NativeTombstoneManager
Android12系统源码分析:NativeTombstoneManager 概述 android12新增的system_server进程(LocalService)本地服务,用于管理native t ...
- Android Activity Deeplink启动来源获取源码分析
一.前言 目前有很多的业务模块提供了Deeplink服务,Deeplink简单来说就是对外部应用提供入口. 针对不同的跳入类型,app可能会选择提供不一致的服务,这个时候就需要对外部跳入的应用进行区分 ...
随机推荐
- Foundation框架
1.框架是由许多类.方法.函数.文档按照一定的逻辑组织起来的集合,以便使研发程序变的更容易 清除缓存,删除这个文件夹下的所有文件/Users/fanyafang/Library/Developer/X ...
- s3c2440液晶屏驱动 (内核自带) linux-4.1.24
自带有一部分驱动的配置信息,只要修改这部分就能支援 不同的液晶屏 - /arch/arm/mach-s3c24xx/mach-smdk2440.c 另一部分在 /drivers/video/fbdev ...
- Ajax请求成功,进入error回掉函数
后台无返回值,则不需要datatype.
- javascript: parse JSON
$.get("/intra/do/sequence_has_codonList.pl",function(data){ data = JSON.parse(data); // ar ...
- 数据终端设备与无线通信模块之间串行通信链路复用协议(TS27.010)在嵌入式系统上的开发【转】
转自:http://blog.csdn.net/hellolwl/article/details/6164449 目录(?)[-] 协议介绍 模块协议介绍 1 命令包格式 2 ...
- selenium测试(Java)--多窗口切换(十三)
selenium测试(Java)--多窗口切换(十三) 如果遇到点击按钮或链接后出现新窗口的情况,就需要使用窗口切换的方法. 本例中就是先打开百度搜索界面,然后利用js打开一个百度新闻界面,然后通过s ...
- Hibernate的批量插入(&&JDBC)
来自: http://blog.csdn.net/an_2016/article/details/51759890 一.批量插入(两种方式) 1,通过hibernate缓存 如果这样写代码进行批量插入 ...
- 如何用Java实现DVD的一些功能
/* 这个代码中涉及到的知识点很多,大家要慢慢悟!! */ import java.util.*; import java.text.*; class DvdSet { //定义三个属性 String ...
- 。net 文件依赖缓存
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- Bootstrap学习(1)
文档顶部写上H5的DOCTYPE声明 head部分: <meta> (1)编码方式 (2)在IE运行最新的渲染模式 <meta http-equiv="x-ua-comp ...