Android系统重要组件PMS

这篇具有很好参考价值的文章主要介绍了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系统的运行机制,并且可以帮助我们更好的开发我们自己的应用程序。文章来源地址https://www.toymoban.com/news/detail-407069.html

到了这里,关于Android系统重要组件PMS的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Unity3D框架】Unity Package Manager自定义包管理实践

            在公司开发的前两个项目,虽然搭建了基础的框架,有一些目录划分,但是当项目复杂度增长到一定程度,以及后续新开了一些新的项目之后,对于基础框架的管理就遇到了一些挑战,主要体现在以下几个方面:         1、多项目之间拷贝了类似的基础框架,但是

    2024年02月03日
    浏览(60)
  • Unity实战问题-解决UnityHUb的Failed to start the Unity Package Manager local server process

    点击跳转=Unity3D特效百例 点击跳转=案例项目实战源码 点击跳转=游戏脚本-辅助自动化 点击跳转=Android控件全解手册 点击跳转=Scratch编程案例 点击跳转=软考全系列 点击跳转=蓝桥系列 专注于 Android/Unity 和各种游戏开发技巧,以及 各种资源分享 (网站、工具、素材、源码、游

    2024年02月13日
    浏览(38)
  • Cargo, the Rust package manager, is not installed or is not on PATH. 解决方案

    今天在配置一个关键时需要执行pip install logru,在执行过程中出现了以下错误:   error: subprocess-exited-with-error   × Preparing metadata (pyproject.toml) did not run successfully.   │ exit code: 1   ╰─ [6 lines of output]       Cargo, the Rust package manager, is not installed or is not on PATH.       This packag

    2024年02月09日
    浏览(36)
  • 【Android】SDK Manager打开闪退问题

    1、找到android.bat文件,在android-sdk-windowstools目录下 2、右击android.bat文件,选择编辑。 找到如下位置: rem Check we have a valid Java.exe in the path. set java_exe= call libfind_java.bat if not defined java_exe goto :EOF 3、更改路径为java的绝对路径 rem Check we have a valid Java.exe in the path. set java_exe=“ja

    2024年02月14日
    浏览(33)
  • 安卓重要UI组件之 Fragment

    安卓中的 Fragment 是一种可重用的 UI 组件,它代表了应用界面的一部分。一个 Activity 可以包含多个 Fragment,这些 Fragment 可以在运行时被添加、移除或替换,从而实现动态的界面变化。Fragment 可以像 Activity 一样拥有自己的生命周期,并且可以处理用户输入、显示信息、响应事

    2023年04月12日
    浏览(22)
  • Unity 之 Material (材质)渲染3D对象的重要组件

    在Unity中,Material(材质)是一种用于渲染3D对象的重要组件。Material定义了对象的外观,包括其颜色、纹理、光照属性和反射等。以下是关于Material的详细介绍: 创建Material : 要创建一个Material,通常需要一个着色器(Shader)以及一个或多个纹理。您可以通过以下步骤来创建

    2024年02月08日
    浏览(28)
  • 三、搭建OpenStack(M版)之Keystone组件(重要)

    本实验环境为windows11系统,Vmware pro 15.5,虚拟机为Ubuntu16.04 server 进入数据库并创建 赋予数据库权限,‘1234’为keystone自定义密码 禁用Keystone服务在安装完成后自启 安装软件包,不出意外的话 生成的令牌一定要保存下来,后续配置会使用 在[DEFAULT]里添加临时令牌(填自己的

    2024年02月04日
    浏览(29)
  • layui入门使用文档(包含几个重要的组件)

    一、引言 :注意部分配置是用到了和jsp交互使用在HTML时需要修改 1.1 介绍 https://www.layuiweb.com/ 在官网首页,可以很方便的下载LayUI LayUI 是一款经典模块化前端 UI 框架,我们只需要定义简单的HTML、CSS、JS即可实现很复杂的前端效果。 使得前端页面的制作变得更加简单。 二、环

    2024年02月02日
    浏览(21)
  • Cilium 系列-3-Cilium 的基本组件和重要概念

    Cilium 系列文章 安装完了,我们看看 Cilium 有哪些组件和重要概念。 如上所述,安装 Cilium 时,会安装几个运行组件(有些是可选组件), 它们各是什么用途? Cilium Operator 可以理解为 Cilium 的管理平面或操作运维平面。Cilium Operator 不处于任何转发或网络策略决策的关键路径上

    2024年02月16日
    浏览(26)
  • Android 14重要更新预览

    Android 14 在 Android 13 的基础上进一步扩展了按应用设定语言功能,提供了一些额外的功能: 自动生成应用的 localeConfig :从 Android Studio Giraffe Canary 7 和 AGP 8.1.0-alpha07 开始,您可以配置应用以自动支持各应用语言偏好设定。Android Gradle 插件将根据您的项目资源生成 LocaleConfig 文

    2024年02月14日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包