From 28883538a784bbf8ded859403efa22c38429667b Mon Sep 17 00:00:00 2001 From: Bing Qiao Date: Thu, 29 Jun 2017 12:36:05 +0100 Subject: [PATCH] Class.class.getResourceAsStream tries to load resource from root directory. This fails when apktool is built into a fat jar like Spring boot executable so that the classloader tries to load the resource from the root directory of the Spring boot jar instead of that of the bundled appktool jar. --- .../brut/androlib/res/AndrolibResources.java | 10 +++---- brut.j.util/src/main/java/brut/util/Jar.java | 26 ++++++++++++++----- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/AndrolibResources.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/AndrolibResources.java index 2b1ad0c7..698690f3 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/AndrolibResources.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/AndrolibResources.java @@ -783,18 +783,18 @@ final public class AndrolibResources { try { if (OSDetection.isMacOSX()) { if (OSDetection.is64Bit()) { - aaptBinary = Jar.getResourceAsFile("/prebuilt/aapt/macosx/64/aapt"); + aaptBinary = Jar.getResourceAsFile("/prebuilt/aapt/macosx/64/aapt", AndrolibResources.class); } else { - aaptBinary = Jar.getResourceAsFile("/prebuilt/aapt/macosx/32/aapt"); + aaptBinary = Jar.getResourceAsFile("/prebuilt/aapt/macosx/32/aapt", AndrolibResources.class); } } else if (OSDetection.isUnix()) { if (OSDetection.is64Bit()) { - aaptBinary = Jar.getResourceAsFile("/prebuilt/aapt/linux/64/aapt"); + aaptBinary = Jar.getResourceAsFile("/prebuilt/aapt/linux/64/aapt", AndrolibResources.class); } else { - aaptBinary = Jar.getResourceAsFile("/prebuilt/aapt/linux/32/aapt"); + aaptBinary = Jar.getResourceAsFile("/prebuilt/aapt/linux/32/aapt", AndrolibResources.class); } } else if (OSDetection.isWindows()) { - aaptBinary = Jar.getResourceAsFile("/prebuilt/aapt/windows/aapt.exe"); + aaptBinary = Jar.getResourceAsFile("/prebuilt/aapt/windows/aapt.exe", AndrolibResources.class); } else { LOGGER.warning("Unknown Operating System: " + OSDetection.returnOS()); return null; diff --git a/brut.j.util/src/main/java/brut/util/Jar.java b/brut.j.util/src/main/java/brut/util/Jar.java index 4c945688..a3068088 100644 --- a/brut.j.util/src/main/java/brut/util/Jar.java +++ b/brut.j.util/src/main/java/brut/util/Jar.java @@ -31,16 +31,20 @@ abstract public class Jar { private final static Set mLoaded = new HashSet(); private final static Map mExtracted = new HashMap(); - - public static File getResourceAsFile(String name) throws BrutException { + + public static File getResourceAsFile(String name, Class clazz) throws BrutException { File file = mExtracted.get(name); if (file == null) { - file = extractToTmp(name); + file = extractToTmp(name, clazz); mExtracted.put(name, file); } return file; } + public static File getResourceAsFile(String name) throws BrutException { + return getResourceAsFile(name, Class.class); + } + public static void load(String libPath) { if (mLoaded.contains(libPath)) { return; @@ -56,14 +60,18 @@ abstract public class Jar { System.load(libFile.getAbsolutePath()); } - public static File extractToTmp(String resourcePath) throws BrutException { - return extractToTmp(resourcePath, "brut_util_Jar_"); + public static File extractToTmp(String resourcePath, Class clazz) throws BrutException { + return extractToTmp(resourcePath, "brut_util_Jar_", clazz); + } + + public static File extractToTmp(String resourcePath) throws BrutException { + return extractToTmp(resourcePath, Class.class); } - public static File extractToTmp(String resourcePath, String tmpPrefix) + public static File extractToTmp(String resourcePath, String tmpPrefix, Class clazz) throws BrutException { try { - InputStream in = Class.class.getResourceAsStream(resourcePath); + InputStream in = clazz.getResourceAsStream(resourcePath); if (in == null) { throw new FileNotFoundException(resourcePath); } @@ -79,4 +87,8 @@ abstract public class Jar { "Could not extract resource: " + resourcePath, ex); } } + + public static File extractToTmp(String resourcePath, String tmpPrefix) throws BrutException { + return extractToTmp(resourcePath, tmpPrefix, Class.class); + } }