24
24
import org .xmlpull .v1 .XmlSerializer ;
25
25
26
26
import java .io .IOException ;
27
+ import java .util .HashSet ;
28
+ import java .util .Set ;
27
29
import java .util .logging .Logger ;
28
30
29
31
public class ResStyleValue extends ResBagValue implements ResValuesXmlSerializable {
@@ -47,6 +49,8 @@ public void serializeToResValuesXml(XmlSerializer serializer,
47
49
} else if (res .getResSpec ().getName ().indexOf ('.' ) != -1 ) {
48
50
serializer .attribute (null , "parent" , "" );
49
51
}
52
+
53
+ Set <String > processedNames = new HashSet <>();
50
54
for (Duo <ResReferenceValue , ResScalarValue > mItem : mItems ) {
51
55
ResResSpec spec = mItem .m1 .getReferent ();
52
56
@@ -70,6 +74,11 @@ public void serializeToResValuesXml(XmlSerializer serializer,
70
74
name = "@" + spec .getFullName (res .getResSpec ().getPackage (), false );
71
75
}
72
76
77
+ // #3400 - Skip duplicate values, commonly seen are duplicate key-pairs on styles.
78
+ if (!isAnalysisMode () && processedNames .contains (name )) {
79
+ continue ;
80
+ }
81
+
73
82
if (value == null ) {
74
83
value = mItem .m2 .encodeAsResXmlValue ();
75
84
}
@@ -82,8 +91,11 @@ public void serializeToResValuesXml(XmlSerializer serializer,
82
91
serializer .attribute (null , "name" , name );
83
92
serializer .text (value );
84
93
serializer .endTag (null , "item" );
94
+
95
+ processedNames .add (name );
85
96
}
86
97
serializer .endTag (null , "style" );
98
+ processedNames .clear ();
87
99
}
88
100
89
101
private final Duo <ResReferenceValue , ResScalarValue >[] mItems ;
0 commit comments