PackageInstaller模块解析

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) 注册和取消注册回调。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值