Skip to content

Commit

Permalink
feat(gui): use SVG icons, xml resources impovements (PR #1221)
Browse files Browse the repository at this point in the history
* fix(xml): add more file based resources type to skip
* fix(res): fix #1060, styles might contain dots in name
* fix(res): use lowercase name on deobfuscated\renamed resources names and id in hex format
* feat(gui): update gui under FlatLaf
* fix(gui): use FlatSVGIcon to fix icons brightness difference
* fix(gui): use source lines only decompiled java code
Co-authored-by: MrIkso <mrkso821@gmail.com>
  • Loading branch information
MrIkso committed Aug 4, 2021
1 parent 5f24193 commit ee12f0b
Show file tree
Hide file tree
Showing 193 changed files with 825 additions and 261 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ public static boolean handleAppResField(ICodeWriter code, ClassGen clsGen, Class
@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())));
code.add(String.format("0x%08x", ((Integer) encodedValue.getValue())));
return true;
}
return false;
Expand Down
17 changes: 10 additions & 7 deletions jadx-core/src/main/java/jadx/core/xmlgen/ResTableParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ private void deobfKeyStrings(String[] keyStrings) {
}

private String makeNewKeyName(int idx) {
return "JADX_DEOBF_" + idx;
return String.format("jadx_deobf_0x%08x", idx);
}

@SuppressWarnings("unused")
Expand Down Expand Up @@ -251,7 +251,7 @@ private void parseEntry(PackageChunk pkg, int typeId, int entryId, String config
int resRef = pkg.getId() << 24 | typeId << 16 | entryId;
String typeName = pkg.getTypeStrings()[typeId - 1];
String origKeyName = pkg.getKeyStrings()[key];
ResourceEntry newResEntry = new ResourceEntry(resRef, pkg.getName(), typeName, getResName(resRef, origKeyName), config);
ResourceEntry newResEntry = new ResourceEntry(resRef, pkg.getName(), typeName, getResName(typeName, resRef, origKeyName), config);
ResourceEntry prevResEntry = resStorage.searchEntryWithSameName(newResEntry);
if (prevResEntry != null) {
newResEntry = newResEntry.copyWithId();
Expand Down Expand Up @@ -280,22 +280,25 @@ private void parseEntry(PackageChunk pkg, int typeId, int entryId, String config
resStorage.add(newResEntry);
}

private String getResName(int resRef, String origKeyName) {
private String getResName(String typeName, int resRef, String origKeyName) {
if (this.useRawResName) {
return origKeyName;
}
String renamedKey = resStorage.getRename(resRef);
if (renamedKey != null) {
return renamedKey;
}
if (VALID_RES_KEY_PATTERN.matcher(origKeyName).matches()) {
return origKeyName;
}
FieldNode constField = root.getConstValues().getGlobalConstFields().get(resRef);
if (constField != null) {
constField.add(AFlag.DONT_RENAME);
return constField.getName();
}
// styles might contain dots in name, use VALID_RES_KEY_PATTERN only for resource file name
if (typeName.equals("style")) {
return origKeyName;
} else if (VALID_RES_KEY_PATTERN.matcher(origKeyName).matches()) {
return origKeyName;
}
// Making sure origKeyName compliant with resource file name rules
Matcher m = VALID_RES_KEY_PATTERN.matcher(origKeyName);
StringBuilder sb = new StringBuilder();
Expand All @@ -308,7 +311,7 @@ private String getResName(int resRef, String origKeyName) {
first = false;
}
// autogenerate key name, appended with cleaned origKeyName to be human-friendly
String newResName = "res_" + resRef;
String newResName = String.format("res_0x%08x",resRef);
String cleanedResName = sb.toString();
if (!cleanedResName.isEmpty()) {
newResName += "_" + cleanedResName.toLowerCase();
Expand Down
15 changes: 14 additions & 1 deletion jadx-core/src/main/java/jadx/core/xmlgen/ResXmlGen.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,23 @@

public class ResXmlGen {

/**
* Skip only file based resource type
*/
private static final Set<String> SKIP_RES_TYPES = new HashSet<>(Arrays.asList(
"anim",
"animator",
"font",
"id", // skip id type, it is usually auto generated when used this syntax "@+id/my_id"
"interpolator",
"layout",
"menu",
"mipmap",
"id"));
"navigation",
"raw",
"transition",
"xml"
));

private final ResourceStorage resStorage;
private final ValuesParser vp;
Expand Down
2 changes: 1 addition & 1 deletion jadx-core/src/main/java/jadx/core/xmlgen/XmlGenUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public static ICodeInfo makeXmlDump(ICodeWriter writer, ResourceStorage resStora
Set<String> addedValues = new HashSet<>();
for (ResourceEntry ri : resStorage.getResources()) {
if (addedValues.add(ri.getTypeName() + '.' + ri.getKeyName())) {
String format = String.format("<public type=\"%s\" name=\"%s\" id=\"0x%X\" />",
String format = String.format("<public type=\"%s\" name=\"%s\" id=\"0x%08x\" />",
ri.getTypeName(), ri.getKeyName(), ri.getId());
writer.startLine(format);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public ResourceEntry copy(String newKeyName) {
}

public ResourceEntry copyWithId() {
return copy(keyName + "_RES_" + id);
return copy(String.format("%s_res_0x%08x",keyName,id));
}

public int getId() {
Expand Down
2 changes: 2 additions & 0 deletions jadx-gui/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ dependencies {

implementation 'com.formdev:flatlaf:1.4'
implementation 'com.formdev:flatlaf-intellij-themes:1.4'
implementation 'com.formdev:flatlaf-extras:1.4'
implementation 'com.formdev:svgSalamander:1.1.2.4'
implementation 'org.reflections:reflections:0.9.12'

implementation 'com.google.code.gson:gson:2.8.6'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@
import jadx.gui.device.debugger.smali.Smali;
import jadx.gui.device.debugger.smali.SmaliRegister;
import jadx.gui.treemodel.JClass;
import jadx.gui.ui.IDebugController;
import jadx.gui.ui.JDebuggerPanel;
import jadx.gui.ui.JDebuggerPanel.*;
import jadx.gui.ui.panel.IDebugController;
import jadx.gui.ui.panel.JDebuggerPanel;
import jadx.gui.ui.panel.JDebuggerPanel.*;

import static jadx.gui.device.debugger.SmaliDebugger.RuntimeType;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
import org.slf4j.LoggerFactory;

import jadx.gui.ui.MainWindow;
import jadx.gui.ui.ProgressPanel;
import jadx.gui.ui.panel.ProgressPanel;
import jadx.gui.utils.UiUtils;

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@

import jadx.gui.treemodel.JClass;
import jadx.gui.treemodel.JNode;
import jadx.gui.ui.ContentPanel;
import jadx.gui.ui.HtmlPanel;
import jadx.gui.ui.panel.ContentPanel;
import jadx.gui.ui.panel.HtmlPanel;
import jadx.gui.ui.TabbedPane;
import jadx.gui.utils.UiUtils;

Expand All @@ -29,7 +29,7 @@ public class QuarkReportNode extends JNode {

private static final Gson GSON = new GsonBuilder().create();

private static final ImageIcon ICON = UiUtils.openIcon("icon_quark");
private static final ImageIcon ICON = UiUtils.openSvgIcon("ui/analyze");
private final Path apkFile;

private String errorContent;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
import jadx.gui.JadxWrapper;
import jadx.gui.jobs.BackgroundExecutor;
import jadx.gui.treemodel.JMethod;
import jadx.gui.ui.ContentPanel;
import jadx.gui.ui.panel.ContentPanel;
import jadx.gui.ui.MainWindow;
import jadx.gui.ui.TabbedPane;
import jadx.gui.utils.JNodeCache;
Expand Down
6 changes: 3 additions & 3 deletions jadx-gui/src/main/java/jadx/gui/treemodel/ApkSignature.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@
import jadx.api.ResourceFile;
import jadx.api.ResourceType;
import jadx.gui.JadxWrapper;
import jadx.gui.ui.ContentPanel;
import jadx.gui.ui.HtmlPanel;
import jadx.gui.ui.panel.ContentPanel;
import jadx.gui.ui.panel.HtmlPanel;
import jadx.gui.ui.TabbedPane;
import jadx.gui.utils.CertificateManager;
import jadx.gui.utils.NLS;
Expand All @@ -31,7 +31,7 @@ public class ApkSignature extends JNode {

private static final Logger LOG = LoggerFactory.getLogger(ApkSignature.class);

private static final ImageIcon CERTIFICATE_ICON = UiUtils.openIcon("certificate_obj");
private static final ImageIcon CERTIFICATE_ICON = UiUtils.openSvgIcon("nodes/styleKeyPack");

private final transient File openFile;
private String content;
Expand Down
24 changes: 14 additions & 10 deletions jadx-gui/src/main/java/jadx/gui/treemodel/JClass.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import javax.swing.*;

import jadx.gui.ui.panel.ContentPanel;
import org.fife.ui.rsyntaxtextarea.SyntaxConstants;
import org.jetbrains.annotations.Nullable;

Expand All @@ -12,7 +13,6 @@
import jadx.api.JavaNode;
import jadx.core.dex.attributes.AFlag;
import jadx.core.dex.info.AccessInfo;
import jadx.gui.ui.ContentPanel;
import jadx.gui.ui.TabbedPane;
import jadx.gui.ui.codearea.ClassCodeContentPanel;
import jadx.gui.utils.NLS;
Expand All @@ -21,13 +21,14 @@
public class JClass extends JLoadableNode {
private static final long serialVersionUID = -1239986875244097177L;

private static final ImageIcon ICON_CLASS = UiUtils.openIcon("class_obj");
private static final ImageIcon ICON_CLASS_DEFAULT = UiUtils.openIcon("class_default_obj");
private static final ImageIcon ICON_CLASS_PRIVATE = UiUtils.openIcon("innerclass_private_obj");
private static final ImageIcon ICON_CLASS_PROTECTED = UiUtils.openIcon("innerclass_protected_obj");
private static final ImageIcon ICON_INTERFACE = UiUtils.openIcon("int_obj");
private static final ImageIcon ICON_ENUM = UiUtils.openIcon("enum_obj");
private static final ImageIcon ICON_ANNOTATION = UiUtils.openIcon("annotation_obj");
private static final ImageIcon ICON_CLASS = UiUtils.openSvgIcon("nodes/class");
private static final ImageIcon ICON_CLASS_ABSTRACT = UiUtils.openSvgIcon("nodes/abstractClass");
private static final ImageIcon ICON_CLASS_PUBLIC = UiUtils.openSvgIcon("nodes/publicClass");
private static final ImageIcon ICON_CLASS_PRIVATE = UiUtils.openSvgIcon("nodes/privateClass");
private static final ImageIcon ICON_CLASS_PROTECTED = UiUtils.openSvgIcon("nodes/protectedClass");
private static final ImageIcon ICON_INTERFACE = UiUtils.openSvgIcon("nodes/interface");
private static final ImageIcon ICON_ENUM = UiUtils.openSvgIcon("nodes/enum");
private static final ImageIcon ICON_ANNOTATION = UiUtils.openSvgIcon("nodes/annotationtype");

private final transient JavaClass cls;
private final transient JClass jParent;
Expand Down Expand Up @@ -130,16 +131,19 @@ public Icon getIcon() {
if (accessInfo.isInterface()) {
return ICON_INTERFACE;
}
if (accessInfo.isAbstract()) {
return ICON_CLASS_ABSTRACT;
}
if (accessInfo.isProtected()) {
return ICON_CLASS_PROTECTED;
}
if (accessInfo.isPrivate()) {
return ICON_CLASS_PRIVATE;
}
if (accessInfo.isPublic()) {
return ICON_CLASS;
return ICON_CLASS_PUBLIC;
}
return ICON_CLASS_DEFAULT;
return ICON_CLASS;
}

@Override
Expand Down
18 changes: 4 additions & 14 deletions jadx-gui/src/main/java/jadx/gui/treemodel/JField.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,10 @@
public class JField extends JNode {
private static final long serialVersionUID = 1712572192106793359L;

private static final ImageIcon ICON_FLD_DEF = UiUtils.openIcon("field_default_obj");
private static final ImageIcon ICON_FLD_PRI = UiUtils.openIcon("field_private_obj");
private static final ImageIcon ICON_FLD_PRO = UiUtils.openIcon("field_protected_obj");
private static final ImageIcon ICON_FLD_PUB = UiUtils.openIcon("field_public_obj");

private static final ImageIcon ICON_TRANSIENT = UiUtils.openIcon("transient_co");
private static final ImageIcon ICON_VOLATILE = UiUtils.openIcon("volatile_co");

private static final ImageIcon ICON_FLD_DEF = UiUtils.openSvgIcon("nodes/field");
private static final ImageIcon ICON_FLD_PRI = UiUtils.openSvgIcon("nodes/privateField");
private static final ImageIcon ICON_FLD_PRO = UiUtils.openSvgIcon("nodes/protectedField");
private static final ImageIcon ICON_FLD_PUB = UiUtils.openSvgIcon("nodes/publicField");
private final transient JavaField field;
private final transient JClass jParent;

Expand Down Expand Up @@ -64,12 +60,6 @@ public int getLine() {
public Icon getIcon() {
AccessInfo af = field.getAccessFlags();
OverlayIcon icon = UiUtils.makeIcon(af, ICON_FLD_PUB, ICON_FLD_PRI, ICON_FLD_PRO, ICON_FLD_DEF);
if (af.isTransient()) {
icon.add(ICON_TRANSIENT);
}
if (af.isVolatile()) {
icon.add(ICON_VOLATILE);
}
return icon;
}

Expand Down
46 changes: 34 additions & 12 deletions jadx-gui/src/main/java/jadx/gui/treemodel/JMethod.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,22 +12,23 @@
import jadx.core.dex.attributes.AFlag;
import jadx.core.dex.info.AccessInfo;
import jadx.core.dex.instructions.args.ArgType;
import jadx.gui.ui.ContentPanel;
import jadx.gui.ui.panel.ContentPanel;
import jadx.gui.ui.TabbedPane;
import jadx.gui.ui.codearea.ClassCodeContentPanel;
import jadx.gui.utils.OverlayIcon;
import jadx.gui.utils.UiUtils;
import sun.security.mscapi.PRNG;

public class JMethod extends JNode {
private static final long serialVersionUID = 3834526867464663751L;

private static final ImageIcon ICON_MTH_DEF = UiUtils.openIcon("methdef_obj");
private static final ImageIcon ICON_MTH_PRI = UiUtils.openIcon("methpri_obj");
private static final ImageIcon ICON_MTH_PRO = UiUtils.openIcon("methpro_obj");
private static final ImageIcon ICON_MTH_PUB = UiUtils.openIcon("methpub_obj");

private static final ImageIcon ICON_CONSTRUCTOR = UiUtils.openIcon("constr_ovr");
private static final ImageIcon ICON_SYNC = UiUtils.openIcon("synch_co");
private static final ImageIcon ICON_METHOD = UiUtils.openSvgIcon("nodes/method");
private static final ImageIcon ICON_METHOD_ABSTRACT = UiUtils.openSvgIcon("nodes/abstractMethod");
private static final ImageIcon ICON_METHOD_PRIVATE = UiUtils.openSvgIcon("nodes/privateMethod");
private static final ImageIcon ICON_METHOD_PROTECTED = UiUtils.openSvgIcon("nodes/protectedMethod");
private static final ImageIcon ICON_METHOD_PUBLIC = UiUtils.openSvgIcon("nodes/publicMethod");
private static final ImageIcon ICON_METHOD_CONSTRUCTOR = UiUtils.openSvgIcon("nodes/constructorMethod");
private static final ImageIcon ICON_METHOD_SYNC = UiUtils.openSvgIcon("nodes/methodReference");

private final transient JavaMethod mth;
private final transient JClass jParent;
Expand Down Expand Up @@ -73,14 +74,35 @@ public ContentPanel getContentPanel(TabbedPane tabbedPane) {
@Override
public Icon getIcon() {
AccessInfo accessFlags = mth.getAccessFlags();
OverlayIcon icon = UiUtils.makeIcon(accessFlags, ICON_MTH_PUB, ICON_MTH_PRI, ICON_MTH_PRO, ICON_MTH_DEF);
Icon icon = ICON_METHOD;
if(accessFlags.isAbstract()){
icon = ICON_METHOD_ABSTRACT;
}
if (accessFlags.isConstructor()) {
icon.add(ICON_CONSTRUCTOR);
icon = ICON_METHOD_CONSTRUCTOR;
}
if(accessFlags.isPublic()){
icon= ICON_METHOD_PUBLIC;
}
if(accessFlags.isPrivate()){
icon = ICON_METHOD_PRIVATE;
}
if(accessFlags.isProtected()){
icon = ICON_METHOD_PROTECTED;
}
if (accessFlags.isSynchronized()) {
icon.add(ICON_SYNC);
icon= ICON_METHOD_SYNC;
}
return icon;

OverlayIcon overIcon = new OverlayIcon(icon);
if (accessFlags.isFinal()) {
overIcon.add(UiUtils.ICON_FINAL);
}
if (accessFlags.isStatic()) {
overIcon.add(UiUtils.ICON_STATIC);
}

return overIcon;
}

@Override
Expand Down
2 changes: 1 addition & 1 deletion jadx-gui/src/main/java/jadx/gui/treemodel/JNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import jadx.api.ICodeInfo;
import jadx.api.JadxDecompiler;
import jadx.api.JavaNode;
import jadx.gui.ui.ContentPanel;
import jadx.gui.ui.panel.ContentPanel;
import jadx.gui.ui.TabbedPane;

public abstract class JNode extends DefaultMutableTreeNode {
Expand Down
2 changes: 1 addition & 1 deletion jadx-gui/src/main/java/jadx/gui/treemodel/JPackage.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
public class JPackage extends JNode implements Comparable<JPackage> {
private static final long serialVersionUID = -4120718634156839804L;

private static final ImageIcon PACKAGE_ICON = UiUtils.openIcon("package_obj");
private static final ImageIcon PACKAGE_ICON = UiUtils.openSvgIcon("nodes/package");

private String fullName;
private String name;
Expand Down
Loading

0 comments on commit ee12f0b

Please sign in to comment.