PackageManagerService概述

news/2024/7/7 10:05:59

PackageManagerService主要负责对系统的apk进行管理,不管是系统apk(/system/app),还是我们手工安装上去的,系统所有的apk都是由其管理的。

我们看一下PackageManager类图


从图可知,PackageManage负责提供对外的接口,PackageManage是一个抽象类,具体的实现是ApplicationPackageManager,ApplicationPackageManager有一个IPackageManager类型的变量mPM,负责和PackageManagerService进行Binder交互,IPackageManager在frameworks/base/core/java/android/content/pm/IPackageManager.aidl。

再来看下PackageManagerService的类图:



从它的类图我们可以看出,PackagemanagerService主要管理apk,其实就是管理其中的组件等,如Activiey、Service,从apk中解析其中的组件,保存到相关结构中,以使得后面可以通过相关的接口可以查询系统安装组件,apk的安装,卸载,删除都是由PackageManagerService负责的,从图中我们也可以看到相关类的作用

下面是PackageManagerService中一些比较重要的成员变量:

<span style="background-color: rgb(255, 255, 255);">// Keys are String (package name), values are Package.  This also serves
    // as the lock for the global state.  Methods that must be called with
    // this lock held have the prefix "LP".
    final HashMap<String, PackageParser.Package> mPackages =  //以包名为key保存系统中所以安装的Package
            new HashMap<String, PackageParser.Package>();

    final Settings mSettings;//用来保存一些系统的设置,
    boolean mRestoredSettings;

    // Group-ids that are given to all packages as read from etc/permissions/*.xml.
    int[] mGlobalGids; //全局组id,通过从etc/permissions/*.xml读取,可以用来把某个组赋予某个packages

    // These are the built-in uid -> permission mappings that were read from the
    // etc/permissions.xml file.
    final SparseArray<HashSet<String>> mSystemPermissions =
            new SparseArray<HashSet<String>>();

    // These are the built-in shared libraries that were read from the
    // etc/permissions.xml file.
    final HashMap<String, String> mSharedLibraries = new HashMap<String, String>();//共享库

    // Temporary for building the final shared libraries for an .apk.
    String[] mTmpSharedLibraries = null;

    // These are the features this devices supports that were read from the
    // etc/permissions.xml file.
    final HashMap<String, FeatureInfo> mAvailableFeatures =//系统可用特性
            new HashMap<String, FeatureInfo>();

    // All available activities, for your resolving pleasure.
    final ActivityIntentResolver mActivities =//系统所有的Activity
            new ActivityIntentResolver();

    // All available receivers, for your resolving pleasure.
    final ActivityIntentResolver mReceivers =//系统所有的Receivers
            new ActivityIntentResolver();

    // All available services, for your resolving pleasure.
    final ServiceIntentResolver mServices = new ServiceIntentResolver();//系统所有的Services

    // Keys are String (provider class name), values are Provider.
    final HashMap<ComponentName, PackageParser.Provider> mProvidersByComponent =//以ComponentName为key,系统所有的Provider
            new HashMap<ComponentName, PackageParser.Provider>();

    // Mapping from provider base names (first directory in content URI codePath)
    // to the provider information.
final HashMap<String, PackageParser.Provider> mProviders =//以Name为key,系统所有的Provider
</span>

PackageManagerService用到了几个重要的支撑类:

1、  PackageParser:


 这个类主要用于解析apk,分析其AndroidManifest.xml得到package的各种信息. 特别的PackageParser.Package这个类用于容纳解析出的信息. 描述的是Package的静态的一些属性,其中ActivityInfo、ServiceInfo实现Parcelable接口,用于Binder进程间传递,Activity、Service用于解析时保存相关属性值,具体的值都是保存在内部变量ActivityInfo、ServiceInfo中

 

2、PackageManagerService.Settings:


用于容纳当前有效的package信息, 它是动态的. 例如, user id, shareUser, permission, signature以及origPackage(也就是mRenamedPackages)相关信息. 所谓的installpackage就包括从要安装的package中抽取信息更新PackageManagerService.Settings中的内容. 特别的, Settings针对shareUser和origPackage做了特别的关照. 另外, 为了加速启动速度,Settings的内容会写入到/data/system/packages.xml, packages-backup.xml, 和packages.list中, 下次启动时会直接载入.,不用重新去生成PackageSetting结构

Installer, 这个类协助安装过程, 更多的是将针对文件/路径的操作放到了c/cpp实现. 真正的工作是是由installd承担的,Installer只是通过named socket "installd"连接installd, 使用简单的cmd-respond协议指挥installd完成工作. 在其'install'命令中可以看到, 其实只是创建了/data/data/<pkgName>目录而已.

3、  另外一些是跟权限有关的:


PackageSetting、SharedUserSetting,PackageSetting这个类主要是描述当前系统存在的Package的一些状态信息,如代码目录、安装时间、更新时间等一些动态的属性。SharedUserSetting则用来描述可被其他进程共享的一些用户。

与PackageManager相关的代码主要在:

frameworks\base\services\java\com\android\server\pm

frameworks\base\core\java\android\content\pm




转载自:http://m.blog.csdn.net/blog/new_abc/12949179



http://www.niftyadmin.cn/n/3649400.html

相关文章

PHP+MySQL实现精确统计网站访问量(IP个数)

基于WordPress的网站有很多统计功能。但是只能统计文章阅读数。不能统计访客人数。以下代码可以实现获取来访用户的IP地址&#xff0c;一个IP对应一次访问。即使刷新也不会增加访问量。这个非常精确。 1、创建一个存储数据的表。进入MySQL后直接创建即可。 create table wp_jc_…

JDBC连接sql server 2008数据库

public class TestJdbc {public static void main(String[] args) {// 定义需要的对象PreparedStatement ps null;Connection ct null;ResultSet rs null;try {// 初始化我们的对象// 1.加载驱动// Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"…

如何使用React-Lottie将动画添加到React应用

介绍 (Introduction) Adobe After Effects can be an intuitive way to generate web animations, but there has historically been problems converting these animations to web apps. It is usually necessary to use a third party program to import an animation from A…

Android系统常用隐藏命令大全

本文出自&#xff1a;http://androidkaifa.com/thread-1038-1-1.html android手机隐藏命令大全&#xff0c;用之前要考虑清楚尤其是涉及到格式化或者恢复出厂设置类的&#xff01; 注意&#xff1a;因Android版本较多&#xff0c;固有部分隐藏命令或不能使用&#xff08;笔者用…

WordPress文本工具实现代码执行功能

WordPress自带有两个小工具可以执行代码功能。一个是自定义HTML小工具&#xff0c;不过只能运行HTML、CSS、JavaScript三种语言。文本小工具默认是不可以运行代码的。要实现这个功能&#xff0c;需要添加以下代码。 使用方法&#xff1a;在当前主题目录下面的functions.php里面…

[LCS]启用WindowsMessenger5.0的调试日志功能来诊断登录LCS服务器

编写者&#xff1a;郑昀UltraPower摘要&#xff1a;Windows Messenger 5.0有一个注册表项设置&#xff0c;可以用来启用日志文件&#xff0c;该文件中记录了Windows Messenger 5.0登录LCS Server的详细来往包&#xff0c;可从其中得到通讯细节&#xff0c;从而作troubleshootin…

解决GridView与scrollview嵌套时GridView显示一行数据

重写GridView的onMeasure的方法: public class MyGridView extends GridView { public MyGridView(Context context, AttributeSet attrs) { super(context, attrs); } public MyGridView(Context context) { super(context); } public MyGridView(Context context, Attri…

如何通过npm和package.json使用Node.js模块

The author selected the Open Internet/Free Speech Fund to receive a donation as part of the Write for DOnations program. 作者选择了“ 开放互联网/言论自由基金会”作为“ Write for DOnations”计划的一部分来接受捐赠。 介绍 (Introduction) Because of such featu…