diff --git a/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java b/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java index 31418c1f9..b610ebacc 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java @@ -43,6 +43,7 @@ import jadx.core.dex.nodes.RootNode; import jadx.core.utils.CodeGenUtils; import jadx.core.utils.ErrorsCounter; import jadx.core.utils.Utils; +import jadx.core.utils.android.AndroidResourcesUtils; import jadx.core.utils.exceptions.CodegenException; import jadx.core.utils.exceptions.JadxRuntimeException; @@ -402,7 +403,9 @@ public class ClassGen { if (encodedValue.getType() == EncodedType.ENCODED_NULL) { code.add(TypeGen.literalToString(0, f.getType(), cls, fallback)); } else { - annotationGen.encodeValue(cls.root(), code, encodedValue); + if (!AndroidResourcesUtils.handleResourceFieldValue(cls, code, encodedValue)) { + annotationGen.encodeValue(cls.root(), code, encodedValue); + } } } else if (fv.isInsn()) { InsnGen insnGen = makeInsnGen(fv.getInsnMth()); diff --git a/jadx-core/src/main/java/jadx/core/utils/android/AndroidResourcesUtils.java b/jadx-core/src/main/java/jadx/core/utils/android/AndroidResourcesUtils.java index 21af1be63..cd9447fcc 100644 --- a/jadx-core/src/main/java/jadx/core/utils/android/AndroidResourcesUtils.java +++ b/jadx-core/src/main/java/jadx/core/utils/android/AndroidResourcesUtils.java @@ -74,6 +74,23 @@ public class AndroidResourcesUtils { return false; } + /** + * Force hex format for Android resources ids + */ + @SuppressWarnings("RedundantCast") + public static boolean handleResourceFieldValue(ClassNode cls, ICodeWriter code, EncodedValue encodedValue) { + if (encodedValue.getType() == EncodedType.ENCODED_INT && isResourceClass(cls)) { + code.add(String.format("0x%X", ((Integer) encodedValue.getValue()))); + return true; + } + return false; + } + + public static boolean isResourceClass(ClassNode cls) { + ClassNode parentClass = cls.getParentClass(); + return parentClass != null && parentClass.getShortName().equals("R"); + } + private static ClassNode makeClass(RootNode root, String clsName, ResourceStorage resStorage) { ClassNode rCls = ClassNode.addSyntheticClass(root, clsName, AccessFlags.PUBLIC | AccessFlags.FINAL); rCls.addAttr(AType.COMMENTS, "This class is generated by JADX"); diff --git a/jadx-core/src/main/java/jadx/core/xmlgen/XmlGenUtils.java b/jadx-core/src/main/java/jadx/core/xmlgen/XmlGenUtils.java index 5369e853f..5656e29c5 100644 --- a/jadx-core/src/main/java/jadx/core/xmlgen/XmlGenUtils.java +++ b/jadx-core/src/main/java/jadx/core/xmlgen/XmlGenUtils.java @@ -35,7 +35,7 @@ public class XmlGenUtils { Set addedValues = new HashSet<>(); for (ResourceEntry ri : resStorage.getResources()) { if (addedValues.add(ri.getTypeName() + '.' + ri.getKeyName())) { - String format = String.format("", + String format = String.format("", ri.getTypeName(), ri.getKeyName(), ri.getId()); writer.startLine(format); }