Android PMS(Package Manager Service)是Android系统中的一个重要组件,它管理着Android系统中所有应用程序的安装、卸载、更新等工作。下面我们来详细介绍一下Android PMS的原理及其代码分析,以及其常见方法。
Android PMS是Android系统的一个系统服务,主要用于管理应用程序的安装、卸载和更新等工作。它在系统启动的时候会被启动,并由系统进程进行管理。Android PMS的主要原理可以分为以下四个方面:
1、应用程序的安装
当用户安装应用程序的时候,Android PMS会负责将APK包解析成对应的Java对象,并将相关信息存储到系统目录下的data/data/packageManager.xml文件中,同时将APK包保存到系统目录下的data/app文件夹中。在存储相关信息的过程中,Android PMS会根据权限等级来决定该应用程序是否具有某些权限。
2、应用程序的卸载
当用户卸载应用程序的时候,Android PMS会负责将系统目录下的data/data/packageManager.xml文件中对应该应用程序的信息删除,并将data/app文件夹下的该应用程序的APK包删除,同时删除该应用程序的数据和缓存。
3、应用程序的更新
当用户更新应用程序的时候,Android PMS会执行类似应用程序的卸载和安装操作,即先删除旧版本,然后再安装新版本。
4、应用程序的权限管理
Android PMS还负责管理应用程序的权限,它会负责在应用程序的安装过程中对其所申请的权限进行验证,并决定该应用程序是否具有权利使用这些权限。在应用程序运行的时候,Android PMS还会根据权限等级来决定某些操作是否可以进行。
PMS的核心代码在frameworks/base/services/core/java/com/android/server/pm/
目录下,主要包含以下文件:
PackageManagerService.java
:PMS的主要服务类,负责启动应用管理器,解析和更新应用程序包,并维护当前已安装应用程序的列表和元数据。PackageParser.java
:应用程序包解析器,用于解析APK文件和验证权限等信息。Settings.java
:应用程序包和权限设置类,用于存储和检索已安装应用程序的数据。PermissionPolicyInternal.java
:权限策略类,用于处理与应用程序权限相关的逻辑。除此之外,还有一些辅助类,如PackageSetting
、UserManagerService
等,都是为了让PMS能够更好地完成应用管理和权限控制。
总的来说,PMS的代码分析需要涉及到Android系统的整体架构、Android应用程序包的文件结构、Android应用程序的安装、卸载和更新等方面的知识。需要有一定的Android系统开发经验和Java编程能力才能进行深入的理解。
以下是Android PMS的关键代码片段:
public class PackageManagerService extends IPackageManager.Stub implements Context
.SystemService, Watchdog.Monitor {
public void installPackage(String packageURI, PackageInstallObserver observer, int flags,
String installerPackageName) {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.INSTALL_PACKAGES, "Package installer");
Uri packageUri = Uri.parse(packageURI);
PackageParser.Package pkg = null;
try {
final File tmpFile = mInstaller.installStage(packageUri, observer, flags, null,
installerPackageName);
pkg = scanPackageLI(tmpFile, flags | SCAN_NEW_INSTALL | SCAN_FORWARD_LOCK, 0,
System.currentTimeMillis(), null);
if (pkg != null) {
Message msg = mHandler.obtainMessage(POST_INSTALL,
new InstallParams(pkg, tmpFile, 0, installerPackageName, null,
observer));
mHandler.sendMessage(msg);
} else {
mInstaller.rollbackActiveInstall(observer);
}
} catch ...
}
}
该代码段是PackageManagerService服务的installPackage方法。在这个方法中,使用enforceCallingOrSelfPermission来确保只有拥有安装应用程序权限的应用程序才能执行此操作。然后通过解析包URI来获取包对象,接着通过scanPackageLI方法来扫描包并将其转换为Package对象。最后,PackageManagerService服务将该Package对象传递给Handler,以异步方式完成包的安装过程。
以下是PackageManagerService服务的scanPackageLI方法的关键代码片段:
private PackageParser.Package scanPackageLI(File scanFile, int flags, int scanMode,
long currentTime, UserHandle user) throws PackageManagerException {
if ((flags & PackageParser.PARSE_IS_SYSTEM) != 0) {
flags |= PackageParser.PARSE_IS_SYSTEM_DIR;
}
PackageParser pp = new PackageParser();
final PackageParser.Package pkg;
try {
pp.setSeparateProcesses(mSeparateProcesses);
pp.setCallback(this);
pkg = pp.parsePackage(scanFile, flags, true);
} catch .. {
throw new PackageManagerException(INSTALL_PARSE_FAILED_BAD_MANIFEST,
"Failed to parse package " + scanFile);
}
return pkg;
}
该代码段是PackageManagerService服务的scanPackageLI方法。在此方法中,这段代码创建了一个PackageParser对象,设置了此对象的解析进程独立标志,并将此实例传递给PackageParser的scanner和parser部分来扫描和解析包。最终,这个方法返回一个PackageParser.Package对象。
1、获取应用信息
PackageManager pm = getPackageManager();
List<PackageInfo> packages = pm.getInstalledPackages(0);
for (PackageInfo packageInfo : packages) {
String packageName = packageInfo.packageName;
String versionName = packageInfo.versionName;
int versionCode = packageInfo.versionCode;
ApplicationInfo applicationInfo = packageInfo.applicationInfo;
String appName = pm.getApplicationLabel(applicationInfo).toString();
Drawable icon = pm.getApplicationIcon(applicationInfo);
}
2、安装应用程序
private void install(String path) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.fromFile(new File(path)), "application/vnd.android.package-archive");
startActivity(intent);
}
3、卸载应用程序
Intent intent = new Intent(Intent.ACTION_DELETE, Uri.parse("package:" + packageName));
startActivity(intent);
4、获取应用程序的权限信息
PackageManager pm = getPackageManager();
String[] permissions = pm.getPackageInfo(packageName, PackageManager.GET_PERMISSIONS).requestedPermissions;
5、获取应用程序的应用组件信息
PackageManager pm = getPackageManager();
PackageInfo packageInfo = pm.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES |PackageManager.GET_SERVICES|PackageManager.GET_PROVIDERS|PackageManager.GET_RECEIVERS);
ActivityInfo[] activities = packageInfo.activities;
ServiceInfo[] services = packageInfo.services;
ContentProviderInfo[] providers = packageInfo.providers;
BroadcastReceiver[] receivers = packageInfo.receivers;
以上是Android PMS原理及其代码分析以及其常见方法的介绍。了解PMS的原理是非常重要的,它能帮助我们更好的理解Android系统的运行机制,并且可以帮助我们更好的开发我们自己的应用程序。