capacitor-dex-editor 0.0.2 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/android/build.gradle
CHANGED
|
@@ -5,32 +5,32 @@ import android.util.Log;
|
|
|
5
5
|
import com.getcapacitor.JSArray;
|
|
6
6
|
import com.getcapacitor.JSObject;
|
|
7
7
|
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
import
|
|
12
|
-
import
|
|
13
|
-
import
|
|
14
|
-
import
|
|
15
|
-
import
|
|
16
|
-
import
|
|
17
|
-
import
|
|
18
|
-
import
|
|
19
|
-
import
|
|
20
|
-
import
|
|
21
|
-
import
|
|
22
|
-
import
|
|
23
|
-
import
|
|
24
|
-
import
|
|
25
|
-
import
|
|
26
|
-
import
|
|
27
|
-
import
|
|
28
|
-
import
|
|
29
|
-
import
|
|
30
|
-
import
|
|
31
|
-
import
|
|
32
|
-
import
|
|
33
|
-
import
|
|
8
|
+
import com.android.tools.smali.dexlib2.DexFileFactory;
|
|
9
|
+
import com.android.tools.smali.dexlib2.Opcodes;
|
|
10
|
+
import com.android.tools.smali.dexlib2.rewriter.DexRewriter;
|
|
11
|
+
import com.android.tools.smali.dexlib2.rewriter.Rewriter;
|
|
12
|
+
import com.android.tools.smali.dexlib2.rewriter.RewriterModule;
|
|
13
|
+
import com.android.tools.smali.dexlib2.rewriter.Rewriters;
|
|
14
|
+
import com.android.tools.smali.dexlib2.dexbacked.DexBackedClassDef;
|
|
15
|
+
import com.android.tools.smali.dexlib2.dexbacked.DexBackedDexFile;
|
|
16
|
+
import com.android.tools.smali.dexlib2.dexbacked.DexBackedField;
|
|
17
|
+
import com.android.tools.smali.dexlib2.dexbacked.DexBackedMethod;
|
|
18
|
+
import com.android.tools.smali.dexlib2.iface.ClassDef;
|
|
19
|
+
import com.android.tools.smali.dexlib2.iface.DexFile;
|
|
20
|
+
import com.android.tools.smali.dexlib2.iface.Field;
|
|
21
|
+
import com.android.tools.smali.dexlib2.iface.Method;
|
|
22
|
+
import com.android.tools.smali.dexlib2.iface.MethodImplementation;
|
|
23
|
+
import com.android.tools.smali.dexlib2.iface.instruction.Instruction;
|
|
24
|
+
import com.android.tools.smali.dexlib2.immutable.ImmutableClassDef;
|
|
25
|
+
import com.android.tools.smali.dexlib2.immutable.ImmutableDexFile;
|
|
26
|
+
import com.android.tools.smali.dexlib2.immutable.ImmutableField;
|
|
27
|
+
import com.android.tools.smali.dexlib2.immutable.ImmutableMethod;
|
|
28
|
+
import com.android.tools.smali.dexlib2.writer.io.FileDataStore;
|
|
29
|
+
import com.android.tools.smali.dexlib2.writer.pool.DexPool;
|
|
30
|
+
import com.android.tools.smali.baksmali.Baksmali;
|
|
31
|
+
import com.android.tools.smali.baksmali.BaksmaliOptions;
|
|
32
|
+
import com.android.tools.smali.smali.Smali;
|
|
33
|
+
import com.android.tools.smali.smali.SmaliOptions;
|
|
34
34
|
|
|
35
35
|
import org.json.JSONArray;
|
|
36
36
|
|
|
@@ -182,10 +182,16 @@ public class DexManager {
|
|
|
182
182
|
info.put("sessionId", sessionId);
|
|
183
183
|
info.put("filePath", session.filePath);
|
|
184
184
|
info.put("classCount", dexFile.getClasses().size());
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
185
|
+
|
|
186
|
+
// 统计方法和字段数量
|
|
187
|
+
int methodCount = 0;
|
|
188
|
+
int fieldCount = 0;
|
|
189
|
+
for (ClassDef classDef : dexFile.getClasses()) {
|
|
190
|
+
for (Method ignored : classDef.getMethods()) methodCount++;
|
|
191
|
+
for (Field ignored : classDef.getFields()) fieldCount++;
|
|
192
|
+
}
|
|
193
|
+
info.put("methodCount", methodCount);
|
|
194
|
+
info.put("fieldCount", fieldCount);
|
|
189
195
|
info.put("dexVersion", dexFile.getOpcodes().api);
|
|
190
196
|
info.put("modified", session.modified);
|
|
191
197
|
return info;
|
|
@@ -701,23 +707,14 @@ public class DexManager {
|
|
|
701
707
|
pattern = Pattern.compile(query, flags);
|
|
702
708
|
}
|
|
703
709
|
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
} else {
|
|
713
|
-
match = str.toLowerCase().contains(query.toLowerCase());
|
|
714
|
-
}
|
|
715
|
-
|
|
716
|
-
if (match) {
|
|
717
|
-
JSObject item = new JSObject();
|
|
718
|
-
item.put("index", i);
|
|
719
|
-
item.put("value", str);
|
|
720
|
-
results.put(item);
|
|
710
|
+
// 遍历所有类中的字符串引用进行搜索
|
|
711
|
+
Set<String> searchedStrings = new HashSet<>();
|
|
712
|
+
for (ClassDef classDef : session.originalDexFile.getClasses()) {
|
|
713
|
+
// 类名
|
|
714
|
+
checkAndAddString(classDef.getType(), query, regex, caseSensitive, pattern, searchedStrings, results);
|
|
715
|
+
// 父类
|
|
716
|
+
if (classDef.getSuperclass() != null) {
|
|
717
|
+
checkAndAddString(classDef.getSuperclass(), query, regex, caseSensitive, pattern, searchedStrings, results);
|
|
721
718
|
}
|
|
722
719
|
}
|
|
723
720
|
|
|
@@ -893,11 +890,17 @@ public class DexManager {
|
|
|
893
890
|
DexSession session = getSession(sessionId);
|
|
894
891
|
JSArray strings = new JSArray();
|
|
895
892
|
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
893
|
+
// 收集所有类中的字符串
|
|
894
|
+
Set<String> collectedStrings = new HashSet<>();
|
|
895
|
+
int index = 0;
|
|
896
|
+
for (ClassDef classDef : session.originalDexFile.getClasses()) {
|
|
897
|
+
if (!collectedStrings.contains(classDef.getType())) {
|
|
898
|
+
collectedStrings.add(classDef.getType());
|
|
899
|
+
JSObject item = new JSObject();
|
|
900
|
+
item.put("index", index++);
|
|
901
|
+
item.put("value", classDef.getType());
|
|
902
|
+
strings.put(item);
|
|
903
|
+
}
|
|
901
904
|
}
|
|
902
905
|
|
|
903
906
|
return strings;
|
|
@@ -940,6 +943,29 @@ public class DexManager {
|
|
|
940
943
|
return session;
|
|
941
944
|
}
|
|
942
945
|
|
|
946
|
+
private void checkAndAddString(String str, String query, boolean regex,
|
|
947
|
+
boolean caseSensitive, Pattern pattern,
|
|
948
|
+
Set<String> searchedStrings, JSArray results) {
|
|
949
|
+
if (str == null || searchedStrings.contains(str)) return;
|
|
950
|
+
searchedStrings.add(str);
|
|
951
|
+
|
|
952
|
+
boolean match;
|
|
953
|
+
if (regex) {
|
|
954
|
+
match = pattern.matcher(str).find();
|
|
955
|
+
} else if (caseSensitive) {
|
|
956
|
+
match = str.contains(query);
|
|
957
|
+
} else {
|
|
958
|
+
match = str.toLowerCase().contains(query.toLowerCase());
|
|
959
|
+
}
|
|
960
|
+
|
|
961
|
+
if (match) {
|
|
962
|
+
JSObject item = new JSObject();
|
|
963
|
+
item.put("index", searchedStrings.size() - 1);
|
|
964
|
+
item.put("value", str);
|
|
965
|
+
results.put(item);
|
|
966
|
+
}
|
|
967
|
+
}
|
|
968
|
+
|
|
943
969
|
private ClassDef findClass(DexSession session, String className) {
|
|
944
970
|
// 先检查修改后的类
|
|
945
971
|
for (ClassDef classDef : session.modifiedClasses) {
|