APK的安装流程及PackageManagerService源码解析&静默安装

本文详细解析了Android APK的安装流程,包括涉及的目录、安装方式以及PackageManagerService在其中的角色。从系统启动时的扫描与优化,到不同方式的安装过程,如系统APK、网络下载、ADB工具和第三方应用安装。重点介绍了静默安装的实现,涉及到的权限检查、文件复制、dexopt转换和广播发送。内容基于Android 6.0的源码分析。
摘要由CSDN通过智能技术生成

Android的应用管理主要是通过PackageManagerService来完成的,PackageManagerService服务负责各种APK包的安装,卸载,优化和查询.

PackageManagerService在系统启动时会扫描所有APK文件和jar包,然后把它们的信息读取出来,保存在内存中,这样系统运行时就能迅速找到各种应用和组件的信息.扫描过程中如果遇到没有优化的文件,还要执行转换工作,将APP文件中的dex格式转换成oat格式(Android5.0之前是转换成odex格式);启动后,将提供安装包的信息查询服务及应用的安装和卸载服务.

一、安装涉及的目录介绍:

system/priv-app ---- 存放一些系统底层应用(Settings,SystemUI等,拥有的权限最高)

system/app ---- 存放系统级的应用(phone,Contacts等)

data/app ---- 存放用户安装的应用

data/data ---- 存放安装应用程序的数据

data/dalvik-cache ---- 存放大部分的apk文件和jar包的odex版本,odex是一种优化过的格式,执行速度比apk文件中的dex格式更快,如果系统运行在art模式下,这里保存的是oat格式的文件,这种文件格式是Linux的ELF格式的一种私有形式

data/system/packages.xml ---- 记录系统中所有安装的应用信息,包括基本信息、签名和权限

data/system/packages.list ---- 保存普通应用的数据目录和uid等信息

二、apk安装的方式:
  • 1.安装系统APK和预置的APK(第一次开机时安装,没有安装界)

PackageManagerService的构造中会扫描对应目录下的apk,完成安装

  • 2.网络下载应用安装――通过market应用完成,没有安装界面

调用PackageManager的installPackage方法执行安装

  • 3.ADB工具安装,没有安装界面

调用:msm8976/repo/system/core/adb/commandline.cpp中install_app方法,该方法调用pm_command通过send_shell_command方法将数据发送到手机端的adbd守护进程中,adbd在收到PC中Console发来的数据之后启动一个Shell,然后执行pm脚本(pm位于/system/bin目录下).

pm脚本通过app_process执行pm.jar包的main函数(\system\framework\pm.jar)
对应源码: msm8976/repo/frameworks/base/cmds/pm/src/com/android/commands/pm/Pm.java

private int runInstall() {
        ...
        ...
        LocalPackageInstallObserver obs = new LocalPackageInstallObserver();
        try {
            VerificationParams verificationParams = new VerificationParams(verificationURI,
                    originatingURI, referrerURI, VerificationParams.NO_UID, null);

            mPm.installPackageAsUser(apkFilePath, obs.getBinder(), installFlags,
                    installerPackageName, verificationParams, abi, userId);

            synchronized (obs) {
                while (!obs.finished) {
                    try {
                        obs.wait();
                    } catch (InterruptedException e) {
                    }
                }
                if (obs.result == PackageManager.INSTALL_SUCCEEDED) {
                    System.out.println("Success");
                    return 0;
                } else {
                    System.err.println("Failure ["
                            + installFailureToString(obs)
                            + "]");
                    return 1;
                }
            }
        } catch (RemoteException e) {
            System.err.println(e.toString());
            System.err.println(PM_NOT_RUNNING_ERR);
            return 1;
        }
    }

调用PMS的installPackageAsUser完成安装

  • 4.第三方应用安装,有安装界面

安装本地apk,有安装界面,由package/app/PackageInstaller应用处理安装及卸载过程的界面

以上方式都有PackageInstallObserver来监听安装是否成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值