1.重要参数:
SessionId:它用于唯一标识一个安装会话(Session)。有会话管理,数据关联,状态查询,流程控制等等作用。
SessionInfo:记录了一个安装会话中的详细信息。如安装进度,应用信息,安装模式等等,获取方式是PackageInstaller.getSessionInfo(sessionId);
2.安装流程:
主要流程为:
3.安装流程解析:
3.1.InstallStart:
InstallStart是应用安装的初始阶段,主要功能包括:检查安装请求的合法性、确定安装来源、检查设备策略限制等等。可通过接收应用安装广播启动。
主要方法包括:
isCallerSessionOwner:检查发起安装请求的应用程序(或进程)是否是PackageInstaller
会话的所有者,确保了只有合法的会话所有者才能对会话进行操作,比如确认安装、更新会话数据等。
checkDevicePolicyRestrictio:检查设备策略限制,以确定是否允许用户在当前设备上安装应用。这个方法特别关注两种主要的限制:禁止安装应用和禁止安装未知来源的应用。不通过则会进行弹框提示。其中禁止安装应用会判断UserManager.DISALLOW_INSTALL_APPS标志位,禁止安装未知来源的应用会判断UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES和
UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES_GLOBALLY标志位
检查完相关信息后,会根据URI类型的不同,导向不同的处理路径:
3.2 InstallStaging:
InstallStaging是一个阶段性安装过程,主要作用是将从内容提供者(如下载管理器)获取的应用文件暂存到一个安装会话中,以便进行后续的安装操作。这个过程涉及到文件的读取、写入以及错误处理和用户反馈。
主要方法包括:
openAssetFileDescriptor : 尝试打开内容URI对应的AssetFileDescriptor,用来访问应用资源。
createSessionParams :创建并配置PackageInstaller.SessionParams
,设置安装模式、来源、安装位置等参数。
StagingAsyncTask :定义了一个异步任务,主要负责在doInBackground中执行文件的读取和写入操作。
如果流程正常,会在onPostExecute中跳转至DeleteStagedFileOnResult.java
3.3 DeleteStagedFileOnResult :
DeleteStagedFileOnResult的主要作用是处理一些清理工作。
通过startActivityForResult跳转到PackageInstallerActivity,在onDestroy中通过abandonSession(sessionId) 来释放和清理相关的资源。
3.4 PackageInstallerActivity :
PackageInstallerActivity负责处理通过侧载(side loading)安装新应用的流程。
主要方法包括:
checkIfAllowedAndInitiateInstall:检查是否允许从未知来源安装应用,并相应地启动安装流程或显示对话框。
initiateInstall:通过startInstallConfirm显示确认对话框,让用户确认是否安装应用。
bindUi:通过对确认对话框中确认键的监听,调用startInstall方法开始安装流程:
startInstall:跳转至InstallInstalling。
3.5 InstallInstalling:
InstallInstalling主要负责把安装包发送给包管理器并处理包管理器的结果。在onCreate方法中,初始化包管理器和安装会话ID。如果安装包的URI方案是package,则尝试直接安装已存在的包;如果是file,则处理文件安装。安装逻辑主要在InstallingAsyncTask异步任务中:
安装成功后会调用launchSuccess()跳转到InstallSuccess。
3.6 InstallSuccess:
InstallSuccess用于显示安装成功的弹框。
4.安装进度的获取:
实现PackageInstaller.SessionCallback回调,通过其onProgressChanged方法中的progress可以得到当前进度。在对应的位置通过PackageInstaller.registerSessionCallback(PackageInstaller.SessionCallback callback) 和 PackageInstaller.unregisterSessionCallback(PackageInstaller.SessionCallback callback) 注册和取消注册回调。