fix: add arsc file name prefix only in jadx-gui (#2373)

This commit is contained in:
Skylot
2025-05-31 20:00:33 +01:00
parent 3374f9b64a
commit cf96fdec59
5 changed files with 10 additions and 15 deletions
@@ -102,7 +102,7 @@ public class ResTableBinaryParser extends CommonBinaryParser implements IResTabl
ResXmlGen resGen = new ResXmlGen(resStorage, vp, root.initManifestAttributes());
ICodeInfo content = XmlGenUtils.makeXmlDump(root.makeCodeWriter(), resStorage);
List<ResContainer> xmlFiles = resGen.makeResourcesXml(root.getArgs(), baseFileName);
List<ResContainer> xmlFiles = resGen.makeResourcesXml(root.getArgs());
return ResContainer.resourceTable(baseFileName, xmlFiles, content);
}
@@ -52,10 +52,6 @@ public class ResXmlGen {
}
public List<ResContainer> makeResourcesXml(JadxArgs args) {
return makeResourcesXml(args, "");
}
public List<ResContainer> makeResourcesXml(JadxArgs args, String baseFileName) {
Map<String, ICodeWriter> contMap = new HashMap<>();
for (ResourceEntry ri : resStorage.getResources()) {
if (SKIP_RES_TYPES.contains(ri.getTypeName())) {
@@ -72,7 +68,7 @@ public class ResXmlGen {
}
addValue(cw, ri);
}
String filePrefix = baseFileName.isEmpty() ? null : baseFileName + ':';
List<ResContainer> files = new ArrayList<>(contMap.size());
for (Map.Entry<String, ICodeWriter> entry : contMap.entrySet()) {
String fileName = entry.getKey();
@@ -80,9 +76,6 @@ public class ResXmlGen {
content.decIndent();
content.startLine("</resources>");
ICodeInfo codeInfo = content.finish();
if (filePrefix != null) {
fileName = filePrefix + fileName;
}
files.add(ResContainer.textResource(fileName, codeInfo));
}
Collections.sort(files);
@@ -75,7 +75,7 @@ public class JadxDecompilerTest {
.findFirst().orElseThrow();
ResContainer resContainer = arsc.loadContent();
ResContainer xmlRes = resContainer.getSubFiles().stream()
.filter(r -> r.getName().equals("resources.arsc:res/values/colors.xml"))
.filter(r -> r.getName().equals("res/values/colors.xml"))
.findFirst().orElseThrow();
assertThat(xmlRes.getText())
.code()
@@ -21,15 +21,17 @@ public class ResTableHelper {
* @return root nodes
*/
public static List<JResource> buildTree(ResContainer resTable) {
ResTableHelper resTableHelper = new ResTableHelper();
ResTableHelper resTableHelper = new ResTableHelper(resTable.getFileName());
resTableHelper.process(resTable);
return resTableHelper.roots;
}
private final List<JResource> roots = new ArrayList<>();
private final Map<String, JResource> dirs = new HashMap<>();
private final String resNamePrefix;
private ResTableHelper() {
private ResTableHelper(String resTableFileName) {
this.resNamePrefix = resTableFileName + ":/";
}
private void process(ResContainer resTable) {
@@ -52,7 +54,7 @@ public class ResTableHelper {
}
ICodeInfo code = rc.getText();
ResourceFileContent fileContent = new ResourceFileContent(name, ResourceType.XML, code);
JResource resFile = new JResource(fileContent, resName, name, JResource.JResType.FILE);
JResource resFile = new JResource(fileContent, resNamePrefix + resName, name, JResource.JResType.FILE);
addResFile(dir, resFile);
for (ResContainer subFile : rc.getSubFiles()) {
@@ -80,7 +82,7 @@ public class ResTableHelper {
JResource curDir = dirs.get(path);
if (curDir == null) {
String dirName = last ? dir.substring(prevStart) : dir.substring(prevStart, splitPos);
curDir = new JResource(null, dirName, JResource.JResType.DIR);
curDir = new JResource(null, resNamePrefix + path, dirName, JResource.JResType.DIR);
dirs.put(path, curDir);
if (parentDir == null) {
roots.add(curDir);
@@ -53,7 +53,7 @@ public class ResTableProtoParser extends CommonProtoParser implements IResTableP
ValuesParser vp = new ValuesParser(new BinaryXMLStrings(), resStorage.getResourcesNames());
ResXmlGen resGen = new ResXmlGen(resStorage, vp, root.initManifestAttributes());
ICodeInfo content = XmlGenUtils.makeXmlDump(root.makeCodeWriter(), resStorage);
List<ResContainer> xmlFiles = resGen.makeResourcesXml(root.getArgs(), baseFileName);
List<ResContainer> xmlFiles = resGen.makeResourcesXml(root.getArgs());
return ResContainer.resourceTable(baseFileName, xmlFiles, content);
}