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就会被判定为成功。
问题
为何
adb shell cmd package compile命令返回Success但未生效?
推测是被系统忽略处理,依据上述日志信息。编译不存在的包(如
adb shell cmd package compile -m speed -f not-found-package)为何也返回Success?
推测原因与问题1相同。为何不允许在shell中运行dexOpt?
补充信息
相关源码
- 对应Android AOSP源码中
PackageManagerShellCommand.java的第1771行
日志
在开发者模式中调整日志级别为verbose后,logcat获取到以下日志:
PackageManager: Skipped dexOpt for start by shell: my-package
内容的提问来源于stack exchange,提问作者k8890
相关产品推荐
相关产品推荐

