一、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 <activity> and <receiver> tags.
您可以检索的有关特定应用程序活动或接收器的信息。这与从 AndroidManifest.xml 的 <activity> 和 <receiver> 标记收集的信息相对应。
ActivityInfo代码位于:
frameworks/base/services/core/java/android/server/pm/ActivityInfo.java
ActivityInfo的定义:
public class ActivityInfo extends ComponentInfo implements Parcelable {}