From 3197966e9768cfdcaf68ed04f8d1bb28808ef80f Mon Sep 17 00:00:00 2001 From: Nathan Walker Date: Thu, 9 Apr 2026 08:48:31 -0700 Subject: [PATCH] fix: ensure dex cache directory exists before proxy generation Harden dex directory setup in RuntimeHelper with existence check and fallback to files/secondary-dexes when code_cache is unavailable. Add defensive parent directory creation in ProxyGenerator.saveProxy() to prevent ENOENT crashes on newer Android versions. --- .../app/src/main/java/com/tns/RuntimeHelper.java | 12 ++++++++++++ .../main/java/com/tns/bindings/ProxyGenerator.java | 4 ++++ 2 files changed, 16 insertions(+) diff --git a/test-app/app/src/main/java/com/tns/RuntimeHelper.java b/test-app/app/src/main/java/com/tns/RuntimeHelper.java index 90a64f16e..fa1542966 100644 --- a/test-app/app/src/main/java/com/tns/RuntimeHelper.java +++ b/test-app/app/src/main/java/com/tns/RuntimeHelper.java @@ -123,6 +123,18 @@ public static Runtime initRuntime(Context context) { ClassLoader classLoader = context.getClassLoader(); File dexDir = new File(rootDir, "code_cache/secondary-dexes"); + if (!dexDir.exists()) { + dexDir.mkdirs(); + } + if (!dexDir.exists() || !dexDir.canWrite()) { + if (logger.isEnabled()) { + logger.write("Unable to use dex dir: " + dexDir.getAbsolutePath() + ", falling back to files/secondary-dexes"); + } + dexDir = new File(appDir, "secondary-dexes"); + if (!dexDir.exists()) { + dexDir.mkdirs(); + } + } String dexThumb = null; try { dexThumb = Util.getDexThumb(context); diff --git a/test-app/runtime-binding-generator/src/main/java/com/tns/bindings/ProxyGenerator.java b/test-app/runtime-binding-generator/src/main/java/com/tns/bindings/ProxyGenerator.java index 546b42593..52506fbd5 100644 --- a/test-app/runtime-binding-generator/src/main/java/com/tns/bindings/ProxyGenerator.java +++ b/test-app/runtime-binding-generator/src/main/java/com/tns/bindings/ProxyGenerator.java @@ -58,6 +58,10 @@ public String generateProxy(String proxyName, ClassDescriptor classToProxy, Hash private String saveProxy(String proxyName, byte[] proxyBytes) throws IOException { File file = new File(path + File.separator + proxyName + ".dex"); + File parentDir = file.getParentFile(); + if (parentDir != null && !parentDir.exists()) { + parentDir.mkdirs(); + } file.createNewFile(); FileOutputStream stream = new FileOutputStream(file); stream.write(proxyBytes);