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 d974a789..bb8a3c3a 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 @@ -576,34 +576,16 @@ final public class AndrolibResources { public void aaptPackage(File apkFile, File manifest, File resDir, File rawDir, File assetDir, File[] include) throws AndrolibException { - boolean customAapt = false; String aaptPath = apkOptions.aaptPath; + boolean customAapt = !aaptPath.isEmpty(); List cmd = new ArrayList(); - // path for aapt binary - if (! aaptPath.isEmpty()) { - File aaptFile = new File(aaptPath); - if (aaptFile.canRead() && aaptFile.exists()) { - aaptFile.setExecutable(true); - cmd.add(aaptFile.getPath()); - customAapt = true; - - LOGGER.fine(aaptFile.getPath() + " being used as aapt location."); - } else { - LOGGER.warning("aapt location could not be found. Defaulting back to default"); - - try { - cmd.add(getAaptBinaryFile().getAbsolutePath()); - } catch (BrutException ignored) { - cmd.add("aapt"); - } - } - } else { - try { - cmd.add(getAaptBinaryFile().getAbsolutePath()); - } catch (BrutException ignored) { - cmd.add("aapt"); - } + try { + String aaptCommand = AaptManager.getAaptExecutionCommand(aaptPath, getAaptBinaryFile()); + cmd.add(aaptCommand); + } catch (BrutException ex) { + LOGGER.warning("aapt: " + ex.getMessage() + " (defaulting to $PATH binary)"); + cmd.add(AaptManager.getAaptBinaryName(getAaptVersion())); } if (apkOptions.isAapt2()) { @@ -979,7 +961,7 @@ final public class AndrolibResources { private File getAaptBinaryFile() throws AndrolibException { try { - if (apkOptions.useAapt2 || apkOptions.aaptVersion == 2) { + if (getAaptVersion() == 2) { return AaptManager.getAppt2(); } return AaptManager.getAppt1(); @@ -988,6 +970,10 @@ final public class AndrolibResources { } } + private int getAaptVersion() { + return apkOptions.isAapt2() ? 2 : 1; + } + public File getAndroidResourcesFile() throws AndrolibException { try { return Jar.getResourceAsFile("/brut/androlib/android-framework.jar"); diff --git a/brut.j.util/src/main/java/brut/util/AaptManager.java b/brut.j.util/src/main/java/brut/util/AaptManager.java index 1559a2d3..129e6361 100644 --- a/brut.j.util/src/main/java/brut/util/AaptManager.java +++ b/brut.j.util/src/main/java/brut/util/AaptManager.java @@ -33,7 +33,7 @@ public class AaptManager { private static File getAppt(Integer version) throws BrutException { File aaptBinary; - String aaptVersion = "aapt" + (version == 2 ? "2" : ""); + String aaptVersion = getAaptBinaryName(version); if (! OSDetection.is64Bit() && ! OSDetection.isWindows()) { throw new BrutException("32 bit OS detected. No 32 bit binaries available."); @@ -60,10 +60,28 @@ public class AaptManager { throw new BrutException("Can't set aapt binary as executable"); } + public static String getAaptExecutionCommand(String aaptPath, File aapt) throws BrutException { + if (! aaptPath.isEmpty()) { + File aaptFile = new File(aaptPath); + if (aaptFile.canRead() && aaptFile.exists()) { + aaptFile.setExecutable(true); + return aaptFile.getPath(); + } else { + throw new BrutException("binary could not be read: " + aaptFile.getAbsolutePath()); + } + } else { + return aapt.getAbsolutePath(); + } + } + public static int getAaptVersion(String aaptLocation) throws BrutException { return getApptVersion(new File(aaptLocation)); } + public static String getAaptBinaryName(Integer version) { + return "aapt" + (version == 2 ? "2" : ""); + } + public static int getApptVersion(File aapt) throws BrutException { if (!aapt.isFile()) { throw new BrutException("Could not identify aapt binary as executable.");