Package Installer源码学习分析

背景

主要功能:

  1. 安装前验证
  2. 安装程序
  3. 卸载程序

主要安装方式:
- Intent 隐式调用
- adb install or pm shell命令
- root权限or 静默安装

这里主要看第一种方式,Package Installer 入口 一般通过Java代码安装应用会创建Intent,并且指定一个activity action,隐式调用。
可以先看看PackageInstaller的AndroidManifest.xml文件
与普通应用的区别没有Android.intent.action.MAIN的activity action 所以不会在Android 系统的程序列表中有任何图标

PackageInstallerActivity InstallAppProgress
UninstallerActivity UninstallAppProgress

Intent隐式调用安装apk ,其中Uri from file: |package: PackageInstallerActivity是负责安装的入口界面,在这个activity中完成安装应用的初始化操作。在onCreat()方法中完成下面主要的核心任务:
- 从Intent对象中获取Package Uri,Scheme等信息。
- 对从Intent中获取的信息进行校验,主要是Scheme信息。
- 根据Scheme信息(file|package)进行处理相应的,获取ApplicationInfo对象,该对象包含应用相关信息。如应用名称,图标。并且显示应用的信息。
- 校验系统是否允许安装“未知来源”的应用
- 进行安装前的准备,并根据具体情况显示校验窗口
initiateInstall()初始化工作并且调用 startInstallConfirm()权限列表,尽管安装之前的校验工作很复杂,但是这并不是Package Installer 的主要任务,安装才是主要的工作,这是在InstallAppProgress中完成的。
在InstallAppProgress中的onCreate方法中获取ApplicationInfo对象的值mAppInfo和mPackageURI接下来会验证scheme是否是file或者package最后调用initView方法开始安装应用。安装应用的核心代码也在initView这个方法中。一开始initView方法根据package name 或者apk 文件的路径获取一些信息,然后判断该程序是否已经安装,如果已经安装就进入更新模式(通过installFlags变量控制)。尽管在initView方法的代码看上去很多,但是真正核心的就下面几行代码

        if ("package".equals(mPackageURI.getScheme())) {
            try {
                //根据packageName更新应用
                pm.installExistingPackage(mAppInfo.packageName);
                observer.packageInstalled(mAppInfo.packageName,
                        PackageManager.INSTALL_SUCCEEDED);
            } catch (PackageManager.NameNotFoundException e) {
                observer.packageInstalled(mAppInfo.packageName,
                        PackageManager.INSTALL_FAILED_INVALID_APK);
            }
        } else {
            //使用APK的路径安装或者更新应用
            pm.installPackageWithVerificationAndEncryption(mPackageURI, observer, installFlags,
                    installerPackageName, verificationParams, null);//Android 4.2以后有这个方法
        }

其中installExistingPackage和installPackageWithVerificationAndEncryption都是PackageManger类的方法,这两个方法都是静默安装应用。但是这两个方法都被设为hide,在普通的Activity中无法使用。由于这两个方法都是异步执行的,PackageInstallObserver是安装事件的监听器,不管安装成功还是失败都会给用户一个反馈。

卸载应用

卸载Android 应用与安装应用类似,也是调用系统几的API,这些API无法在普通应用中调用,使用这些API可以实现静默卸载。Package Installer 在卸载之前都会弹出确认。这个询问对话框就是卸载的入口,对应 UninstallerActivity 类。该Activity也允许普通程序通过Action调用,UninstallerActivity的关键部分是确认按钮对应的事件如下

 @Override
        public void onClick(DialogInterface dialog, int which) {
            if (which == Dialog.BUTTON_POSITIVE) {
                ((UninstallerActivity) getActivity()).startUninstallProgress();
            } else {
                ((UninstallerActivity) getActivity()).dispatchAborted();
            }
        }
      void startUninstallProgress() {
        Intent newIntent = new Intent(Intent.ACTION_VIEW);
        newIntent.putExtra(Intent.EXTRA_USER, mDialogInfo.user);
        //卸载改Android 应用对于所有用户的程序和数据
        newIntent.putExtra(Intent.EXTRA_UNINSTALL_ALL_USERS, mDialogInfo.allUsers);
        newIntent.putExtra(PackageInstaller.EXTRA_CALLBACK, mDialogInfo.callback);
        newIntent.putExtra(PackageUtil.INTENT_ATTR_APPLICATION_INFO, mDialogInfo.appInfo);
        //允许卸载窗口返回是否卸载成功的标志,可以用startActivityForResult接收
        if (getIntent().getBooleanExtra(Intent.EXTRA_RETURN_RESULT, false)) {
            newIntent.putExtra(Intent.EXTRA_RETURN_RESULT, true);
            newIntent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
        }
        newIntent.setClass(this, UninstallAppProgress.class);
        startActivity(newIntent);
    }

点击确认按钮后会调用startUninstallProgress方法,和安装过程类似,卸载过程是在UninstallAppProgress中完成的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
packageinstaller 是一款用于安装 Android 应用程序的工具。它可以在 Android 设备上安装来自于各种来的应用程序包(APK)。下面是 packageinstaller 的安装流程: 1. 准备安装:首先,用户需要下载所需的 APK 文件。这个文件可以来自于各种来,如应用商店、网站或其他设备。 2. 打开 packageinstaller:用户可以通过点击 APK 文件,或者手动打开 packageinstaller 应用程序进入安装界面。 3. 安全性校验:Android 系统会对 APK 文件进行安全性校验,以确保其不包含病毒或恶意软件。 4. 安装设置:在安装界面中,用户可以选择是否允许安装未知来的应用。如果用户未开启此选项,则只能安装来自于应用商店或其他受信任来的应用。 5. 安装确认:用户需要仔细阅读权限授权列表,并确认是否同意这些权限。这些权限可能包括访问设备上的文件、使用摄像头、定位信息等。 6. 安装应用:一旦用户确认权限,packageinstaller 会开始安装应用程序。它会解析 APK 文件并将应用程序的文件和数据复制到设备上。 7. 安装完成:安装过程完成后,用户将收到一个提示,告诉他们应用程序已经成功安装。用户可以选择立即打开应用程序或者返回主屏幕。 总结来说,packageinstaller 安装流程包括准备安装、打开 packageinstaller、安全性校验、安装设置、安装确认、安装应用和安装完成等步骤。通过这个流程,用户可以安全地安装他们所需的 Android 应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值