Android11+小米手机上TinkerDexOptimizer.triggerPMDexOptOnDemand执行结果异常
Author: chris-sharlCreated May 27, 2022Updated Jan 2, 2026
异常类型:app运行时异常
手机型号:Mi 10 pro
手机系统版本:android 12
tinker版本:1.9.14.20
gradle版本:4.2.2
是否使用热更新SDK: 否
系统:Mac Os
堆栈/日志: 在 issue#1655 中提到过,因为android11对于反射的限制,在部分手机上获取 TRANSACTION_performDexOptSecondary异常,处理完该问题后继续执行,在小米手机上还会出现一些其他问题,在测试的华为和oppo手机上是正常的。
- Mi 10 pro (Android 12) 在执行performDexOptSecondaryByTransactionCode时抛异常,具体日志如下
2022-05-27 15:59:52.240 26740-26775/cn.xxx I/Tinker.ParallelDex: Creating fake odex path structure.
2022-05-27 15:59:52.406 26740-26775/cn.xxx I/Tinker.ParallelDex: [+] Hit target device, do dexopt logic now.
2022-05-27 15:59:52.459 26740-26775/cn.xxx I/Tinker.ParallelDex: [+] Execute shell cmd, args: [compile, -f, --secondary-dex, -m, verify, cn.xxx]
2022-05-27 15:59:52.462 26740-26775/cn.xxx I/Tinker.ParallelDex: [+] Execute shell cmd done.
2022-05-27 15:59:53.464 26740-26775/cn.xxx I/Tinker.ParallelDex: [+] Execute shell cmd, args: [bg-dexopt-job, cn.xxx]
2022-05-27 15:59:53.467 26740-26775/cn.xxx I/Tinker.ParallelDex: [+] Execute shell cmd done.
2022-05-27 15:59:54.476 26740-26775/cn.xxx I/Tinker.ParallelDex: [+] performDexOptSecondaryByTransactionCode, code: 106
2022-05-27 15:59:54.489 26740-26775/cn.xxx E/Tinker.ParallelDex: [-] Error. java.lang.IllegalStateException: java.lang.IllegalArgumentException: reason -1 invalid
at com.tencent.tinker.loader.TinkerDexOptimizer.performDexOptSecondaryByTransactionCode(TinkerDexOptimizer.java:372)
at com.tencent.tinker.loader.TinkerDexOptimizer.triggerPMDexOptOnDemand(TinkerDexOptimizer.java:274)
at com.tencent.tinker.loader.TinkerDexOptimizer.access$200(TinkerDexOptimizer.java:67)
at com.tencent.tinker.loader.TinkerDexOptimizer$OptimizeWorker.run(TinkerDexOptimizer.java:166)
at com.tencent.tinker.loader.TinkerDexOptimizer.optimizeAll(TinkerDexOptimizer.java:108)
at com.tencent.tinker.loader.TinkerDexOptimizer.optimizeAll(TinkerDexOptimizer.java:83)
at com.tencent.tinker.lib.patch.DexDiffPatchInternal.dexOptimizeDexFiles(DexDiffPatchInternal.java:380)
at com.tencent.tinker.lib.patch.DexDiffPatchInternal.patchDexExtractViaDexDiff(DexDiffPatchInternal.java:196)
at com.tencent.tinker.lib.patch.DexDiffPatchInternal.tryRecoverDexFiles(DexDiffPatchInternal.java:87)
at com.tencent.tinker.lib.patch.UpgradePatch.tryPatch(UpgradePatch.java:157)
at com.tencent.tinker.lib.service.TinkerPatchService.doApplyPatch(TinkerPatchService.java:223)
at com.tencent.tinker.lib.service.TinkerPatchService.onHandleIntent(TinkerPatchService.java:101)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:78)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:210)
at android.os.Looper.loop(Looper.java:299)
at android.os.HandlerThread.run(HandlerThread.java:67)
Caused by: java.lang.IllegalArgumentException: reason -1 invalid
at android.os.Parcel.createExceptionOrNull(Parcel.java:2429)
at android.os.Parcel.createException(Parcel.java:2409)
at android.os.Parcel.readException(Parcel.java:2392)
at android.os.Parcel.readException(Parcel.java:2334)
at com.tencent.tinker.loader.TinkerDexOptimizer.performDexOptSecondaryByTransactionCode(TinkerDexOptimizer.java:370)
at com.tencent.tinker.loader.TinkerDexOptimizer.triggerPMDexOptOnDemand(TinkerDexOptimizer.java:274)
at com.tencent.tinker.loader.TinkerDexOptimizer.access$200(TinkerDexOptimizer.java:67)
at com.tencent.tinker.loader.TinkerDexOptimizer$OptimizeWorker.run(TinkerDexOptimizer.java:166)
at com.tencent.tinker.loader.TinkerDexOptimizer.optimizeAll(TinkerDexOptimizer.java:108)
at com.tencent.tinker.loader.TinkerDexOptimizer.optimizeAll(TinkerDexOptimizer.java:83)
at com.tencent.tinker.lib.patch.DexDiffPatchInternal.dexOptimizeDexFiles(DexDiffPatchInternal.java:380)
at com.tencent.tinker.lib.patch.DexDiffPatchInternal.patchDexExtractViaDexDiff(DexDiffPatchInternal.java:196)
at com.tencent.tinker.lib.patch.DexDiffPatchInternal.tryRecoverDexFiles(DexDiffPatchInternal.java:87)
at com.tencent.tinker.lib.patch.UpgradePatch.tryPatch(UpgradePatch.java:157)
at com.tencent.tinker.lib.service.TinkerPatchService.doApplyPatch(TinkerPatchService.java:223)
at com.tencent.tinker.lib.service.TinkerPatchService.onHandleIntent(TinkerPatchService.java:101)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:78)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:210)
at android.os.Looper.loop(Looper.java:299)
at android.os.HandlerThread.run(HandlerThread.java:67)
Caused by: android.os.RemoteException: Remote stack trace:
at com.android.server.pm.PackageManagerServiceCompilerMapping.getReasonName(PackageManagerServiceCompilerMapping.java:153)
at com.android.server.pm.PackageDexOptimizer.dexOptSecondaryDexPathLI(PackageDexOptimizer.java:553)
at com.android.server.pm.PackageDexOptimizer.dexOptSecondaryDexPath(PackageDexOptimizer.java:458)
at com.android.server.pm.dex.DexManager.dexoptSecondaryDex(DexManager.java:548)
at com.android.server.pm.PackageManagerService.performDexOpt(PackageManagerService.java:13046)我去翻看了android的相关源码,未发现什么异常,感觉是MIUI的rom搞了什么飞机。
- Mi 10(Android 11) 在执行triggerPMDexOptOnDemand时前面都正常,在最后判断文件是否存在时抛了异常。具体日志如下:
2022-05-27 16:26:26.664 30561-30596/cn.xxx I/Tinker.ParallelDex: Creating fake odex path structure.
2022-05-27 16:26:26.835 30561-30596/cn.xxx I/Tinker.ParallelDex: [+] Hit target device, do dexopt logic now.
2022-05-27 16:26:26.836 30561-30596/cn.xxx I/Tinker.ParallelDex: [+] Execute shell cmd, args: [compile, -f, --secondary-dex, -m, speed-profile, cn.xxx]
2022-05-27 16:26:26.837 30561-30596/cn.xxx I/Tinker.ParallelDex: [+] Execute shell cmd done.
2022-05-27 16:26:27.838 30561-30596/cn.xxx I/Tinker.ParallelDex: [+] Execute shell cmd, args: [bg-dexopt-job, cn.xxx]
2022-05-27 16:26:27.840 30561-30596/cn.xxx I/Tinker.ParallelDex: [+] Execute shell cmd done.
2022-05-27 16:26:28.842 30561-30596/cn.xxx I/Tinker.ParallelDex: [+] performDexOptSecondaryByTransactionCode, code: 106
2022-05-27 16:26:28.844 30561-30596/cn.xxx W/Tinker.ParallelDex: [!] System API return true.
2022-05-27 16:26:32.848 30561-30596/cn.xxx I/Tinker.ParallelDex: [+] Execute shell cmd, args: [compile, -f, --secondary-dex, -m, speed-profile, cn.xxx]
2022-05-27 16:26:32.852 30561-30596/cn.xxx I/Tinker.ParallelDex: [+] Execute shell cmd done.
2022-05-27 16:26:33.857 30561-30596/cn.xxx I/Tinker.ParallelDex: [+] Execute shell cmd, args: [bg-dexopt-job, cn.xxx]
2022-05-27 16:26:33.862 30561-30596/cn.xxx I/Tinker.ParallelDex: [+] Execute shell cmd done.
2022-05-27 16:26:34.866 30561-30596/cn.xxx I/Tinker.ParallelDex: [+] performDexOptSecondaryByTransactionCode, code: 106
2022-05-27 16:26:34.869 30561-30596/cn.xxx W/Tinker.ParallelDex: [!] System API return true.
2022-05-27 16:26:38.873 30561-30596/cn.xxx I/Tinker.ParallelDex: [+] Execute shell cmd, args: [compile, -f, --secondary-dex, -m, speed-profile, cn.xxx]
2022-05-27 16:26:38.878 30561-30596/cn.xxx I/Tinker.ParallelDex: [+] Execute shell cmd done.
2022-05-27 16:26:39.882 30561-30596/cn.xxx I/Tinker.ParallelDex: [+] Execute shell cmd, args: [bg-dexopt-job, cn.xxx]
2022-05-27 16:26:39.887 30561-30596/cn.xxx I/Tinker.ParallelDex: [+] Execute shell cmd done.
2022-05-27 16:26:40.891 30561-30596/cn.xxx I/Tinker.ParallelDex: [+] performDexOptSecondaryByTransactionCode, code: 106
2022-05-27 16:26:40.894 30561-30596/cn.xxx W/Tinker.ParallelDex: [!] System API return true.
2022-05-27 16:26:44.900 30561-30596/cn.xxx I/Tinker.ParallelDex: [+] Execute shell cmd, args: [compile, -f, --secondary-dex, -m, speed-profile, cn.xxx]
2022-05-27 16:26:44.905 30561-30596/cn.xxx I/Tinker.ParallelDex: [+] Execute shell cmd done.
2022-05-27 16:26:45.909 30561-30596/cn.xxx I/Tinker.ParallelDex: [+] Execute shell cmd, args: [bg-dexopt-job, cn.xxx]
2022-05-27 16:26:45.914 30561-30596/cn.xxx I/Tinker.ParallelDex: [+] Execute shell cmd done.
2022-05-27 16:26:46.918 30561-30596/cn.xxx I/Tinker.ParallelDex: [+] performDexOptSecondaryByTransactionCode, code: 106
2022-05-27 16:26:46.920 30561-30596/cn.xxx W/Tinker.ParallelDex: [!] System API return true.
2022-05-27 16:26:50.925 30561-30596/cn.xxx I/Tinker.ParallelDex: [+] Execute shell cmd, args: [compile, -f, --secondary-dex, -m, speed-profile, cn.xxx]
2022-05-27 16:26:50.929 30561-30596/cn.xxx I/Tinker.ParallelDex: [+] Execute shell cmd done.
2022-05-27 16:26:51.933 30561-30596/cn.xxx I/Tinker.ParallelDex: [+] Execute shell cmd, args: [bg-dexopt-job, cn.xxx]
2022-05-27 16:26:51.938 30561-30596/cn.xxx I/Tinker.ParallelDex: [+] Execute shell cmd done.
2022-05-27 16:26:52.942 30561-30596/cn.xxx I/Tinker.ParallelDex: [+] performDexOptSecondaryByTransactionCode, code: 106
2022-05-27 16:26:52.945 30561-30596/cn.xxx W/Tinker.ParallelDex: [!] System API return true.
2022-05-27 16:26:56.952 30561-30596/cn.xxx E/Tinker.ParallelDex: Fail to call triggerPMDexOptAsyncOnDemand. java.lang.IllegalStateException: No odex file was generated after calling performDexOptSecondary
at com.tencent.tinker.loader.TinkerDexOptimizer.triggerPMDexOptOnDemand(TinkerDexOptimizer.java:295)
at com.tencent.tinker.loader.TinkerDexOptimizer.access$200(TinkerDexOptimizer.java:67)
at com.tencent.tinker.loader.TinkerDexOptimizer$OptimizeWorker.run(TinkerDexOptimizer.java:166)
at com.tencent.tinker.loader.TinkerDexOptimizer.optimizeAll(TinkerDexOptimizer.java:108)
at com.tencent.tinker.loader.TinkerDexOptimizer.optimizeAll(TinkerDexOptimizer.java:83)
at com.tencent.tinker.lib.patch.DexDiffPatchInternal.dexOptimizeDexFiles(DexDiffPatchInternal.java:380)
at com.tencent.tinker.lib.patch.DexDiffPatchInternal.patchDexExtractViaDexDiff(DexDiffPatchInternal.java:196)
at com.tencent.tinker.lib.patch.DexDiffPatchInternal.tryRecoverDexFiles(DexDiffPatchInternal.java:87)
at com.tencent.tinker.lib.patch.UpgradePatch.tryPatch(UpgradePatch.java:157)
at com.tencent.tinker.lib.service.TinkerPatchService.doApplyPatch(TinkerPatchService.java:223)
at com.tencent.tinker.lib.service.TinkerPatchService.onHandleIntent(TinkerPatchService.java:101)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:77)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:236)
at android.os.HandlerThread.run(HandlerThread.java:67)- 其他测试了几部android 10+的手机均正常(包括华为,oppo等品牌)
Source: Tencent/tinker