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.
@@ -58,6 +58,9 @@ dependencies {
58
58
  api 'com.android.tools.smali:smali:3.0.3'
59
59
  api 'com.android.tools.smali:smali-baksmali:3.0.3'
60
60
 
61
+ // Guava - dexlib2 依赖
62
+ api 'com.google.guava:guava:32.1.3-android'
63
+
61
64
  // Gson - JSON序列化
62
65
  api 'com.google.code.gson:gson:2.10.1'
63
66
 
@@ -5,32 +5,32 @@ import android.util.Log;
5
5
  import com.getcapacitor.JSArray;
6
6
  import com.getcapacitor.JSObject;
7
7
 
8
- import org.jf.dexlib2.DexFileFactory;
9
- import org.jf.dexlib2.Opcodes;
10
- import org.jf.dexlib2.rewriter.DexRewriter;
11
- import org.jf.dexlib2.rewriter.Rewriter;
12
- import org.jf.dexlib2.rewriter.RewriterModule;
13
- import org.jf.dexlib2.rewriter.Rewriters;
14
- import org.jf.dexlib2.dexbacked.DexBackedClassDef;
15
- import org.jf.dexlib2.dexbacked.DexBackedDexFile;
16
- import org.jf.dexlib2.dexbacked.DexBackedField;
17
- import org.jf.dexlib2.dexbacked.DexBackedMethod;
18
- import org.jf.dexlib2.iface.ClassDef;
19
- import org.jf.dexlib2.iface.DexFile;
20
- import org.jf.dexlib2.iface.Field;
21
- import org.jf.dexlib2.iface.Method;
22
- import org.jf.dexlib2.iface.MethodImplementation;
23
- import org.jf.dexlib2.iface.instruction.Instruction;
24
- import org.jf.dexlib2.immutable.ImmutableClassDef;
25
- import org.jf.dexlib2.immutable.ImmutableDexFile;
26
- import org.jf.dexlib2.immutable.ImmutableField;
27
- import org.jf.dexlib2.immutable.ImmutableMethod;
28
- import org.jf.dexlib2.writer.io.FileDataStore;
29
- import org.jf.dexlib2.writer.pool.DexPool;
30
- import org.jf.baksmali.Baksmali;
31
- import org.jf.baksmali.BaksmaliOptions;
32
- import org.jf.smali.Smali;
33
- import org.jf.smali.SmaliOptions;
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
- info.put("stringCount", dexFile.getStringCount());
186
- info.put("typeCount", dexFile.getTypeCount());
187
- info.put("methodCount", dexFile.getMethodCount());
188
- info.put("fieldCount", dexFile.getFieldCount());
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
- for (int i = 0; i < session.originalDexFile.getStringCount(); i++) {
705
- String str = session.originalDexFile.getStringSection().get(i);
706
- boolean match;
707
-
708
- if (regex) {
709
- match = pattern.matcher(str).find();
710
- } else if (caseSensitive) {
711
- match = str.contains(query);
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
- for (int i = 0; i < session.originalDexFile.getStringCount(); i++) {
897
- JSObject item = new JSObject();
898
- item.put("index", i);
899
- item.put("value", session.originalDexFile.getStringSection().get(i));
900
- strings.put(item);
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) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "capacitor-dex-editor",
3
- "version": "0.0.2",
3
+ "version": "0.0.4",
4
4
  "description": "Capacitor-plugin-for-editing-DEX-files-in-APK",
5
5
  "main": "dist/plugin.cjs.js",
6
6
  "module": "dist/esm/index.js",