Android——简单易懂说原理之PMS、IMS和Binder

写在前面:这次给大家推荐一个看源码的网站,虽然不能调试,但是看起来很方便。Android OS在线源码

目录

  • 一、PMS
    • 1.PackageInstaller的初始化与安装APK过程
    • 2.PMS对APK安装过程的处理
    • 3.PMS的构造方法分析
    • 4.App的安装流程整体回顾与其他补充
  • 二、IMS
  • 三、Binder

一、PMS

PackageManagerService(PMS)是包管理机制的核心,负责对包进行管理。AMS总是会使用PMS加载包的信息,将其封装在LoadedApk这个类对象中,然后我们就可以从中取出在AndroidManifest中声明的四大组件信息了。
AMS和PMS都属于系统服务中的引导服务,引导服务及其作用如下图所示:
Android——简单易懂说原理之PMS、IMS和Binder_第1张图片
PMS的管理类是PackageManager,用于向应用程序进程提供一些功能。它是一个抽象类,具体实现类为ApplicationPackageManager,ApplicationPackageManager中的方法会通过IPackageManager(一个AIDL的接口)与AMS进行进程间通信,因此PackageManager所提供的的功能最终是由PMS来实现的,如下图所示:
Android——简单易懂说原理之PMS、IMS和Binder_第2张图片
PackageManager的主要功能如下:
①获取一个应用程序的所有信息(ApplicationInfo);
②获取四大组件的信息;
③查询permission的相关信息;
④获取包的信息;
⑤安装、卸载APK。

1.PackageInstaller的初始化与安装APK过程

PackageInstaller是系统内置的应用程序,用于安装和卸载应用程序,在PackageInstaller安装apk前,需要进行初始化工作,我们先来看一下这部分的工作流程:
Android——简单易懂说原理之PMS、IMS和Binder_第3张图片
重点说几个地方。首先是判断是否为Android7.0以上的版本。因为在Android7.0开始,我们会使用FileProvider来处理URI,FileProvider会隐藏共享文件的真实路径,并且将路径转换成content://Uri,所以会跳转到InstallStaging来将Content协议转换为file协议,之后跳转到PackageInstallerActivity中。所以说,PackageInstallerActivity才是应用安装器PackageInstaller真正的入口Activity。
再来说一下在PackageInstallerActivity中初始化所需的各种对象,以下几个是比较主要的:

  • PackageManager:用于向应用程序进程提供一些功能,最终的功能由PMS来实现;
  • IPackageManager:一个AIDL接口,用于和PMS进行进程间通信;
  • AppOpsManager:用于权限动态监测,从Android4.3开始被引入;
  • PackageInstaller:提供安装、升级和删除应用程序的功能;
  • UserManager:用于多用户管理。

最后看一下在“允许安装未知来源的APK或者根据Intent判断得出该APK不是未知来源”的情况,这时候会进入初始化安装步骤,接下来我们来看看这一步骤的具体流程:
Android——简单易懂说原理之PMS、IMS和Binder_第4张图片
这个时候,安装确认界面已经呈现给用户,由此完成了PackageInstaller初始化的工作。
虽然看流程图有一堆判断,但总结起来就是以下四点:
①根据Uri的Scheme协议不同,跳转到不同的界面,content协议跳转到InstallStart,其他的跳转到PackageInstallerActivity(Android7.0及以上就会跳转到InstallStart);
②InstallStart将content协议的Uri转换为file协议,然后跳转到PackageInstallerActivity(功能上的真正入口Activity);
③PackageInstallerActivity会分别对package协议和file协议的Uri进行处理,如果是file协议,则会解析apk文件得到包信息PackageInfo;
④PackageInstallerActivity会对未知来源的APK进行处理,如果允许安装未知来源的APK或者根据Intent判断得出该APK不是未知来源的,就会初始化安装确认界面;如果管理员限制来自未知来源的安装流程,则会弹出提示对话框或者跳转到设置界面。

说完了PackageInstaller的初始化,接下来就该说说PackageInstaller安装APK了,也就是在安装确认界面中,用户点击【确定】按钮后发生的事。
还是在PackageInstallerActivity中,有个onClick方法,当点击了【确定】按钮后,这个onClick方法会首先判断点击的按钮是确定还是取消,发现是

你可能感兴趣的:(Android开发,android)