From 13607fc8b6be547db038f6ca97bdeddb143ba023 Mon Sep 17 00:00:00 2001 From: nitram84 <58364572+nitram84@users.noreply.github.com> Date: Thu, 15 Feb 2024 18:56:39 +0100 Subject: [PATCH] fix(res): add missing namespace declarations (PR #2102) * fix(res): add missing namespace declarations * remove `writer.getIndent() == 0` --------- Co-authored-by: skylot <118523+skylot@users.noreply.github.com> --- .../jadx/core/xmlgen/BinaryXMLParser.java | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/jadx-core/src/main/java/jadx/core/xmlgen/BinaryXMLParser.java b/jadx-core/src/main/java/jadx/core/xmlgen/BinaryXMLParser.java index c0df3b627..bafdb5d19 100644 --- a/jadx-core/src/main/java/jadx/core/xmlgen/BinaryXMLParser.java +++ b/jadx-core/src/main/java/jadx/core/xmlgen/BinaryXMLParser.java @@ -40,6 +40,7 @@ public class BinaryXMLParser extends CommonBinaryParser { private final Map resNames; private Map nsMap; private Set nsMapGenerated; + private Set definedNamespaces; private final Map tagAttrDeobfNames = new HashMap<>(); private ICodeWriter writer; @@ -78,11 +79,13 @@ public class BinaryXMLParser extends CommonBinaryParser { } nsMapGenerated = new HashSet<>(); nsMap = new HashMap<>(); + definedNamespaces = new HashSet<>(); writer = rootNode.makeCodeWriter(); writer.add(""); firstElement = true; decode(); nsMap = null; + definedNamespaces = null; ICodeInfo codeInfo = writer.finish(); this.classNameCache = null; // reset class name cache return codeInfo; @@ -269,15 +272,18 @@ public class BinaryXMLParser extends CommonBinaryParser { int idIndex = is.readInt16(); int classIndex = is.readInt16(); int styleIndex = is.readInt16(); - if ("manifest".equals(currentTag) || writer.getIndent() == 0) { + if ("manifest".equals(currentTag) || definedNamespaces.size() != nsMap.size()) { for (Map.Entry entry : nsMap.entrySet()) { - String nsValue = getValidTagAttributeName(entry.getValue()); - writer.add(" xmlns"); - if (nsValue != null && !nsValue.trim().isEmpty()) { - writer.add(':'); - writer.add(nsValue); + if (!definedNamespaces.contains(entry.getKey())) { + definedNamespaces.add(entry.getKey()); + String nsValue = getValidTagAttributeName(entry.getValue()); + writer.add(" xmlns"); + if (nsValue != null && !nsValue.trim().isEmpty()) { + writer.add(':'); + writer.add(nsValue); + } + writer.add("=\"").add(StringUtils.escapeXML(entry.getKey())).add('"'); } - writer.add("=\"").add(StringUtils.escapeXML(entry.getKey())).add('"'); } } boolean attrNewLine = attributeCount != 1 && this.attrNewLine;