Android N(O) adb shell pm install package 流程分析

本文深入探讨了在Android N操作系统中,通过adb shell pm install命令安装应用的详细流程,涉及Pm.java、PackageInstaller.java、PackageInstallerSession.java及PackageManagerService.java等关键组件的交互过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考文献:https://blog.youkuaiyun.com/xuezhe__/article/details/73130567


1、alps/android_mtk/frameworks/base/cmds/pm/src/com/android/commands/pm/Pm.java

public static void main(String[] args) {
    int exitCode = 1;
    try {
        exitCode = new Pm().run(args);///////////step1
    } catch (Exception e) {
        Log.e(TAG, "Error", e);
        System.err.println("Error: " + e);
        if (e instanceof RemoteException) {
            System.err.println(PM_NOT_RUNNING_ERR);
        }
    }
    System.exit(exitCode);
}
public int run(String[] args) throws RemoteException {
    boolean validCommand = false;
    if (args.length < 1) {
        return showUsage();
    }
   ****************************************************
    if ("install".equals(op)) {
        return runInstall();/////////////////////step2
    }
private int runInstall() throws RemoteException {
    long startedTime = SystemClock.elapsedRealtime();
    final InstallParams params = makeInstallParams();
    final String inPath = nextArg();
    if (params.sessionParams.sizeBytes == -1 && !STDIN_PATH.equals(inPath)) {
        File file = new File(inPath);
        if (file.isFile()) {
            try {
                ApkLite baseApk = PackageParser.parseApkLite(file, 0); //////////step3
                PackageLite pkgLite = new PackageLite(null, baseApk, null, null, null, null,
                        null, null); //////////////////////step4
                params.sessionParams.setSize(
                        PackageHelper.calculateInstalledSize(pkgLite, false,
                        params.sessionParams.abiOverride));
            } catch (PackageParserException | IOException e) {
                System.err.println("Error: Failed to parse APK file: " + e);
                return 1;
            }
        } else {
            System.err.println("Error: Can't open non-file: " + inPath);
            return 1;
        }
    }

    final int sessionId = doCreateSession(params.sessionParams,
            params.installerPackageName, params.userId);/////////////////////step5

    try {
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值