Skip to content

Commit 247735c

Browse files
authored
feat: de-dupe attribute names during styles writing (#3404)
1 parent 03fa70b commit 247735c

File tree

2 files changed

+16
-0
lines changed

2 files changed

+16
-0
lines changed

brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResStyleValue.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
import org.xmlpull.v1.XmlSerializer;
2525

2626
import java.io.IOException;
27+
import java.util.HashSet;
28+
import java.util.Set;
2729
import java.util.logging.Logger;
2830

2931
public class ResStyleValue extends ResBagValue implements ResValuesXmlSerializable {
@@ -47,6 +49,8 @@ public void serializeToResValuesXml(XmlSerializer serializer,
4749
} else if (res.getResSpec().getName().indexOf('.') != -1) {
4850
serializer.attribute(null, "parent", "");
4951
}
52+
53+
Set<String> processedNames = new HashSet<>();
5054
for (Duo<ResReferenceValue, ResScalarValue> mItem : mItems) {
5155
ResResSpec spec = mItem.m1.getReferent();
5256

@@ -70,6 +74,11 @@ public void serializeToResValuesXml(XmlSerializer serializer,
7074
name = "@" + spec.getFullName(res.getResSpec().getPackage(), false);
7175
}
7276

77+
// #3400 - Skip duplicate values, commonly seen are duplicate key-pairs on styles.
78+
if (!isAnalysisMode() && processedNames.contains(name)) {
79+
continue;
80+
}
81+
7382
if (value == null) {
7483
value = mItem.m2.encodeAsResXmlValue();
7584
}
@@ -82,8 +91,11 @@ public void serializeToResValuesXml(XmlSerializer serializer,
8291
serializer.attribute(null, "name", name);
8392
serializer.text(value);
8493
serializer.endTag(null, "item");
94+
95+
processedNames.add(name);
8596
}
8697
serializer.endTag(null, "style");
98+
processedNames.clear();
8799
}
88100

89101
private final Duo<ResReferenceValue, ResScalarValue>[] mItems;

brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResValue.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,8 @@ public class ResValue {
2222
public boolean shouldRemoveUnknownRes() {
2323
return Config.getInstance().isDecodeResolveModeRemoving();
2424
}
25+
26+
public boolean isAnalysisMode() {
27+
return Config.getInstance().analysisMode;
28+
}
2529
}

0 commit comments

Comments
 (0)