diff --git a/CHANGES b/CHANGES index 8f3c2d93..83e93146 100644 --- a/CHANGES +++ b/CHANGES @@ -52,6 +52,7 @@ v2.0.0 (TBA) -Fixed (issue #706) - Added support for TYPE_DYNAMIC_REFERENCE. -Fixed (issue #685) - Fixed invalid attrs values with Android Lollipop. -Fixed (issue #713) - Fixed issue with packages that had shared library resources. +-Fixed (issue #329) - Fixed issue with incorrectly identifying similarly named strings as ResFileValues. -Fixed issue with APKs with multiple dex files. -Fixed issue with using Apktool without smali/baksmali for ApktoolProperties (Thanks teprrr) -Fixed issue with non-URI standard characters in apk name (Thanks rover12421) diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/Androlib.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/Androlib.java index 4213da58..126ec9dd 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/Androlib.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/Androlib.java @@ -131,6 +131,11 @@ public class Androlib { mAndRes.decode(resTable, apkFile, outDir); } + public void decodeManifestWithResources(ExtFile apkFile, File outDir, ResTable resTable) + throws AndrolibException { + mAndRes.decodeManifestWithResources(resTable, apkFile, outDir); + } + public void decodeRawFiles(ExtFile apkFile, File outDir) throws AndrolibException { LOGGER.info("Copying assets and libs..."); diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/ApkDecoder.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/ApkDecoder.java index a3f5f722..52e72984 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/ApkDecoder.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/ApkDecoder.java @@ -26,6 +26,7 @@ import brut.common.BrutException; import brut.directory.DirectoryException; import brut.directory.ZipExtFile; import brut.util.OS; +import com.google.common.base.Strings; import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; import java.io.File; @@ -98,6 +99,9 @@ public class ApkDecoder { mAndrolib.decodeResourcesRaw(mApkFile, outDir); break; case DECODE_RESOURCES_FULL: + if (hasManifest()) { + mAndrolib.decodeManifestWithResources(mApkFile, outDir, getResTable()); + } mAndrolib.decodeResourcesFull(mApkFile, outDir, getResTable()); break; } @@ -360,6 +364,10 @@ public class ApkDecoder { HashMap packages = new HashMap(); + if (Strings.isNullOrEmpty(original)) { + return; + } + // only put rename-manifest-package into apktool.yml, if the change will be required if (!renamed.equalsIgnoreCase(original)) { packages.put("rename-manifest-package", renamed); 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 d3c9aefc..beb1ee83 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 @@ -278,8 +278,9 @@ final public class AndrolibResources { transformer.transform(source, result); } - public void decode(ResTable resTable, ExtFile apkFile, File outDir) + public void decodeManifestWithResources(ResTable resTable, ExtFile apkFile, File outDir) throws AndrolibException { + Duo duo = getResFileDecoder(); ResFileDecoder fileDecoder = duo.m1; ResAttrDecoder attrDecoder = duo.m2.getAttrDecoder(); @@ -290,7 +291,6 @@ final public class AndrolibResources { try { inApk = apkFile.getDirectory(); out = new FileDirectory(outDir); - LOGGER.info("Decoding AndroidManifest.xml with resources..."); fileDecoder.decodeManifest(inApk, "AndroidManifest.xml", out, "AndroidManifest.xml"); @@ -306,6 +306,24 @@ final public class AndrolibResources { remove_manifest_versions(outDir.getAbsolutePath() + File.separator + "AndroidManifest.xml"); mPackageId = String.valueOf(resTable.getPackageId()); } + } catch (DirectoryException ex) { + throw new AndrolibException(ex); + } + } + + public void decode(ResTable resTable, ExtFile apkFile, File outDir) + throws AndrolibException { + Duo duo = getResFileDecoder(); + ResFileDecoder fileDecoder = duo.m1; + ResAttrDecoder attrDecoder = duo.m2.getAttrDecoder(); + + attrDecoder.setCurrentPackage(resTable.listMainPackages().iterator().next()); + Directory inApk, in = null, out; + + try { + out = new FileDirectory(outDir); + + inApk = apkFile.getDirectory(); if (inApk.containsDir("res")) { in = inApk.getDir("res"); } diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResValueFactory.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResValueFactory.java index fd877636..d0a4df24 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResValueFactory.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResValueFactory.java @@ -65,7 +65,7 @@ public class ResValueFactory { } public ResValue factory(String value) { - if (value.startsWith("res/")) { + if (value.startsWith("res/") && ! value.equalsIgnoreCase("res/")) { return new ResFileValue(value); } return new ResStringValue(value); diff --git a/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-mcc001/arrays.xml b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-mcc001/arrays.xml index 95375d77..141babbe 100644 --- a/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-mcc001/arrays.xml +++ b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/values-mcc001/arrays.xml @@ -31,4 +31,8 @@ category=temp%temp%foo + + res/ + view/ +