PackageManagerService概述

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

我们看一下PackageManager类图

《PackageManagerService概述》

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

再来看下PackageManagerService的类图:

《PackageManagerService概述》

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

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

// 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

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

1、  PackageParser:

《PackageManagerService概述》

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

 

2、PackageManagerService.Settings:

《PackageManagerService概述》

用于容纳当前有效的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、  另外一些是跟权限有关的:

《PackageManagerService概述》

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

与PackageManager相关的代码主要在:

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

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

    原文作者:new_abc
    原文地址: https://blog.csdn.net/new_abc/article/details/12949179
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞