`
daojin
  • 浏览: 676747 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

安卓高手之路之PackageManagerservice

 
阅读更多

源码位置: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(包的数据路径)。

分享到:
评论

相关推荐

    Android系统PackageManagerService简介

    Android PackageManagerServer 应用安装过程详解,apk安装过程

    android包管理服务(PackageManagerService)源码分析[整理].pdf

    android包管理服务(PackageManagerService)源码分析[整理].pdf

    android PackageManagerService源码分析

    一篇很好的android包管理服务源码分析文档

    android包管理服务(PackageManagerService)源码分析.pdf

    android包管理服务(PackageManagerService)源码分析

    PackageManagerService.pdf

    这是 PackageManagerService.pdf

    android PackageManager 反射调用相关的类

    Android PackageManager 有很多方法是没有暴漏出来的,我们如果想调用的话需要用Java反射。android_dependency.jar 提供了反射调用相关的class定义,直接放到你的工程libs目录下面,然后就可以进行反射调用...

    Android安全机制 PPT版本

    Android应用程序在安装的过程中,安装服务PackageManagerService会为它们分配一个唯一的UID和GID,以及根据应用程序所申请的权限,赋予其它的GID。有了这些UID和GID之后,应用程序就只能限访问特定的文件,一般就是...

    深入理解Android--卷2.pdf

    对Android的源代码进行深入分析。内容广泛,以对Framework层的分析为主,分析系统服务源码,如ActivityManagerService、PackageManagerservice等。

    深入理解Android(卷2)

    《深入理解Android:卷2》是“深入理解Android”系列的第2本,第1本书上市后获得广大读者高度评价,在Android开发者社群内口口相传。《深入理解Android:卷2》不仅继承了第1本书的优点并改正了其在细微处存在的一些...

    深入理解Android:卷2,中文完整扫描版

    《深入理解Android:卷2》是“深入理解Android”系列的第2本,第1本书上市后获得广大读者高度评价,在Android开发者社群内口口相传。《深入理解Android:卷2》不仅继承了第1本书的优点并改正了其在细微处存在的一些...

    《深入理解Android》卷Ⅱ

    第1章 搭建Android源码工作环境 1.1 Android系统架构 1.2 搭建开发环境 1.2.1 下载源码 1.2.2 编译源码 1.2.3 利用Eclipse调试system_process 1.3 本章小结 第2章 深入理解Java Binder和MessageQueue 2.1 ...

    Android getSystemService用法实例总结

    android的后台运行在很多service,它们在系统启动时被SystemServer开启,支持系统的正常工作,比如MountService监听是否有SD卡安装及移除,ClipboardService提供剪切板功能,PackageManagerService提供软件包的安装...

    Android APK应用安装原理解析之AndroidManifest使用PackageParser.parserPackage原理分析

    本文实例讲述了Android APK应用安装之AndroidManifest使用PackageParser.parserPackage原理。分享给大家供大家参考,具体如下: Android 安装一个APK的时候首先会解析APK,这里要做很多事情,其中一个事情就是解析...

    Android 添加系统服务的方法详解

    系统服务是Android中非常重要的一部分, 像ActivityManagerService, PackageManagerService, WindowManagerService, 这些系统服务都是Framework层的关键服务, 本篇文章主要讲一下如何基于Android源码添加一个系统服务...

    android 9内置apk可卸载的问题

    参看博客: ...————————————————————————...第三种:改PackageManagerService.java,放在vendor/priv-app下面。 结论与验证:  第一种,android 9 out目录下已经没有data/app目录了,试着改andr

    Android7.0 MTK设置默认桌面

    frameworks\base\services\core\java\com\android\server\pm\PackageManagerService.java try { PackageParser.Package newPackage = scanPackageTracedLI(pkg, policyFlags, scanFlags, System.

    AndroidComponentPlugin:Android上简单实现四大组件的插件化,供学习使用

    Android上简单实现四大组件的插件化说明:此项目仅用于学习插件化基本的实现思路,在此基础上学习理解四大组件的运行机制。实现插件化的重点在于对Android四大组件和资源加载流程的分析和解读。插件化代码的编写,...

    AppFilter:[Xposed]过滤掉指定的应用

    挂钩,以使PackageManagerService过滤掉某些指定的应用程序,从而使包括系统在内的任何应用程序都无法获取这些经过过滤的ApplicationInfo ,从而防止混淆的apk被盗和泄漏。 执照 Copyright (C) 2021 Drakeet This ...

Global site tag (gtag.js) - Google Analytics