diff --git a/jadx-core/src/main/java/jadx/core/xmlgen/ManifestAttributes.java b/jadx-core/src/main/java/jadx/core/xmlgen/ManifestAttributes.java index d317c9a39..d052bf57f 100644 --- a/jadx-core/src/main/java/jadx/core/xmlgen/ManifestAttributes.java +++ b/jadx-core/src/main/java/jadx/core/xmlgen/ManifestAttributes.java @@ -1,9 +1,13 @@ package jadx.core.xmlgen; import java.io.InputStream; +import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import javax.xml.parsers.DocumentBuilder; @@ -171,19 +175,20 @@ public class ManifestAttributes { if (attr.getType() == MAttrType.ENUM) { return attr.getValues().get(value); } else if (attr.getType() == MAttrType.FLAG) { - StringBuilder sb = new StringBuilder(); - for (Map.Entry entry : attr.getValues().entrySet()) { - long key = entry.getKey(); + List flagList = new LinkedList<>(); + List attrKeys = new ArrayList<>(attr.getValues().keySet()); + attrKeys.sort((a, b) -> Long.compare(b, a)); // sort descending + for (Long key : attrKeys) { + String attrValue = attr.getValues().get(key); if (value == key) { - sb = new StringBuilder(entry.getValue() + '|'); + flagList.add(attrValue); break; } else if ((key != 0) && ((value & key) == key)) { - sb.append(entry.getValue()).append('|'); + flagList.add(attrValue); + value ^= key; } } - if (sb.length() != 0) { - return sb.deleteCharAt(sb.length() - 1).toString(); - } + return flagList.stream().collect(Collectors.joining("|")); } return null; }