mirror of
https://github.com/revanced/Apktool.git
synced 2025-05-08 17:54:25 +02:00
Explicit ResFileDecoder initiazation and add constructors AXmlResourceParser(ResTable resTable) and AndroidManifestResourceParser(ResTable resTable) (#3211)
This commit is contained in:
parent
490b6f8aee
commit
c2ddeac3ab
@ -136,12 +136,9 @@ public class ResourcesDecoder {
|
|||||||
private void decodeManifest(ResTable resTable, ExtFile apkFile, File outDir)
|
private void decodeManifest(ResTable resTable, ExtFile apkFile, File outDir)
|
||||||
throws AndrolibException {
|
throws AndrolibException {
|
||||||
|
|
||||||
AXmlResourceParser axmlParser = new AndroidManifestResourceParser();
|
AXmlResourceParser axmlParser = new AndroidManifestResourceParser(resTable);
|
||||||
ResAttrDecoder attrDecoder = new ResAttrDecoder();
|
|
||||||
attrDecoder.setResTable(resTable);
|
|
||||||
axmlParser.setAttrDecoder(attrDecoder);
|
|
||||||
|
|
||||||
XmlPullStreamDecoder fileDecoder = new XmlPullStreamDecoder(axmlParser, getResXmlSerializer());
|
XmlPullStreamDecoder fileDecoder = new XmlPullStreamDecoder(axmlParser, getResXmlSerializer());
|
||||||
|
|
||||||
Directory inApk, out;
|
Directory inApk, out;
|
||||||
try {
|
try {
|
||||||
inApk = apkFile.getDirectory();
|
inApk = apkFile.getDirectory();
|
||||||
@ -216,10 +213,15 @@ public class ResourcesDecoder {
|
|||||||
|
|
||||||
private void decodeResources(ResTable resTable, ExtFile apkFile, File outDir)
|
private void decodeResources(ResTable resTable, ExtFile apkFile, File outDir)
|
||||||
throws AndrolibException {
|
throws AndrolibException {
|
||||||
Duo<ResFileDecoder, AXmlResourceParser> duo = getResFileDecoder();
|
|
||||||
ResFileDecoder fileDecoder = duo.m1;
|
ResStreamDecoderContainer decoders = new ResStreamDecoderContainer();
|
||||||
ResAttrDecoder attrDecoder = duo.m2.getAttrDecoder();
|
decoders.setDecoder("raw", new ResRawStreamDecoder());
|
||||||
attrDecoder.setResTable(resTable);
|
decoders.setDecoder("9patch", new Res9patchStreamDecoder());
|
||||||
|
|
||||||
|
AXmlResourceParser axmlParser = new AXmlResourceParser(resTable);
|
||||||
|
decoders.setDecoder("xml", new XmlPullStreamDecoder(axmlParser, getResXmlSerializer()));
|
||||||
|
|
||||||
|
ResFileDecoder fileDecoder = new ResFileDecoder(decoders);
|
||||||
Directory in, out;
|
Directory in, out;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -245,24 +247,12 @@ public class ResourcesDecoder {
|
|||||||
generatePublicXml(pkg, out, xmlSerializer);
|
generatePublicXml(pkg, out, xmlSerializer);
|
||||||
}
|
}
|
||||||
|
|
||||||
AndrolibException decodeError = duo.m2.getFirstError();
|
AndrolibException decodeError = axmlParser.getFirstError();
|
||||||
if (decodeError != null) {
|
if (decodeError != null) {
|
||||||
throw decodeError;
|
throw decodeError;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Duo<ResFileDecoder, AXmlResourceParser> getResFileDecoder() {
|
|
||||||
ResStreamDecoderContainer decoders = new ResStreamDecoderContainer();
|
|
||||||
decoders.setDecoder("raw", new ResRawStreamDecoder());
|
|
||||||
decoders.setDecoder("9patch", new Res9patchStreamDecoder());
|
|
||||||
|
|
||||||
AXmlResourceParser axmlParser = new AXmlResourceParser();
|
|
||||||
axmlParser.setAttrDecoder(new ResAttrDecoder());
|
|
||||||
decoders.setDecoder("xml", new XmlPullStreamDecoder(axmlParser, getResXmlSerializer()));
|
|
||||||
|
|
||||||
return new Duo<>(new ResFileDecoder(decoders), axmlParser);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void generateValuesFile(ResValuesFile valuesFile, Directory out,
|
private void generateValuesFile(ResValuesFile valuesFile, Directory out,
|
||||||
ExtXmlSerializer serial) throws AndrolibException {
|
ExtXmlSerializer serial) throws AndrolibException {
|
||||||
try {
|
try {
|
||||||
|
@ -20,6 +20,7 @@ import android.content.res.XmlResourceParser;
|
|||||||
import android.util.TypedValue;
|
import android.util.TypedValue;
|
||||||
import brut.androlib.exceptions.AndrolibException;
|
import brut.androlib.exceptions.AndrolibException;
|
||||||
import brut.androlib.res.data.ResID;
|
import brut.androlib.res.data.ResID;
|
||||||
|
import brut.androlib.res.data.ResTable;
|
||||||
import brut.androlib.res.data.arsc.ARSCHeader;
|
import brut.androlib.res.data.arsc.ARSCHeader;
|
||||||
import brut.androlib.res.data.axml.NamespaceStack;
|
import brut.androlib.res.data.axml.NamespaceStack;
|
||||||
import brut.androlib.res.xml.ResXmlEncoders;
|
import brut.androlib.res.xml.ResXmlEncoders;
|
||||||
@ -44,8 +45,9 @@ import java.util.logging.Logger;
|
|||||||
*/
|
*/
|
||||||
public class AXmlResourceParser implements XmlResourceParser {
|
public class AXmlResourceParser implements XmlResourceParser {
|
||||||
|
|
||||||
public AXmlResourceParser() {
|
public AXmlResourceParser(ResTable resTable) {
|
||||||
resetEventInfo();
|
resetEventInfo();
|
||||||
|
setAttrDecoder(new ResAttrDecoder(resTable));
|
||||||
}
|
}
|
||||||
|
|
||||||
public AndrolibException getFirstError() {
|
public AndrolibException getFirstError() {
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
package brut.androlib.res.decoder;
|
package brut.androlib.res.decoder;
|
||||||
|
|
||||||
import android.util.TypedValue;
|
import android.util.TypedValue;
|
||||||
|
import brut.androlib.res.data.ResTable;
|
||||||
|
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
@ -25,6 +26,10 @@ import java.util.regex.Pattern;
|
|||||||
*/
|
*/
|
||||||
public class AndroidManifestResourceParser extends AXmlResourceParser {
|
public class AndroidManifestResourceParser extends AXmlResourceParser {
|
||||||
|
|
||||||
|
public AndroidManifestResourceParser(ResTable resTable) {
|
||||||
|
super(resTable);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pattern for matching numeric string meta-data values. aapt automatically infers the
|
* Pattern for matching numeric string meta-data values. aapt automatically infers the
|
||||||
* type for a manifest meta-data value based on the string in the unencoded XML. However,
|
* type for a manifest meta-data value based on the string in the unencoded XML. However,
|
||||||
|
@ -26,6 +26,11 @@ import brut.androlib.res.data.value.ResAttr;
|
|||||||
import brut.androlib.res.data.value.ResScalarValue;
|
import brut.androlib.res.data.value.ResScalarValue;
|
||||||
|
|
||||||
public class ResAttrDecoder {
|
public class ResAttrDecoder {
|
||||||
|
|
||||||
|
public ResAttrDecoder(ResTable resTable) {
|
||||||
|
mResTable = resTable;
|
||||||
|
}
|
||||||
|
|
||||||
public String decode(int type, int value, String rawValue, int attrResId)
|
public String decode(int type, int value, String rawValue, int attrResId)
|
||||||
throws AndrolibException {
|
throws AndrolibException {
|
||||||
ResScalarValue resValue = mResTable.getCurrentResPackage().getValueFactory().factory(type, value, rawValue);
|
ResScalarValue resValue = mResTable.getCurrentResPackage().getValueFactory().factory(type, value, rawValue);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user