mirror of
https://github.com/revanced/Apktool.git
synced 2025-01-07 10:35:52 +01:00
ResFlagsAttr: use smallest possible number of flags to describe decoded value.
This commit is contained in:
parent
6ce6d76484
commit
ec1abd3f9b
@ -21,6 +21,8 @@ import brut.androlib.AndrolibException;
|
|||||||
import brut.androlib.res.data.ResResource;
|
import brut.androlib.res.data.ResResource;
|
||||||
import brut.util.Duo;
|
import brut.util.Duo;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Comparator;
|
||||||
import org.xmlpull.v1.XmlSerializer;
|
import org.xmlpull.v1.XmlSerializer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -42,19 +44,30 @@ public class ResFlagsAttr extends ResAttr {
|
|||||||
if (! (value instanceof ResIntValue)) {
|
if (! (value instanceof ResIntValue)) {
|
||||||
return super.convertToResXmlFormat(value);
|
return super.convertToResXmlFormat(value);
|
||||||
}
|
}
|
||||||
|
loadFlags();
|
||||||
int intVal = ((ResIntValue) value).getValue();
|
int intVal = ((ResIntValue) value).getValue();
|
||||||
String strVal = "";
|
|
||||||
for (int i = 0; i < mItems.length; i++) {
|
|
||||||
FlagItem item = mItems[i];
|
|
||||||
|
|
||||||
if ((intVal & item.flag) == item.flag) {
|
if (intVal == 0) {
|
||||||
strVal += "|" + item.getValue();
|
return renderFlags(mZeroFlags);
|
||||||
|
}
|
||||||
|
|
||||||
|
FlagItem[] flagItems = new FlagItem[mFlags.length];
|
||||||
|
int[] flags = new int[mFlags.length];
|
||||||
|
int flagsCount = 0;
|
||||||
|
for (int i = 0; i < mFlags.length; i++) {
|
||||||
|
FlagItem flagItem = mFlags[i];
|
||||||
|
int flag = flagItem.flag;
|
||||||
|
|
||||||
|
if ((intVal & flag) != flag) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! isSubpartOf(flag, flags)) {
|
||||||
|
flags[flagsCount] = flag;
|
||||||
|
flagItems[flagsCount++] = flagItem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (strVal.isEmpty()) {
|
return renderFlags(Arrays.copyOf(flagItems, flagsCount));
|
||||||
return strVal;
|
|
||||||
}
|
|
||||||
return strVal.substring(1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -71,9 +84,62 @@ public class ResFlagsAttr extends ResAttr {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isSubpartOf(int flag, int[] flags) {
|
||||||
|
for (int i = 0; i < flags.length; i++) {
|
||||||
|
if ((flags[i] & flag) == flag) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String renderFlags(FlagItem[] flags) throws AndrolibException {
|
||||||
|
String ret = "";
|
||||||
|
for (int i = 0; i < flags.length; i++) {
|
||||||
|
ret += "|" + flags[i].getValue();
|
||||||
|
}
|
||||||
|
if (ret.isEmpty()) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
return ret.substring(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadFlags() {
|
||||||
|
if (mFlags != null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
FlagItem[] zeroFlags = new FlagItem[mItems.length];
|
||||||
|
int zeroFlagsCount = 0;
|
||||||
|
FlagItem[] flags = new FlagItem[mItems.length];
|
||||||
|
int flagsCount = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < mItems.length; i++) {
|
||||||
|
FlagItem item = mItems[i];
|
||||||
|
if (item.flag == 0) {
|
||||||
|
zeroFlags[zeroFlagsCount++] = item;
|
||||||
|
} else {
|
||||||
|
flags[flagsCount++] = item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mZeroFlags = Arrays.copyOf(zeroFlags, zeroFlagsCount);
|
||||||
|
mFlags = Arrays.copyOf(flags, flagsCount);
|
||||||
|
|
||||||
|
Arrays.sort(mFlags, new Comparator<FlagItem>() {
|
||||||
|
public int compare(FlagItem o1, FlagItem o2) {
|
||||||
|
return Integer.valueOf(Integer.bitCount(o2.flag))
|
||||||
|
.compareTo(Integer.bitCount(o1.flag));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private final FlagItem[] mItems;
|
private final FlagItem[] mItems;
|
||||||
|
|
||||||
|
private FlagItem[] mZeroFlags;
|
||||||
|
private FlagItem[] mFlags;
|
||||||
|
|
||||||
|
|
||||||
private static class FlagItem {
|
private static class FlagItem {
|
||||||
public final ResReferenceValue ref;
|
public final ResReferenceValue ref;
|
||||||
|
Loading…
Reference in New Issue
Block a user