mirror of
https://github.com/revanced/Apktool.git
synced 2025-05-03 15:24:26 +02:00
fixes issue 469, added -m / --match-original
fixes xml output not having newline after xml declaration
This commit is contained in:
parent
9f03d7d35c
commit
832978a549
@ -141,6 +141,9 @@ public class Main {
|
|||||||
if (cli.hasOption("p") || cli.hasOption("frame-path")) {
|
if (cli.hasOption("p") || cli.hasOption("frame-path")) {
|
||||||
decoder.setFrameworkDir(cli.getOptionValue("p"));
|
decoder.setFrameworkDir(cli.getOptionValue("p"));
|
||||||
}
|
}
|
||||||
|
if (cli.hasOption("m") || cli.hasOption("match-original")) {
|
||||||
|
decoder.setAnalysisMode(true, false);
|
||||||
|
}
|
||||||
if (cli.hasOption("o") || cli.hasOption("output")) {
|
if (cli.hasOption("o") || cli.hasOption("output")) {
|
||||||
decoder.setOutDir(new File(cli.getOptionValue("o")));
|
decoder.setOutDir(new File(cli.getOptionValue("o")));
|
||||||
} else {
|
} else {
|
||||||
@ -281,6 +284,10 @@ public class Main {
|
|||||||
.withDescription("Decode in debug mode. Check project page for more info.")
|
.withDescription("Decode in debug mode. Check project page for more info.")
|
||||||
.create("d");
|
.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")
|
Option debugLinePrefix = OptionBuilder.withLongOpt("debug-line-prefix")
|
||||||
.withDescription("Smali line prefix when decoding in debug mode. Default is \"a=0;// \".")
|
.withDescription("Smali line prefix when decoding in debug mode. Default is \"a=0;// \".")
|
||||||
.hasArg(true)
|
.hasArg(true)
|
||||||
@ -368,6 +375,7 @@ public class Main {
|
|||||||
DecodeOptions.addOption(debugDecOption);
|
DecodeOptions.addOption(debugDecOption);
|
||||||
DecodeOptions.addOption(noDbgOption);
|
DecodeOptions.addOption(noDbgOption);
|
||||||
DecodeOptions.addOption(keepResOption);
|
DecodeOptions.addOption(keepResOption);
|
||||||
|
DecodeOptions.addOption(analysisOption);
|
||||||
|
|
||||||
BuildOptions.addOption(debugBuiOption);
|
BuildOptions.addOption(debugBuiOption);
|
||||||
BuildOptions.addOption(aaptOption);
|
BuildOptions.addOption(aaptOption);
|
||||||
@ -408,6 +416,7 @@ public class Main {
|
|||||||
for (Object op : frameOptions.getOptions()) {
|
for (Object op : frameOptions.getOptions()) {
|
||||||
allOptions.addOption((Option)op);
|
allOptions.addOption((Option)op);
|
||||||
}
|
}
|
||||||
|
allOptions.addOption(analysisOption);
|
||||||
allOptions.addOption(debugLinePrefix);
|
allOptions.addOption(debugLinePrefix);
|
||||||
allOptions.addOption(debugDecOption);
|
allOptions.addOption(debugDecOption);
|
||||||
allOptions.addOption(noDbgOption);
|
allOptions.addOption(noDbgOption);
|
||||||
|
@ -65,6 +65,7 @@ public class ApkDecoder {
|
|||||||
|
|
||||||
public void decode() throws AndrolibException, IOException {
|
public void decode() throws AndrolibException, IOException {
|
||||||
File outDir = getOutDir();
|
File outDir = getOutDir();
|
||||||
|
setAnalysisMode(mAnalysisMode, true);
|
||||||
|
|
||||||
if (!mForceDelete && outDir.exists()) {
|
if (!mForceDelete && outDir.exists()) {
|
||||||
throw new OutDirExistsException();
|
throw new OutDirExistsException();
|
||||||
@ -157,6 +158,18 @@ public class ApkDecoder {
|
|||||||
mDebug = debug;
|
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) {
|
public void setDebugLinePrefix(String debugLinePrefix) {
|
||||||
mDebugLinePrefix = debugLinePrefix;
|
mDebugLinePrefix = debugLinePrefix;
|
||||||
}
|
}
|
||||||
@ -339,4 +352,5 @@ public class ApkDecoder {
|
|||||||
private String mFrameworkDir = null;
|
private String mFrameworkDir = null;
|
||||||
private boolean mBakDeb = true;
|
private boolean mBakDeb = true;
|
||||||
private boolean mCompressResources = false;
|
private boolean mCompressResources = false;
|
||||||
|
private boolean mAnalysisMode = false;
|
||||||
}
|
}
|
||||||
|
@ -37,10 +37,7 @@ import java.io.IOException;
|
|||||||
import javax.xml.parsers.DocumentBuilder;
|
import javax.xml.parsers.DocumentBuilder;
|
||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
import javax.xml.parsers.ParserConfigurationException;
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
import javax.xml.transform.Transformer;
|
import javax.xml.transform.*;
|
||||||
import javax.xml.transform.TransformerConfigurationException;
|
|
||||||
import javax.xml.transform.TransformerException;
|
|
||||||
import javax.xml.transform.TransformerFactory;
|
|
||||||
import javax.xml.transform.dom.DOMSource;
|
import javax.xml.transform.dom.DOMSource;
|
||||||
import javax.xml.transform.stream.StreamResult;
|
import javax.xml.transform.stream.StreamResult;
|
||||||
|
|
||||||
@ -179,6 +176,8 @@ final public class AndrolibResources {
|
|||||||
TransformerFactory transformerFactory = TransformerFactory
|
TransformerFactory transformerFactory = TransformerFactory
|
||||||
.newInstance();
|
.newInstance();
|
||||||
Transformer transformer = transformerFactory.newTransformer();
|
Transformer transformer = transformerFactory.newTransformer();
|
||||||
|
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
|
||||||
|
transformer.setOutputProperty(OutputKeys.STANDALONE,"yes");
|
||||||
DOMSource source = new DOMSource(doc);
|
DOMSource source = new DOMSource(doc);
|
||||||
StreamResult result = new StreamResult(new File(filePath));
|
StreamResult result = new StreamResult(new File(filePath));
|
||||||
transformer.transform(source, result);
|
transformer.transform(source, result);
|
||||||
@ -221,7 +220,9 @@ final public class AndrolibResources {
|
|||||||
TransformerFactory transformerFactory = TransformerFactory
|
TransformerFactory transformerFactory = TransformerFactory
|
||||||
.newInstance();
|
.newInstance();
|
||||||
Transformer transformer = transformerFactory.newTransformer();
|
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));
|
StreamResult result = new StreamResult(new File(filePath));
|
||||||
transformer.transform(source, result);
|
transformer.transform(source, result);
|
||||||
|
|
||||||
@ -261,6 +262,8 @@ final public class AndrolibResources {
|
|||||||
// save manifest
|
// save manifest
|
||||||
TransformerFactory transformerFactory = TransformerFactory.newInstance();
|
TransformerFactory transformerFactory = TransformerFactory.newInstance();
|
||||||
Transformer transformer = transformerFactory.newTransformer();
|
Transformer transformer = transformerFactory.newTransformer();
|
||||||
|
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
|
||||||
|
transformer.setOutputProperty(OutputKeys.STANDALONE,"yes");
|
||||||
DOMSource source = new DOMSource(doc);
|
DOMSource source = new DOMSource(doc);
|
||||||
StreamResult result = new StreamResult(new File(filePath));
|
StreamResult result = new StreamResult(new File(filePath));
|
||||||
transformer.transform(source, result);
|
transformer.transform(source, result);
|
||||||
@ -295,8 +298,10 @@ final public class AndrolibResources {
|
|||||||
+ File.separator + "AndroidManifest.xml");
|
+ File.separator + "AndroidManifest.xml");
|
||||||
|
|
||||||
// Remove versionName / versionCode (aapt API 16)
|
// Remove versionName / versionCode (aapt API 16)
|
||||||
remove_manifest_versions(outDir.getAbsolutePath()
|
if (resTable.getAnalysisMode() == false) {
|
||||||
+ File.separator + "/AndroidManifest.xml");
|
remove_manifest_versions(outDir.getAbsolutePath()
|
||||||
|
+ File.separator + "/AndroidManifest.xml");
|
||||||
|
}
|
||||||
|
|
||||||
if (inApk.containsDir("res")) {
|
if (inApk.containsDir("res")) {
|
||||||
in = inApk.getDir("res");
|
in = inApk.getDir("res");
|
||||||
|
@ -34,6 +34,7 @@ public class ResTable {
|
|||||||
private final Set<ResPackage> mFramePackages = new LinkedHashSet<ResPackage>();
|
private final Set<ResPackage> mFramePackages = new LinkedHashSet<ResPackage>();
|
||||||
|
|
||||||
private String mFrameTag;
|
private String mFrameTag;
|
||||||
|
private boolean mAnalysisMode = false;
|
||||||
|
|
||||||
private Map<String, String> mSdkInfo = new LinkedHashMap<String, String>();
|
private Map<String, String> mSdkInfo = new LinkedHashMap<String, String>();
|
||||||
private Map<String, String> mPackageInfo = new LinkedHashMap<String, String>();
|
private Map<String, String> mPackageInfo = new LinkedHashMap<String, String>();
|
||||||
@ -121,6 +122,10 @@ public class ResTable {
|
|||||||
public void setFrameTag(String tag) {
|
public void setFrameTag(String tag) {
|
||||||
mFrameTag = tag;
|
mFrameTag = tag;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setAnalysisMode(boolean mode) {
|
||||||
|
mAnalysisMode = mode;
|
||||||
|
}
|
||||||
|
|
||||||
public void clearSdkInfo() {
|
public void clearSdkInfo() {
|
||||||
mSdkInfo.clear();
|
mSdkInfo.clear();
|
||||||
@ -154,6 +159,10 @@ public class ResTable {
|
|||||||
return mSdkInfo;
|
return mSdkInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean getAnalysisMode() {
|
||||||
|
return mAnalysisMode;
|
||||||
|
}
|
||||||
|
|
||||||
public Map<String, String> getUnknownFiles() {
|
public Map<String, String> getUnknownFiles() {
|
||||||
return mUnknownFiles;
|
return mUnknownFiles;
|
||||||
}
|
}
|
||||||
|
@ -132,7 +132,11 @@ public class XmlPullStreamDecoder implements ResStreamDecoder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
if (resTable.getAnalysisMode() == true) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user