#1656·tinker

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等品牌)