You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

adb shell cmd package compile命令执行异常及权限疑问

问题与排查记录

概述

执行命令 adb shell cmd package compile -m speed -f my-package 后立即返回Success,但通过 adb shell dumpsys package my-package 验证时,输出显示:

Dexopt state:
  [my-package]
    path: /data/app/~~RlA_7phUWI_QeKL5Ez0VaQ==/my-package-8Q64dwzm_qioAdSVBF3J5g==/base.apk
      arm64: [status=speed-profile] [reason=bg-dexopt]
      odex file size: base.art: 4712Kb base.odex: 6408Kb base.vdex: 82542Kb

其中[status=speed-profile] [reason=bg-dexopt]表明命令并未生效。

设备信息

基础信息

  • adb版本:33.0.2-8557947
  • Android版本:12
  • 内核版本:5.10.66
  • 是否root:否

系统属性

# 注:仅列出有用信息

$ adb shell getprop

[dalvik.vm.usejit]: [true]
[dalvik.vm.usejitprofiles]: [true]

[pm.dexopt.ab-ota]: [speed-profile]
[pm.dexopt.bg-dexopt]: [speed-profile]
[pm.dexopt.boot-after-ota]: [verify]
[pm.dexopt.cmdline]: [verify]
[pm.dexopt.first-boot]: [verify]
[pm.dexopt.first-use]: [speed-profile]
[pm.dexopt.inactive]: [verify]
[pm.dexopt.install]: [speed-profile]
[pm.dexopt.install-bulk]: [speed-profile]
[pm.dexopt.install-bulk-downgraded]: [verify]
[pm.dexopt.install-bulk-secondary]: [verify]
[pm.dexopt.install-bulk-secondary-downgraded]: [extract]
[pm.dexopt.install-fast]: [skip]
[pm.dexopt.post-boot]: [extract]
[pm.dexopt.shared]: [speed]

排查过程

通过logcat获取到日志:

PackageManager: Skipped dexOpt for start by shell: my-package

查看Android源码后发现,编译过程返回PackageDexOptimizer.DEX_OPT_SKIPPED。

DexOptHelper类中的相关代码如下:

/*package*/ boolean performDexOpt(DexoptOptions options) {
        final Computer snapshot = mPm.snapshotComputer();
        if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) {
            return false;
        } else if (snapshot.isInstantApp(options.getPackageName(), UserHandle.getCallingUserId())) {
            return false;
        }

        if (options.isDexoptOnlySecondaryDex()) {
            return mPm.getDexManager().dexoptSecondaryDex(options);
        } else {
            int dexoptStatus = performDexOptWithStatus(options);
            return dexoptStatus != PackageDexOptimizer.DEX_OPT_FAILED;
        }
    }

可见,非SecondaryDex场景下,只要结果不是PackageDexOptimizer.DEX_OPT_FAILED就会被判定为成功。

问题

  1. 为何adb shell cmd package compile命令返回Success但未生效?
    推测是被系统忽略处理,依据上述日志信息。

  2. 编译不存在的包(如adb shell cmd package compile -m speed -f not-found-package)为何也返回Success?
    推测原因与问题1相同。

  3. 为何不允许在shell中运行dexOpt?

补充信息

相关源码

  • 对应Android AOSP源码中PackageManagerShellCommand.java的第1771行

日志

在开发者模式中调整日志级别为verbose后,logcat获取到以下日志:

PackageManager: Skipped dexOpt for start by shell: my-package

内容的提问来源于stack exchange,提问作者k8890

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 10:16:04