Android PackageManagerService

一、APK介绍

APK是AndroidPackage的缩写,即Android安装包,它实际上是zip格式的压缩文件,一般情况下,解压后的文件结构如下表所示。

目录/文件描述

assert

存放的原生资源文件,通过AssetManager类访问。

lib

存放库文件。

META-INF

保存应用的签名信息,签名信息可以验证APK文件的完整性。

res

存放资源文件。res中除了raw子目录,其他的子目录都参与编译,这些子目录下的资源是通过编译出的R类在代码中访问。

AndroidManifest.xml

用来声明应用程序的包名称、版本、组件和权限等数据。 apk中的AndroidManifest.xml经过压缩,可以通过AXMLPrinter2工具解开。

classes.dex

Java源码编译后生成的Java字节码文件。

resources.arsc

编译后的二进制资源文件。

APK的安装场景主要有以下几种:

通过adb命令安装:adb 命令包括adb push/install

用户下载的Apk,通过系统安装器packageinstaller安装该Apk。packageinstaller是系统内置的应用程序,用于安装和卸载应用程序。

系统开机时安装系统应用。

电脑或者手机上的应用商店自动安装。

二、PackageManager介绍

PackageManagerService是Android系统核心服务之一,也是Android中最常用的服务之一。它主要负责的工作如下:

1. 解析AndroidManifest.xml文件,解析清单文件中的所有节点信息。

2. 扫描.apk文件,安装系统应用,本地应用等。

3. 管理本地应用,主要有:安装、卸载、应用信息查询等。

如果想要调用PMS的服务,则可以通过Context去调用getPackageManager方法。

public abstract PackageManager getPackageManager();

三、PackageManager相关类

ApplicationPackageManager

Class for retrieving various kinds of information related to the application packages that are currently installed on the device.

ApplicationPackageManager代码位于:

frameworks/base/core/java/android/app/ApplicationPackageManager.java

ApplicationPackageManager的定义:

public class ApplicationPackageManager extends PackageManager {}

PackageManager

Class for retrieving various kinds of information related to the application packages that are currently installed on the device.

PackageManager代码位于:

frameworks/base/core/java/android/content/pm/PackageManager.java

PackageManager的定义:

public abstract class PackageManager {}

PackageManager方法:

abstract Drawable getApplicationIcon(String packageName):检索与应用程序关联的图标。
abstract Drawable getApplicationIcon(ApplicationInfo info):检索与应用程序关联的图标。
abstract ApplicationInfo getApplicationInfo(String packageName, int flags):检索我们所了解的有关特定软件包/应用程序的所有信息。
abstract CharSequence getApplicationLabel(ApplicationInfo info):返回用于此应用程序的标签。
abstract Drawable getApplicationLogo(String packageName):检索与应用程序关联的徽标。
abstract int getComponentEnabledSetting(ComponentName componentName):返回包组件(活动,接收者,服务,提供者)的启用设置。
abstract Drawable getDrawable(String packageName, int resid, ApplicationInfo appInfo):从包中检索图像。
abstract List<ApplicationInfo> getInstalledApplications(int flags):返回设备上安装的所有应用程序包的列表。
abstract List<PackageInfo> getInstalledPackages(int flags):返回设备上安装的所有软件包的列表。
abstract String getInstallerPackageName(String packageName):检索安装软件包的应用程序的软件包名称。
abstract ResolveInfo resolveActivity(Intent intent, int flags):确定针对给定意图执行的最佳操作。
abstract List<ResolveInfo> queryIntentActivities(Intent intent, int flags):检索可以针对给定意图执行的所有活动。
abstract ResolveInforesolveService(Intent intent, int flags):确定为给定意图处理的最佳服务。
abstract List<ResolveInfo> queryIntentServices(Intent intent, int flags):检索可以匹配给定意图的所有服务。

PackageInfo

Overall information about the contents of a package. This corresponds to all of the information collected from AndroidManifest.xml.

有关包内容的总体信息。 这对应于从 AndroidManifest.xml 收集的所有信息。

PackageInfo代码位于:

frameworks/base/core/java/android/content/pm/PackageInfo.java

PackageInfo的定义:

public class PackageInfo implements Parcelable {}

ApplicationInfo

Base class for maintaining global application state.

用于维护全局应用程序状态的基类。

ApplicationInfo文件路径:

frameworks/base/core/java/android/content/pm/ApplicationInfo.java

ApplicationInfo定义:

public class Application extends ContextWrapper implements ComponentCallbacks2 {}

PackageManagerService

Keep track of all those APKs everywhere.

随时随地跟踪所有这些APK。

PackageManagerService代码位于:

frameworks/base/services/core/java/android/server/pm/PackageManagerService.java

PackageManagerService的定义:

public class PackageManagerService implements PackageSender, TestUtilityService {}

PackageManagerServiceInjector

就是很简单的做了一层封装,把所有相关的对象都初始化都保存了起来

PackageManagerServiceInjector代码位于:

frameworks/base/services/core/java/android/server/pm/PackageManagerServiceInjector.java

PackageManagerServiceInjector的定义:

public class PackageManagerServiceInjector {}

PackageManagerNative

PackageManagerNative是Android系统中的一个类,它是PackageManagerService的本地代理。它提供了与应用程序包管理相关的功能

PackageManagerNative代码位于:

frameworks/base/services/core/java/android/server/pm/PackageManagerNative.java

PackageManagerNative的定义:

final class PackageManagerNative extends IPackageManagerNative.Stub {}

PackageHandler

Part of PackageManagerService that handles events.

PackageHandler代码位于:

frameworks/base/services/core/java/android/server/pm/PackageHandler.java

PackageHandler的定义:

final class PackageHandler extends Handler {}

ActivityInfo

Information you can retrieve about a particular application activity or receiver. This corresponds to information collected from the AndroidManifest.xml's &lt;activity&gt; and &lt;receiver&gt; tags.

您可以检索的有关特定应用程序活动或接收器的信息。这与从 AndroidManifest.xml 的 &lt;activity&gt; 和 &lt;receiver&gt; 标记收集的信息相对应。

ActivityInfo代码位于:

frameworks/base/services/core/java/android/server/pm/ActivityInfo.java

ActivityInfo的定义:

public class ActivityInfo extends ComponentInfo implements Parcelable {}

四、PackageManagerService相关流程分析

PackageManagerService启动流程

Android13 PackageManagerService 启动流程分析-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值