Android系统重要组件PMS

Android PMS(Package Manager Service)是Android系统中的一个重要组件,它管理着Android系统中所有应用程序的安装、卸载、更新等工作。下面我们来详细介绍一下Android PMS的原理及其代码分析,以及其常见方法。

一、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还会根据权限等级来决定某些操作是否可以进行。

二、Android PMS代码分析

PMS的核心代码在frameworks/base/services/core/java/com/android/server/pm/目录下,主要包含以下文件:

  • PackageManagerService.java:PMS的主要服务类,负责启动应用管理器,解析和更新应用程序包,并维护当前已安装应用程序的列表和元数据。
  • PackageParser.java:应用程序包解析器,用于解析APK文件和验证权限等信息。
  • Settings.java:应用程序包和权限设置类,用于存储和检索已安装应用程序的数据。
  • PermissionPolicyInternal.java:权限策略类,用于处理与应用程序权限相关的逻辑。

除此之外,还有一些辅助类,如PackageSettingUserManagerService等,都是为了让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对象。

三、Android PMS常见方法

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系统的运行机制,并且可以帮助我们更好的开发我们自己的应用程序。

猜你喜欢

转载自blog.csdn.net/weixin_44008788/article/details/130017634
PMS