diff --git a/INTERNAL.md b/INTERNAL.md index 2326f42c..c11729ca 100644 --- a/INTERNAL.md +++ b/INTERNAL.md @@ -194,7 +194,7 @@ is just a guideline but helps me to release a new version every 3 months. ### Social Spam The final step is to send this release into the wild via some social posting. Head to the blog -where the release post was and send that link to Twiter, Google and whatever else you use. +where the release post was and send that link to Twitter, Google and whatever else you use. Relax and watch the bug tracker. @@ -225,8 +225,8 @@ we aren't building the entire AOSP package, the initial build is to just see if We check out a certain tag. Currently we use - * aapt2 - `android-9.0.0_r3`. - * aapt1 - `android-9.0.0_r3`. + * aapt2 - `android-9.0.0_r22`. + * aapt1 - `android-9.0.0_r22`. ### Including our modified `frameworks/base` package. @@ -254,6 +254,7 @@ we lose the ability to quickly build just the aapt binary. So the Windows proced 1. `source build/envsetup.sh` 2. `lunch sdk-eng` 3. `make OUT_DIR=out-x64 LOCAL_MULTILIB=64 USE_NINJA=false aapt` +4. `strip out-x64/host/darwin-x86/bin/aapt_64` As of Android Oreo (API 26) all aapt binaries are 64 bit (With exception of Windows). @@ -274,7 +275,7 @@ we lose the ability to quickly build just the aapt2 binary. So the Windows proce 1. `export ANDROID_JAVA_HOME=/Path/To/Jdk` 2. `source build/envsetup.sh` 3. `make OUT_DIR=out-x64 LOCAL_MULTILIB=64 USE_NINJA=false aapt2` -4. `strip out-x64/host/darwin-x86/bin/aapt2` +4. `strip out-x64/host/darwin-x86/bin/aapt2_64` #### Confirming aapt/aapt2 builds are static diff --git a/brut.apktool/apktool-cli/src/main/java/brut/apktool/Main.java b/brut.apktool/apktool-cli/src/main/java/brut/apktool/Main.java index 69c9c45c..abaee387 100644 --- a/brut.apktool/apktool-cli/src/main/java/brut/apktool/Main.java +++ b/brut.apktool/apktool-cli/src/main/java/brut/apktool/Main.java @@ -218,6 +218,9 @@ public class Main { if (cli.hasOption("p") || cli.hasOption("frame-path")) { apkOptions.frameworkFolderLocation = cli.getOptionValue("p"); } + if (cli.hasOption("nc") || cli.hasOption("no-crunch")) { + apkOptions.noCrunch = true; + } // Temporary flag to enable the use of aapt2. This will tranform in time to a use-aapt1 flag, which will be // legacy and eventually removed. @@ -397,6 +400,11 @@ public class Main { .desc("Copies original AndroidManifest.xml and META-INF. See project page for more info.") .build(); + Option noCrunchOption = Option.builder("nc") + .longOpt("no-crunch") + .desc("Disable crunching of resource files during the build step.") + .build(); + Option tagOption = Option.builder("t") .longOpt("tag") .desc("Tag frameworks using .") @@ -439,6 +447,7 @@ public class Main { BuildOptions.addOption(aaptOption); BuildOptions.addOption(originalOption); BuildOptions.addOption(aapt2Option); + BuildOptions.addOption(noCrunchOption); } // add global options @@ -492,6 +501,7 @@ public class Main { allOptions.addOption(verboseOption); allOptions.addOption(quietOption); allOptions.addOption(aapt2Option); + allOptions.addOption(noCrunchOption); } private static String verbosityHelp() { diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/ApkOptions.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/ApkOptions.java index 0a81ef07..b1ddb4a2 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/ApkOptions.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/ApkOptions.java @@ -28,6 +28,7 @@ public class ApkOptions { public boolean isFramework = false; public boolean resourcesAreCompressed = false; public boolean useAapt2 = false; + public boolean noCrunch = false; public Collection doNotCompress; public String frameworkFolderLocation = null; 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 b8ceeec9..b4c3d44a 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 @@ -350,6 +350,10 @@ final public class AndrolibResources { cmd.add("-v"); } + if (apkOptions.noCrunch) { + cmd.add("--no-crunch"); + } + try { OS.exec(cmd.toArray(new String[0])); LOGGER.fine("aapt2 compile command ran: "); @@ -485,6 +489,9 @@ final public class AndrolibResources { if (apkOptions.debugMode) { // inject debuggable="true" into manifest cmd.add("--debug-mode"); } + if (apkOptions.noCrunch) { + cmd.add("--no-crunch"); + } // force package id so that some frameworks build with correct id // disable if user adds own aapt (can't know if they have this feature) if (mPackageId != null && ! customAapt && ! mSharedLibrary) { diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResScalarValue.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResScalarValue.java index 5deace0e..b396762a 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResScalarValue.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResScalarValue.java @@ -83,6 +83,13 @@ public abstract class ResScalarValue extends ResIntBasedValue implements } } + // Android does not allow values (false) for ids.xml anymore + // https://issuetracker.google.com/issues/80475496 + // But it decodes as a ResBoolean, which makes no sense. So force it to empty + if (type.equalsIgnoreCase("id") && !body.isEmpty()) { + body = ""; + } + // check for using attrib as node or item String tagName = item ? "item" : type; diff --git a/brut.apktool/apktool-lib/src/main/resources/prebuilt/aapt/linux/aapt b/brut.apktool/apktool-lib/src/main/resources/prebuilt/aapt/linux/aapt deleted file mode 100755 index 40d1c24c..00000000 Binary files a/brut.apktool/apktool-lib/src/main/resources/prebuilt/aapt/linux/aapt and /dev/null differ diff --git a/brut.apktool/apktool-lib/src/main/resources/prebuilt/aapt2/linux/aapt2 b/brut.apktool/apktool-lib/src/main/resources/prebuilt/aapt2/linux/aapt2 deleted file mode 100755 index 71ad03a3..00000000 Binary files a/brut.apktool/apktool-lib/src/main/resources/prebuilt/aapt2/linux/aapt2 and /dev/null differ diff --git a/brut.apktool/apktool-lib/src/main/resources/prebuilt/linux/aapt b/brut.apktool/apktool-lib/src/main/resources/prebuilt/linux/aapt new file mode 100755 index 00000000..5abf5387 Binary files /dev/null and b/brut.apktool/apktool-lib/src/main/resources/prebuilt/linux/aapt differ diff --git a/brut.apktool/apktool-lib/src/main/resources/prebuilt/linux/aapt2 b/brut.apktool/apktool-lib/src/main/resources/prebuilt/linux/aapt2 new file mode 100755 index 00000000..1a1af164 Binary files /dev/null and b/brut.apktool/apktool-lib/src/main/resources/prebuilt/linux/aapt2 differ diff --git a/brut.apktool/apktool-lib/src/main/resources/prebuilt/linux/aapt2_64 b/brut.apktool/apktool-lib/src/main/resources/prebuilt/linux/aapt2_64 new file mode 100755 index 00000000..36983446 Binary files /dev/null and b/brut.apktool/apktool-lib/src/main/resources/prebuilt/linux/aapt2_64 differ diff --git a/brut.apktool/apktool-lib/src/main/resources/prebuilt/linux/aapt_64 b/brut.apktool/apktool-lib/src/main/resources/prebuilt/linux/aapt_64 new file mode 100755 index 00000000..6aaf74fe Binary files /dev/null and b/brut.apktool/apktool-lib/src/main/resources/prebuilt/linux/aapt_64 differ diff --git a/brut.apktool/apktool-lib/src/main/resources/prebuilt/aapt2/macosx/aapt2 b/brut.apktool/apktool-lib/src/main/resources/prebuilt/macosx/aapt2_64 similarity index 98% rename from brut.apktool/apktool-lib/src/main/resources/prebuilt/aapt2/macosx/aapt2 rename to brut.apktool/apktool-lib/src/main/resources/prebuilt/macosx/aapt2_64 index 3752ab2f..c408da4b 100755 Binary files a/brut.apktool/apktool-lib/src/main/resources/prebuilt/aapt2/macosx/aapt2 and b/brut.apktool/apktool-lib/src/main/resources/prebuilt/macosx/aapt2_64 differ diff --git a/brut.apktool/apktool-lib/src/main/resources/prebuilt/aapt/macosx/aapt b/brut.apktool/apktool-lib/src/main/resources/prebuilt/macosx/aapt_64 similarity index 51% rename from brut.apktool/apktool-lib/src/main/resources/prebuilt/aapt/macosx/aapt rename to brut.apktool/apktool-lib/src/main/resources/prebuilt/macosx/aapt_64 index 1b94a3dc..86f55c2c 100755 Binary files a/brut.apktool/apktool-lib/src/main/resources/prebuilt/aapt/macosx/aapt and b/brut.apktool/apktool-lib/src/main/resources/prebuilt/macosx/aapt_64 differ diff --git a/brut.apktool/apktool-lib/src/main/resources/prebuilt/aapt/windows/aapt.exe b/brut.apktool/apktool-lib/src/main/resources/prebuilt/windows/aapt.exe similarity index 52% rename from brut.apktool/apktool-lib/src/main/resources/prebuilt/aapt/windows/aapt.exe rename to brut.apktool/apktool-lib/src/main/resources/prebuilt/windows/aapt.exe index a4e79b02..dfb12c10 100755 Binary files a/brut.apktool/apktool-lib/src/main/resources/prebuilt/aapt/windows/aapt.exe and b/brut.apktool/apktool-lib/src/main/resources/prebuilt/windows/aapt.exe differ diff --git a/brut.apktool/apktool-lib/src/main/resources/prebuilt/aapt2/windows/aapt2.exe b/brut.apktool/apktool-lib/src/main/resources/prebuilt/windows/aapt2.exe similarity index 99% rename from brut.apktool/apktool-lib/src/main/resources/prebuilt/aapt2/windows/aapt2.exe rename to brut.apktool/apktool-lib/src/main/resources/prebuilt/windows/aapt2.exe index 5496a556..4769ffff 100755 Binary files a/brut.apktool/apktool-lib/src/main/resources/prebuilt/aapt2/windows/aapt2.exe and b/brut.apktool/apktool-lib/src/main/resources/prebuilt/windows/aapt2.exe differ diff --git a/brut.apktool/apktool-lib/src/main/resources/prebuilt/windows/aapt2_64.exe b/brut.apktool/apktool-lib/src/main/resources/prebuilt/windows/aapt2_64.exe new file mode 100755 index 00000000..f7c07349 Binary files /dev/null and b/brut.apktool/apktool-lib/src/main/resources/prebuilt/windows/aapt2_64.exe differ diff --git a/brut.apktool/apktool-lib/src/main/resources/prebuilt/windows/aapt_64.exe b/brut.apktool/apktool-lib/src/main/resources/prebuilt/windows/aapt_64.exe new file mode 100755 index 00000000..9c12dbc6 Binary files /dev/null and b/brut.apktool/apktool-lib/src/main/resources/prebuilt/windows/aapt_64.exe differ diff --git a/brut.apktool/apktool-lib/src/test/java/brut/androlib/aapt1/BuildAndDecodeTest.java b/brut.apktool/apktool-lib/src/test/java/brut/androlib/aapt1/BuildAndDecodeTest.java index 4a53ec25..e2992018 100644 --- a/brut.apktool/apktool-lib/src/test/java/brut/androlib/aapt1/BuildAndDecodeTest.java +++ b/brut.apktool/apktool-lib/src/test/java/brut/androlib/aapt1/BuildAndDecodeTest.java @@ -198,6 +198,11 @@ public class BuildAndDecodeTest extends BaseTest { compareXmlFiles("res/xml/references.xml"); } + @Test + public void xmlIdsEmptyTest() throws BrutException { + compareXmlFiles("res/values/ids.xml"); + } + @Test public void xmlReferenceAttributeTest() throws BrutException { compareXmlFiles("res/layout/issue1040.xml"); diff --git a/brut.apktool/apktool-lib/src/test/java/brut/androlib/aapt1/DebugTagRetainedTest.java b/brut.apktool/apktool-lib/src/test/java/brut/androlib/aapt1/DebugTagRetainedTest.java index 68f555cb..98e82328 100644 --- a/brut.apktool/apktool-lib/src/test/java/brut/androlib/aapt1/DebugTagRetainedTest.java +++ b/brut.apktool/apktool-lib/src/test/java/brut/androlib/aapt1/DebugTagRetainedTest.java @@ -77,8 +77,8 @@ public class DebugTagRetainedTest extends BaseTest { String expected = TestUtils.replaceNewlines("" + " "); + "android:compileSdkVersionCodename=\"6.0-2438415\" package=\"com.ibotpeaches.issue1235\" platformBuildVersionCode=\"20\" " + + "platformBuildVersionName=\"4.4W.2-1537038\"> "); byte[] encoded = Files.readAllBytes(Paths.get(sTmpDir + File.separator + apk + File.separator + "AndroidManifest.xml")); String obtained = TestUtils.replaceNewlines(new String(encoded)); diff --git a/brut.apktool/apktool-lib/src/test/java/brut/androlib/aapt1/ProviderAttributeTest.java b/brut.apktool/apktool-lib/src/test/java/brut/androlib/aapt1/ProviderAttributeTest.java index 642965f8..742f8c68 100644 --- a/brut.apktool/apktool-lib/src/test/java/brut/androlib/aapt1/ProviderAttributeTest.java +++ b/brut.apktool/apktool-lib/src/test/java/brut/androlib/aapt1/ProviderAttributeTest.java @@ -72,7 +72,7 @@ public class ProviderAttributeTest extends BaseTest { apkDecoder.decode(); String expected = TestUtils.replaceNewlines("\n" + - "\n" + + "\n" + " \n" + " \n" + " \n" + diff --git a/brut.apktool/apktool-lib/src/test/java/brut/androlib/aapt2/BuildAndDecodeTest.java b/brut.apktool/apktool-lib/src/test/java/brut/androlib/aapt2/BuildAndDecodeTest.java index fd1054e5..bd4785de 100644 --- a/brut.apktool/apktool-lib/src/test/java/brut/androlib/aapt2/BuildAndDecodeTest.java +++ b/brut.apktool/apktool-lib/src/test/java/brut/androlib/aapt2/BuildAndDecodeTest.java @@ -84,6 +84,11 @@ public class BuildAndDecodeTest extends BaseTest { compareXmlFiles("res/navigation/nav_graph.xml"); } + @Test + public void xmlIdsEmptyTest() throws BrutException { + compareXmlFiles("res/values/ids.xml"); + } + @Test public void leadingDollarSignResourceNameTest() throws BrutException { compareXmlFiles("res/drawable/$avd_hide_password__0.xml"); diff --git a/brut.apktool/apktool-lib/src/test/java/brut/androlib/decode/ExternalEntityTest.java b/brut.apktool/apktool-lib/src/test/java/brut/androlib/decode/ExternalEntityTest.java index 6cd58b5c..21e14679 100644 --- a/brut.apktool/apktool-lib/src/test/java/brut/androlib/decode/ExternalEntityTest.java +++ b/brut.apktool/apktool-lib/src/test/java/brut/androlib/decode/ExternalEntityTest.java @@ -64,7 +64,7 @@ public class ExternalEntityTest extends BaseTest { String expected = TestUtils.replaceNewlines("" + " "); diff --git a/brut.apktool/apktool-lib/src/test/resources/aapt1/testapp/res/values/ids.xml b/brut.apktool/apktool-lib/src/test/resources/aapt1/testapp/res/values/ids.xml new file mode 100644 index 00000000..de166285 --- /dev/null +++ b/brut.apktool/apktool-lib/src/test/resources/aapt1/testapp/res/values/ids.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/brut.apktool/apktool-lib/src/test/resources/aapt2/testapp/res/values/attrs.xml b/brut.apktool/apktool-lib/src/test/resources/aapt2/testapp/res/values/attrs.xml new file mode 100644 index 00000000..91ded550 --- /dev/null +++ b/brut.apktool/apktool-lib/src/test/resources/aapt2/testapp/res/values/attrs.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/brut.apktool/apktool-lib/src/test/resources/aapt2/testapp/res/values/ids.xml b/brut.apktool/apktool-lib/src/test/resources/aapt2/testapp/res/values/ids.xml new file mode 100644 index 00000000..de166285 --- /dev/null +++ b/brut.apktool/apktool-lib/src/test/resources/aapt2/testapp/res/values/ids.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file 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 a4b782a0..1d3f2efd 100644 --- a/brut.j.util/src/main/java/brut/util/AaptManager.java +++ b/brut.j.util/src/main/java/brut/util/AaptManager.java @@ -35,17 +35,20 @@ public class AaptManager { File aaptBinary; String aaptVersion = getAaptBinaryName(version); - if (! OSDetection.is64Bit() && ! OSDetection.isWindows()) { + if (! OSDetection.is64Bit() && OSDetection.isMacOSX()) { throw new BrutException("32 bit OS detected. No 32 bit binaries available."); } + // Set the 64 bit flag + aaptVersion += OSDetection.is64Bit() ? "_64" : ""; + try { if (OSDetection.isMacOSX()) { - aaptBinary = Jar.getResourceAsFile("/prebuilt/" + aaptVersion + "/macosx/" + aaptVersion, AaptManager.class); + aaptBinary = Jar.getResourceAsFile("/prebuilt/macosx/" + aaptVersion, AaptManager.class); } else if (OSDetection.isUnix()) { - aaptBinary = Jar.getResourceAsFile("/prebuilt/" + aaptVersion + "/linux/" + aaptVersion, AaptManager.class); + aaptBinary = Jar.getResourceAsFile("/prebuilt/linux/" + aaptVersion, AaptManager.class); } else if (OSDetection.isWindows()) { - aaptBinary = Jar.getResourceAsFile("/prebuilt/" + aaptVersion + "/windows/" + aaptVersion + ".exe", AaptManager.class); + aaptBinary = Jar.getResourceAsFile("/prebuilt/windows/" + aaptVersion + ".exe", AaptManager.class); } else { throw new BrutException("Could not identify platform: " + OSDetection.returnOS()); }