Android 的应用管理主要是通过PackageManagerService来完成的。PackageManagerService服务负责各种APK包的安装、卸载、优化和查询。
PackageManagerService在启动时会扫描所有的APK文件和Jar包,然后把他们的信息读取出来,保存在内存中,这样系统在运行时就能迅速找到各种应用和组件的信息。扫描过程中如果遇到没有优化的文件,还要执行转换工作,将app文件从dex格式转换为oat格式(Android5.0之前是转换为odex格式)。
Android应用管理一 APK包的安装、卸载和优化
(PackageManagerService)
在应用中如果使用PackageManagerService服务,通常调用的是Context 的 getPackageManager() 方法,这个方法返回的是PackageManager对象。
Class for retrieving various kinds of information related to the application packages that are currently installed on the device.
public abstract PackageInfo getPackageInfo(String packageName, int flags)根据包名获取对应的PackageInfo
PackageInfo packageInfo = packageManager.getPackageInfo(
context.getApplicationInfo().packageName, 0);
PackageInfo用于描述mainfest中所有描述信息。
常见字段:
(1)public String packageName;包名
(2)public String[] splitNames;
(3)public int versionCode;版本号
(4)public String versionName;版本名称
(5)public ApplicationInfo applicationInfo;
(6)public long firstInstallTime;第一次安装时间
(7)public long lastUpdateTime;上次更新时间
(8)public ActivityInfo[] activities;所有的Activity信息
(9)public ActivityInfo[] receivers; 所有的广播接收者
(10)public ServiceInfo[] services;所有的服务信息
(11)public ProviderInfo[] providers;获取ContentProvide
(12)public PermissionInfo[] permissions;所有的权限信息
public abstract ApplicationInfo getApplicationInfo(String packageName,
int flags),根据指定的包名获取ApplicationInfo
ApplicationInfo applicationInfo = packageManager.getApplicationInfo(
context.getApplicationInfo().packageName, 0);
ApplicationInfo描述应用程序的基本信息
常见字段:
(1)public String taskAffinity;
(2)public String permission;
(3)public String processName;
(4)public String className;
(5)public int descriptionRes;
(6)public static final int FLAG_SYSTEM = 1<<0;系统应用
(7)public static final int FLAG_EXTERNAL_STORAGE = 1<<18;安装在外部存储卡
(8)public static final int FLAG_LARGE_HEAP = 1<<20;支持大内存
获得应用名称、版本名称、版本号
public ResultInfo getApplicationInfo(Context context) {
PackageManager packageManager = context.getPackageManager();
ApplicationInfo applicationInfo = null;
PackageInfo packageInfo = null;
try {
applicationInfo = packageManager.getApplicationInfo(
context.getApplicationInfo().packageName, 0);
packageInfo = packageManager.getPackageInfo(
context.getApplicationInfo().packageName, 0);
} catch (final PackageManager.NameNotFoundException e) {
}
ResultInfo resultInfo = new ResultInfo();
resultInfo.applicationName = packageManager.getApplicationLabel(
applicationInfo).toString();//应用名称
resultInfo.applicationVersionCode = packageInfo.versionCode;
resultInfo.applicationVersionName = packageInfo.versionName;
return resultInfo;
}