Skip to content

Commit

Permalink
fix: don't replace resources names with field names (#465)
Browse files Browse the repository at this point in the history
  • Loading branch information
skylot committed Mar 12, 2019
1 parent 4353890 commit 7243ab5
Showing 1 changed file with 10 additions and 33 deletions.
43 changes: 10 additions & 33 deletions jadx-core/src/main/java/jadx/core/xmlgen/BinaryXMLParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@
import jadx.api.ResourcesLoader;
import jadx.core.codegen.CodeWriter;
import jadx.core.dex.info.ConstStorage;
import jadx.core.dex.instructions.args.ArgType;
import jadx.core.dex.nodes.FieldNode;
import jadx.core.dex.nodes.RootNode;
import jadx.core.utils.StringUtils;
import jadx.core.utils.exceptions.JadxRuntimeException;
Expand All @@ -40,7 +38,6 @@ public class BinaryXMLParser extends CommonBinaryParser {
private static final boolean ATTR_NEW_LINE = false;

private final Map<Integer, String> styleMap = new HashMap<>();
private final Map<Integer, FieldNode> localStyleMap = new HashMap<>();
private final Map<Integer, String> resNames;
private final Map<String, String> nsMap = new HashMap<>();
private Set<String> nsMapGenerated;
Expand All @@ -63,16 +60,7 @@ public BinaryXMLParser(RootNode rootNode) {
this.rootNode = rootNode;
try {
readAndroidRStyleClass();
// add application constants
ConstStorage constStorage = rootNode.getConstValues();
Map<Object, FieldNode> constFields = constStorage.getGlobalConstFields();
for (Map.Entry<Object, FieldNode> entry : constFields.entrySet()) {
Object key = entry.getKey();
FieldNode field = entry.getValue();
if (field.getType().equals(ArgType.INT) && key instanceof Integer) {
localStyleMap.put((Integer) key, field);
}
}
resNames = constStorage.getResourcesNames();
} catch (Exception e) {
throw new JadxRuntimeException("BinaryXMLParser init error", e);
Expand Down Expand Up @@ -381,38 +369,27 @@ private String getString(int strId) {

private void decodeAttribute(int attributeNS, int attrValDataType, int attrValData,
String shortNsName, String attrName) {

if (attrValDataType == TYPE_REFERENCE) {
// reference custom processing
String name = styleMap.get(attrValData);
if (name != null) {
writer.add("@style/").add(name.replaceAll("_", "."));
} else {
FieldNode field = localStyleMap.get(attrValData);
if (field != null) {
String cls = field.getParentClass().getShortName().toLowerCase();
String resName = resNames.get(attrValData);
if (resName != null) {
writer.add("@");
if ("id".equals(cls)) {
writer.add('+');
if (resName.startsWith("id/")) {
writer.add("+");
}
writer.add(cls).add("/").add(field.getName());
writer.add(resName);
} else {
String resName = resNames.get(attrValData);
resName = ValuesParser.getAndroidResMap().get(attrValData);
if (resName != null) {
writer.add("@");
if (resName.startsWith("id/")) {
writer.add("+");
}
writer.add(resName);
writer.add("@android:").add(resName);
} else if (attrValData == 0) {
writer.add("@null");
} else {
resName = ValuesParser.getAndroidResMap().get(attrValData);
if (resName != null) {
writer.add("@android:").add(resName);
} else if (attrValData == 0) {
writer.add("@null");
} else {
writer.add("0x").add(Integer.toHexString(attrValData));
}
writer.add("0x").add(Integer.toHexString(attrValData));
}
}
}
Expand Down

0 comments on commit 7243ab5

Please sign in to comment.