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 69b1e3f7..695a69a5 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 @@ -141,6 +141,9 @@ public class Main { if (cli.hasOption("p") || cli.hasOption("frame-path")) { decoder.setFrameworkDir(cli.getOptionValue("p")); } + if (cli.hasOption("m") || cli.hasOption("match-original")) { + decoder.setAnalysisMode(true, false); + } if (cli.hasOption("o") || cli.hasOption("output")) { decoder.setOutDir(new File(cli.getOptionValue("o"))); } else { @@ -281,6 +284,10 @@ public class Main { .withDescription("Decode in debug mode. Check project page for more info.") .create("d"); + Option analysisOption = OptionBuilder.withLongOpt("-match-original") + .withDescription("Keeps files to closest to original as possible. Prevents rebuild.") + .create("m"); + Option debugLinePrefix = OptionBuilder.withLongOpt("debug-line-prefix") .withDescription("Smali line prefix when decoding in debug mode. Default is \"a=0;// \".") .hasArg(true) @@ -368,6 +375,7 @@ public class Main { DecodeOptions.addOption(debugDecOption); DecodeOptions.addOption(noDbgOption); DecodeOptions.addOption(keepResOption); + DecodeOptions.addOption(analysisOption); BuildOptions.addOption(debugBuiOption); BuildOptions.addOption(aaptOption); @@ -408,6 +416,7 @@ public class Main { for (Object op : frameOptions.getOptions()) { allOptions.addOption((Option)op); } + allOptions.addOption(analysisOption); allOptions.addOption(debugLinePrefix); allOptions.addOption(debugDecOption); allOptions.addOption(noDbgOption); 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 a5e4ec0a..f4b04d7a 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 @@ -65,6 +65,7 @@ public class ApkDecoder { public void decode() throws AndrolibException, IOException { File outDir = getOutDir(); + setAnalysisMode(mAnalysisMode, true); if (!mForceDelete && outDir.exists()) { throw new OutDirExistsException(); @@ -157,6 +158,18 @@ public class ApkDecoder { mDebug = debug; } + public void setAnalysisMode(boolean mode, boolean pass) throws AndrolibException{ + mAnalysisMode = mode; + + // only set mResTable, once it exists + if (pass) { + if (mResTable == null) { + mResTable = getResTable(); + } + mResTable.setAnalysisMode(mode); + } + } + public void setDebugLinePrefix(String debugLinePrefix) { mDebugLinePrefix = debugLinePrefix; } @@ -339,4 +352,5 @@ public class ApkDecoder { private String mFrameworkDir = null; private boolean mBakDeb = true; private boolean mCompressResources = false; + private boolean mAnalysisMode = false; } 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 33e111f5..aa245d1a 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 @@ -37,10 +37,7 @@ import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerConfigurationException; -import javax.xml.transform.TransformerException; -import javax.xml.transform.TransformerFactory; +import javax.xml.transform.*; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; @@ -179,6 +176,8 @@ final public class AndrolibResources { TransformerFactory transformerFactory = TransformerFactory .newInstance(); Transformer transformer = transformerFactory.newTransformer(); + transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + transformer.setOutputProperty(OutputKeys.STANDALONE,"yes"); DOMSource source = new DOMSource(doc); StreamResult result = new StreamResult(new File(filePath)); transformer.transform(source, result); @@ -221,7 +220,9 @@ final public class AndrolibResources { TransformerFactory transformerFactory = TransformerFactory .newInstance(); Transformer transformer = transformerFactory.newTransformer(); - DOMSource source = new DOMSource(doc); + transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + transformer.setOutputProperty(OutputKeys.STANDALONE,"yes"); + DOMSource source = new DOMSource(doc); StreamResult result = new StreamResult(new File(filePath)); transformer.transform(source, result); @@ -261,6 +262,8 @@ final public class AndrolibResources { // save manifest TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); + transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + transformer.setOutputProperty(OutputKeys.STANDALONE,"yes"); DOMSource source = new DOMSource(doc); StreamResult result = new StreamResult(new File(filePath)); transformer.transform(source, result); @@ -295,8 +298,10 @@ final public class AndrolibResources { + File.separator + "AndroidManifest.xml"); // Remove versionName / versionCode (aapt API 16) - remove_manifest_versions(outDir.getAbsolutePath() - + File.separator + "/AndroidManifest.xml"); + if (resTable.getAnalysisMode() == false) { + remove_manifest_versions(outDir.getAbsolutePath() + + File.separator + "/AndroidManifest.xml"); + } if (inApk.containsDir("res")) { in = inApk.getDir("res"); diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/ResTable.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/ResTable.java index 305beb06..f55c3937 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/ResTable.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/ResTable.java @@ -34,6 +34,7 @@ public class ResTable { private final Set mFramePackages = new LinkedHashSet(); private String mFrameTag; + private boolean mAnalysisMode = false; private Map mSdkInfo = new LinkedHashMap(); private Map mPackageInfo = new LinkedHashMap(); @@ -121,6 +122,10 @@ public class ResTable { public void setFrameTag(String tag) { mFrameTag = tag; } + + public void setAnalysisMode(boolean mode) { + mAnalysisMode = mode; + } public void clearSdkInfo() { mSdkInfo.clear(); @@ -154,6 +159,10 @@ public class ResTable { return mSdkInfo; } + public boolean getAnalysisMode() { + return mAnalysisMode; + } + public Map getUnknownFiles() { return mUnknownFiles; } diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/XmlPullStreamDecoder.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/XmlPullStreamDecoder.java index 1b014600..c71ab702 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/XmlPullStreamDecoder.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/XmlPullStreamDecoder.java @@ -132,7 +132,11 @@ public class XmlPullStreamDecoder implements ResStreamDecoder { } } } - return true; + if (resTable.getAnalysisMode() == true) { + return false; + } else { + return true; + } } };