{"record":{"id":"d0c0531d6fc153a2","repo":"Tencent/tinker","slug":"dex2oat-is-interrupted-msg","errorCode":null,"errorMessage":"dex2oat is interrupted, msg: ","messagePattern":"dex2oat is interrupted, msg: ","errorType":"exception","errorClass":"IOException","httpStatus":null,"severity":"error","filePath":"tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerDexOptimizer.java","lineNumber":615,"sourceCode":"            commandAndParams.add(\"--instruction-set=\" + targetISA);\n            if (Build.VERSION.SDK_INT > 25) {\n                commandAndParams.add(\"--compiler-filter=quicken\");\n            } else {\n                commandAndParams.add(\"--compiler-filter=interpret-only\");\n            }\n\n            final ProcessBuilder pb = new ProcessBuilder(commandAndParams);\n            pb.redirectErrorStream(true);\n            final Process dex2oatProcess = pb.start();\n            StreamConsumer.consumeInputStream(dex2oatProcess.getInputStream());\n            StreamConsumer.consumeInputStream(dex2oatProcess.getErrorStream());\n            try {\n                final int ret = dex2oatProcess.waitFor();\n                if (ret != 0) {\n                    throw new IOException(\"dex2oat works unsuccessfully, exit code: \" + ret);\n                }\n            } catch (InterruptedException e) {\n                throw new IOException(\"dex2oat is interrupted, msg: \" + e.getMessage(), e);\n            }\n        } finally {\n            try {\n                if (fileLock != null) {\n                    fileLock.close();\n                }\n            } catch (IOException e) {\n                ShareTinkerLog.w(TAG, \"release interpret Lock error\", e);\n            }\n        }\n    }\n\n    private static class StreamConsumer {\n        static final Executor STREAM_CONSUMER = Executors.newSingleThreadExecutor();\n\n        static void consumeInputStream(final InputStream is) {\n            STREAM_CONSUMER.execute(new Runnable() {\n                @Override","sourceCodeStart":597,"sourceCodeEnd":633,"githubUrl":"https://github.com/Tencent/tinker/blob/1b7ea02c239840f563ea64fb5bd286eb98d4011e/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerDexOptimizer.java#L597-L633","documentation":"While waiting for the forked dex2oat process, the loader thread received an InterruptedException. Tinker converts it to an IOException so the interpret-mode optimization aborts rather than continuing in an undefined state.","triggerScenarios":"Something interrupted the thread running TinkerLoader.loadTinker — e.g. a watchdog/anr task interrupting the main thread, a timeout framework cancelling patch loading, or app code interrupting the thread pool that hosts patch loading.","commonSituations":"Patch loading moved off the main thread into a custom executor that is shut down (shutdownNow interrupts workers); ANR monitors that interrupt long-running main-thread work during slow dexopt.","solutions":["Do not interrupt patch loading; let loadTinker run to completion on the main thread as Tinker intends.","If loading on an executor, never call shutdownNow while a patch load may be in flight.","Catch IOException around patch load and simply retry on next process start — Tinker load is restartable."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n    int ret = dex2oatProcess.waitFor();\n} catch (InterruptedException e) {\n    Thread.currentThread().interrupt(); // restore flag\n    throw new IOException(\"dex2oat is interrupted\", e);\n}","preventionTips":["Run patch loading on the main thread during attachBaseContext; do not host it in interruptible executors.","Never call ExecutorService.shutdownNow() while patch load may be running.","Restore the interrupt flag when catching InterruptedException so callers observe it."],"tags":["android","dex2oat","threading","interruption","tinker"],"backgroundTag":null,"analyzedSha":"1b7ea02c239840f563ea64fb5bd286eb98d4011e","analyzedAt":"2026-08-14T15:16:52.110Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}