mirror of
https://github.com/revanced/Apktool.git
synced 2025-01-07 10:35:52 +01:00
Added general handling of invalid config flags.
This commit is contained in:
parent
2064de6a19
commit
31e987fa12
@ -43,6 +43,8 @@ public class ResConfigFlags {
|
|||||||
public final byte screenLayout;
|
public final byte screenLayout;
|
||||||
public final byte uiMode;
|
public final byte uiMode;
|
||||||
|
|
||||||
|
public final boolean isInvalid;
|
||||||
|
|
||||||
private final String mQualifiers;
|
private final String mQualifiers;
|
||||||
|
|
||||||
public ResConfigFlags() {
|
public ResConfigFlags() {
|
||||||
@ -61,6 +63,7 @@ public class ResConfigFlags {
|
|||||||
sdkVersion = 0;
|
sdkVersion = 0;
|
||||||
screenLayout = SCREENLONG_ANY | SCREENSIZE_ANY;
|
screenLayout = SCREENLONG_ANY | SCREENSIZE_ANY;
|
||||||
uiMode = UI_MODE_TYPE_ANY | UI_MODE_NIGHT_ANY;
|
uiMode = UI_MODE_TYPE_ANY | UI_MODE_NIGHT_ANY;
|
||||||
|
isInvalid = false;
|
||||||
mQualifiers = "";
|
mQualifiers = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -68,7 +71,7 @@ public class ResConfigFlags {
|
|||||||
byte orientation, byte touchscreen, short density, byte keyboard,
|
byte orientation, byte touchscreen, short density, byte keyboard,
|
||||||
byte navigation, byte inputFlags, short screenWidth,
|
byte navigation, byte inputFlags, short screenWidth,
|
||||||
short screenHeight, short sdkVersion, byte screenLayout,
|
short screenHeight, short sdkVersion, byte screenLayout,
|
||||||
byte uiMode) {
|
byte uiMode, boolean isInvalid) {
|
||||||
this.mcc = mcc;
|
this.mcc = mcc;
|
||||||
this.mnc = mnc;
|
this.mnc = mnc;
|
||||||
this.language = language;
|
this.language = language;
|
||||||
@ -84,6 +87,7 @@ public class ResConfigFlags {
|
|||||||
this.sdkVersion = sdkVersion;
|
this.sdkVersion = sdkVersion;
|
||||||
this.screenLayout = screenLayout;
|
this.screenLayout = screenLayout;
|
||||||
this.uiMode = uiMode;
|
this.uiMode = uiMode;
|
||||||
|
this.isInvalid = isInvalid;
|
||||||
mQualifiers = generateQualifiers();
|
mQualifiers = generateQualifiers();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -234,6 +238,9 @@ public class ResConfigFlags {
|
|||||||
if (sdkVersion > getNaturalSdkVersionRequirement()) {
|
if (sdkVersion > getNaturalSdkVersionRequirement()) {
|
||||||
ret.append("-v").append(sdkVersion);
|
ret.append("-v").append(sdkVersion);
|
||||||
}
|
}
|
||||||
|
if (isInvalid) {
|
||||||
|
ret.append("-[ERR]");
|
||||||
|
}
|
||||||
|
|
||||||
return ret.toString();
|
return ret.toString();
|
||||||
}
|
}
|
||||||
|
@ -143,7 +143,11 @@ public class ARSCDecoder {
|
|||||||
int[] entryOffsets = mIn.readIntArray(entryCount);
|
int[] entryOffsets = mIn.readIntArray(entryCount);
|
||||||
|
|
||||||
ResConfig config;
|
ResConfig config;
|
||||||
if (mPkg.hasConfig(flags)) {
|
if (flags.isInvalid) {
|
||||||
|
config = null;
|
||||||
|
LOGGER.warning(
|
||||||
|
"Invalid config flags detected. Dropping resources: " + mType.getName() + flags.getQualifiers());
|
||||||
|
} else if (mPkg.hasConfig(flags)) {
|
||||||
config = mPkg.getConfig(flags);
|
config = mPkg.getConfig(flags);
|
||||||
} else {
|
} else {
|
||||||
config = new ResConfig(flags);
|
config = new ResConfig(flags);
|
||||||
@ -167,6 +171,13 @@ public class ARSCDecoder {
|
|||||||
short flags = mIn.readShort();
|
short flags = mIn.readShort();
|
||||||
int specNamesId = mIn.readInt();
|
int specNamesId = mIn.readInt();
|
||||||
|
|
||||||
|
ResValue value = (flags & ENTRY_FLAG_COMPLEX) == 0 ?
|
||||||
|
readValue() : readComplexEntry();
|
||||||
|
|
||||||
|
if (mConfig == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
ResID resId = new ResID(mResId);
|
ResID resId = new ResID(mResId);
|
||||||
ResResSpec spec;
|
ResResSpec spec;
|
||||||
if (mPkg.hasResSpec(resId)) {
|
if (mPkg.hasResSpec(resId)) {
|
||||||
@ -177,9 +188,6 @@ public class ARSCDecoder {
|
|||||||
mPkg.addResSpec(spec);
|
mPkg.addResSpec(spec);
|
||||||
mType.addResSpec(spec);
|
mType.addResSpec(spec);
|
||||||
}
|
}
|
||||||
|
|
||||||
ResValue value = (flags & ENTRY_FLAG_COMPLEX) == 0 ?
|
|
||||||
readValue() : readComplexEntry();
|
|
||||||
ResResource res = new ResResource(mConfig, spec, value);
|
ResResource res = new ResResource(mConfig, spec, value);
|
||||||
|
|
||||||
mConfig.addResource(res);
|
mConfig.addResource(res);
|
||||||
@ -219,6 +227,8 @@ public class ARSCDecoder {
|
|||||||
throw new AndrolibException("Config size < 28");
|
throw new AndrolibException("Config size < 28");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean isInvalid = false;
|
||||||
|
|
||||||
short mcc = mIn.readShort();
|
short mcc = mIn.readShort();
|
||||||
short mnc = mIn.readShort();
|
short mnc = mIn.readShort();
|
||||||
|
|
||||||
@ -262,7 +272,8 @@ public class ARSCDecoder {
|
|||||||
|
|
||||||
return new ResConfigFlags(mcc, mnc, language, country, orientation,
|
return new ResConfigFlags(mcc, mnc, language, country, orientation,
|
||||||
touchscreen, density, keyboard, navigation, inputFlags,
|
touchscreen, density, keyboard, navigation, inputFlags,
|
||||||
screenWidth, screenHeight, sdkVersion, screenLayout, uiMode);
|
screenWidth, screenHeight, sdkVersion, screenLayout, uiMode,
|
||||||
|
isInvalid);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addMissingResSpecs() throws AndrolibException {
|
private void addMissingResSpecs() throws AndrolibException {
|
||||||
|
Loading…
Reference in New Issue
Block a user