■ ■ ■ ■ ■ ■
jadx-core/src/main/java/jadx/core/deobf/DeobfAliasProvider.java
| skipped 7 lines |
8 | 8 | | import jadx.core.dex.nodes.MethodNode; |
9 | 9 | | import jadx.core.dex.nodes.PackageNode; |
10 | 10 | | import jadx.core.dex.nodes.RootNode; |
| 11 | + | import jadx.core.utils.StringUtils; |
11 | 12 | | |
12 | 13 | | public class DeobfAliasProvider implements IAliasProvider { |
13 | 14 | | |
| skipped 60 lines |
74 | 75 | | } else if (cls.getAccessFlags().isAbstract()) { |
75 | 76 | | result.append("Abstract"); |
76 | 77 | | } |
| 78 | + | result.append(getBaseName(cls)); |
| 79 | + | return result.toString(); |
| 80 | + | } |
77 | 81 | | |
78 | | - | // Process current class and all super classes |
| 82 | + | /** |
| 83 | + | * Process current class and all super classes to get meaningful parent name |
| 84 | + | */ |
| 85 | + | private static String getBaseName(ClassNode cls) { |
79 | 86 | | ClassNode currentCls = cls; |
80 | | - | outerLoop: while (currentCls != null) { |
81 | | - | if (currentCls.getSuperClass() != null) { |
82 | | - | String superClsName = currentCls.getSuperClass().getObject(); |
83 | | - | if (superClsName.startsWith("android.app.")) { |
84 | | - | // e.g. Activity or Fragment |
85 | | - | result.append(superClsName.substring(12)); |
86 | | - | break; |
87 | | - | } else if (superClsName.startsWith("android.os.")) { |
88 | | - | // e.g. AsyncTask |
89 | | - | result.append(superClsName.substring(11)); |
90 | | - | break; |
| 87 | + | while (currentCls != null) { |
| 88 | + | ArgType superCls = currentCls.getSuperClass(); |
| 89 | + | if (superCls != null) { |
| 90 | + | String superClsName = superCls.getObject(); |
| 91 | + | if (superClsName.startsWith("android.app.") // e.g. Activity or Fragment |
| 92 | + | || superClsName.startsWith("android.os.") // e.g. AsyncTask |
| 93 | + | ) { |
| 94 | + | return getClsName(superClsName); |
91 | 95 | | } |
92 | 96 | | } |
93 | | - | for (ArgType intf : cls.getInterfaces()) { |
94 | | - | String intfClsName = intf.getObject(); |
95 | | - | if (intfClsName.equals("java.lang.Runnable")) { |
96 | | - | result.append("Runnable"); |
97 | | - | break outerLoop; |
98 | | - | } else if (intfClsName.startsWith("java.util.concurrent.")) { |
99 | | - | // e.g. Callable |
100 | | - | result.append(intfClsName.substring(21)); |
101 | | - | break outerLoop; |
102 | | - | } else if (intfClsName.startsWith("android.view.")) { |
103 | | - | // e.g. View.OnClickListener |
104 | | - | result.append(intfClsName.substring(13)); |
105 | | - | break outerLoop; |
106 | | - | } else if (intfClsName.startsWith("android.content.")) { |
107 | | - | // e.g. DialogInterface.OnClickListener |
108 | | - | result.append(intfClsName.substring(16)); |
109 | | - | break outerLoop; |
| 97 | + | for (ArgType interfaceType : cls.getInterfaces()) { |
| 98 | + | String name = interfaceType.getObject(); |
| 99 | + | if (name.equals("java.lang.Runnable")) { |
| 100 | + | return "Runnable"; |
| 101 | + | } |
| 102 | + | if (name.startsWith("java.util.concurrent.") // e.g. Callable |
| 103 | + | || name.startsWith("android.view.") // e.g. View.OnClickListener |
| 104 | + | || name.startsWith("android.content.") // e.g. DialogInterface.OnClickListener |
| 105 | + | ) { |
| 106 | + | return getClsName(name); |
110 | 107 | | } |
111 | 108 | | } |
112 | | - | if (currentCls.getSuperClass() == null) { |
| 109 | + | if (superCls == null) { |
113 | 110 | | break; |
114 | 111 | | } |
115 | | - | currentCls = cls.root().resolveClass(currentCls.getSuperClass()); |
| 112 | + | currentCls = cls.root().resolveClass(superCls); |
116 | 113 | | } |
117 | | - | return result.toString(); |
| 114 | + | return ""; |
| 115 | + | } |
| 116 | + | |
| 117 | + | private static String getClsName(String name) { |
| 118 | + | int pgkEnd = name.lastIndexOf('.'); |
| 119 | + | String clsName = name.substring(pgkEnd + 1); |
| 120 | + | return StringUtils.removeChar(clsName, '$'); |
118 | 121 | | } |
119 | 122 | | } |
120 | 123 | | |