概述
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中一些比较重要的成员变量:
// 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:
这个类主要用于解析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相关的代码主要在:
frameworksbaseservicesjavacomandroidserverpm
frameworksbasecorejavaandroidcontentpm
最后
以上就是迅速大炮为你收集整理的PackageManagerService概述的全部内容,希望文章能够帮你解决PackageManagerService概述所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复