源码位置:frameworks/base/core/java/android/content/pm/PackageParser.java

源文件路径:android\frameworks\base\services\java\com\android\server\PackageManagerService.java

1.PackageManagerService.java 用到一个很重要的工具类,PackageParser.java

这里面是一些 工具类 和 工具方法,辅助PackageManagerService来完成一些功能。

下面 分析一下PackageManagerService的 启动流程

1.PackageManagerService中有一个静态方法:main()。生成一个IPackageManager接口,也就是PackageManagerService。下面我们主要看PackageManagerService的构造方法。
public static final IPackageManager main(Context context, boolean factoryTest) {
PackageManagerService m = new PackageManagerService(context, factoryTest);
ServiceManager.addService("package", m);
return m;
}

2.构造方法中,首先会进行一些成员变量的初始化,比如mContext, mFactoryTest, mMetrics, mSettings等。
a. 最重要的是初始化mInstaller这个变量。Installer是一个很重要的类,所有对apk的install, uninstall,move等操作,都是通过它进行的。
Installer installer = new Installer();
if (installer.ping() && Process.supportsProcesses()) {
mInstaller = installer;
} else {
mInstaller = null;

}

b.建立PackageHandler消息循环,用于处理 外部的apk安装 请求消息如adb install,packageinstaller安装apk时会 发送消息
mHandlerThread.start();
mHandler = new PackageHandler(mHandlerThread.getLooper());

4.解析 编译后的 system/etc/permission下xml文件(framework/base/data/etc/),包括 platform.xml 和 系统支持的各种硬件模块的feature.

主要工作:

(1)建立底层user ids和group ids 同上层permissions之间的映射;可以指定一个权限与几个组ID对应。当一个APK被授予这个权限时,它也同时属于这几个组。
(2)给一些底层用户分配权限,如给shell授予各种permission权限;把一个权限赋予一个UID,当进程使用这个UID运行时,就具备了这个权限。
(3) library,系统增加的一些应用需要link的扩展jar库;

(4) feature,系统每增加一个硬件,都要添加相应的feature.将解析结果放入mSystemPermissions,mSharedLibraries,mSettings.mPermissions,mAvailableFeatures等几个集合中供系统查询和权限配置使用。

5.检查/data/system/packages.xml是否存在这个文件是 解析apk时 由writeLP() 创建的,里面记录了系统的permissions,以及每个apk的name, codePath, flags, ts, version, uesrid等信息,这些信息主要通过apk的AndroidManifest.xml解析获取,解析完apk后将更新信息写入这个文件并保存到flash,下次开机直接从里面读取相关信息添加到内存相关列表中。当有apk升级,安装或删除时会更新这个文件。

6.检查BootClassPath,mSharedLibraries及/system/framework下的jar
是否需要dexopt,需要的则通过dexopt进行优化

7.启动AppDirObserver线程 监测/system/framework, /system/app, /data/app, /data/app-private目录 的事件,主要 监听add和remove事件。对于目录监听底层 通过inotify机制实现,inotify 是一种 文件系统的变化 通知机制,如文件增加、删除 等事件可以立刻让用户态得知,它为 用户态 监视文件系统的变化提供了强大的支持。
当有add event时调用scanPackageLI(File , int , int)处理;
当有remove event时调用removePackageLI()处理;

8.对于以上几个目录下的apk逐个解析,主要是解析每个apk的AndroidManifest.xml文件,处理asset/res等资源文件,建立起每个apk的配置结构信息,并将每个apk的配置信息添加到全局列表进行管理。调用installer.install()进行安装工作,检查apk里的dex文件是否需要再优化,如果需要优化则通过辅助工具dexopt进行优化处理;将解析出的componet添加到pkg的对应列表里;
对apk进行 签名 和 证书校验, 进行完整性验证。

9.将解析的每个apk的信息保存到packages.xml和packages.list文件里,packages.list记录了如下数据:pkgName,userId,debugFlag,dataPath(包的数据路径)。

安卓高手之路之PackageManagerservice相关推荐

  1. 安卓高手之路之PackageManagerservice(二)

    http://blog.csdn.net/new_abc/article/details/7435508

  2. 安卓高手之路 图形系统(4 Measure的算法)

    安卓高手之路 图形系统(4 Measure的算法) - 修补C++ - ITeye技术网站 Java代码   /** * Does the hard part of measureChildren:  ...

  3. 安卓高手之路 图形系统(2)----------------基于Binder的架构思路)

    在学习安卓的时候最迷惑的就是Binder.图形框架的理解与Binder的理解分不开.前面一篇 [ 安卓高手之路之java层Binder 从代码角度分析了Java层Binder的实现原理.在C++层,这 ...

  4. 安卓高手之路之 ClassLoader

    我不喜欢那些泛泛而谈的去讲那些形而上学的道理,更不喜欢记那些既定的东西.靠记忆去弥补思考的人,容易陷入人云亦云的境地,最后必定被记忆所围困,而最终消亡的是创造力.希望这个高手之路系列能够记录我学习安卓 ...

  5. 安卓高手之路之 图形系统之 图形框架(1)

    安卓图形系统理解起来并不容易.那是因为系统对于数据的封装非常多,图形模块与输入输出,应用程序管理等模块参杂在一起.让开发者很难摸清其中的脉络.下面先给出最简单的一张图.             这张图 ...

  6. [置顶] 安卓高手之路之ClassLoader(二)

    因为ClassLoader一定与虚拟机的启动有关系,那么必须从Zygote的启动开始看代码.下面就分析一下这些代码,行数不多: int main(int argc, const char* const ...

  7. [置顶] 安卓高手之路之 WindowManager

    安卓中的画面不是纯粹由window组成.而是改成了window+view的组织模式.window是一个顶层窗口的概念.view就相当于在window内的控件.而subwindow则是依附于window ...

  8. 安卓高手之路之图形系统(6)ListView继续

    综述: 本篇首先介绍了ListView的实现细节.然后介绍了Gallery,ListView,ViewPager的效率对比分析.以及效率低下的原因.最后给出了一些解决方案. 1.在上一篇讨论了requ ...

  9. 安卓高手之路之(架构设计)

    今天 现安卓的原生代码可能存在多线程不安全. ItemInfo是个共享的数据.但是却没有锁.为何.....

最新文章

  1. 懒人必备 |通过爬虫 筛选以及查看CSDN 满足相应积分的资源列表 简单好用
  2. 动态加载jar 并进行调用
  3. jquery获取select选中的值
  4. GDI+ 中Image::FromStream ,用流的方式显示图像
  5. : Android之linux基础教学之三 分页机制
  6. 简单的表单提交 by MVC 2
  7. weka中文乱码解决办法
  8. mysql cluster自动安装_MySQL Cluster 安装
  9. 4.13 apache用户认证,跳转和访问日志
  10. 远程桌面 出现内部错误_如何解决远程桌面连接延迟高的问题?
  11. 内网渗透--获取其他电脑相册
  12. Linux(CenterOS 6.4)下安装jdk1.6
  13. python—内置函数-字符串,eval,isinstance
  14. Libusb开发教程三 USB设备程序开发
  15. 1012. 数字分类 (20)-PAT乙级真题
  16. 接口自动化测试框架搭建(3、excel的设计excel文件的读取)--python+HTMLTestRunnerCN+request+unittest+mock+db
  17. swing版本山寨微信打飞机
  18. 一次性将多个网址收藏到谷歌书签的文件夹中
  19. 苹果首款自研芯片 M1 惊艳亮相,带来最强三款 Mac 电脑!
  20. 设置什么加快计算机启动速度,如何设置CPU加速对电脑启动速度的方法(更改CPU数量可开机提速)...

热门文章

  1. 计算机公共课考试试题,2019-度公共课计算机应用基础考试试题附答案.doc
  2. python递归合并排序_python 归并排序的递归法与迭代法(利用队列)实现,以及性能测试...
  3. sega+model+3+android,世嘉MODEL2经典老游戏移植登场 追加联网对战
  4. Java构造函数的使用_java中构造函数的使用方法
  5. 【Lua】撸啊!第一弹:Lua开发环境搭建(Mac OS X)
  6. MySQL报错解决方案:2013-Lost connection to MySQL server
  7. 菜鸟的DUBBO进击之路(二):Dubbo初识
  8. 使用 Azure CLI 2.0 从自定义磁盘创建 Linux VM
  9. 无法完成安装:'unsupported configuration: hda-duplex not supported in this QEMU binary'
  10. firefox的plugin-container.exe进程如何关闭?