注意事项
如果在用Android Studio开发过程中,如果新增了类,扫描不到。只能把APP卸载了,才能扫描到。
 可能是Instance Run 的影响。
后面研究一下这篇文章,看看能不能解决
 Android 遍历Apk下的所有类文件
package com.trs.nmip.common.util.web.event_submit;
/**
 * <pre>
 * Created by zhuguohui
 * Date: 2024/1/22
 * Time: 16:04
 * Desc:
 * </pre>
 */
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import dalvik.system.BaseDexClassLoader;
import dalvik.system.DexClassLoader;
import dalvik.system.DexFile;
public class AndroidClassScanner {
    // 获取某个包名下的所有类名
    public static List<String> getClassesInPackage(Context context, String packageName) {
        List<String> classNames = new ArrayList<>();
        PackageManager packageManager = context.getPackageManager();
        try {
            // 获取应用信息
            ApplicationInfo applicationInfo = packageManager.getApplicationInfo(context.getPackageName(), 0);
            // 获取应用 APK 文件的路径
            String apkPath = applicationInfo.sourceDir;
            // 通过 DexClassLoader 加载 APK 文件
            DexClassLoader dexClassLoader = new DexClassLoader(apkPath, context.getCacheDir().getAbsolutePath(), null, context.getClassLoader());
            // 获取 Dex 文件的路径
            String dexPath = context.getCacheDir() + "/output.dex";
            // 将 APK 文件解压到 Dex 文件
            DexFile dexFile = DexFile.loadDex(apkPath, dexPath, 0);
            // 获取 Dex 文件中的所有类名
            Enumeration<String> entries = dexFile.entries();
            while (entries.hasMoreElements()) {
                String className = entries.nextElement();
                classNames.add(className);
            }
            // 清除 DexClassLoader 缓存
            //上述代码在获取完类名后,将 DexClassLoader 设置为 null 并触发垃圾回收,以清除类加载器的缓存。这可能有助于解决新增类无法扫描到的问题
            dexClassLoader = null;
            System.gc();
        } catch (PackageManager.NameNotFoundException | IOException e) {
            e.printStackTrace();
        }
        List<String> needClassNames=new ArrayList<>();
        for(String name:classNames){
            if(name.startsWith(packageName)){
                needClassNames.add(name);
            }
        }
        return needClassNames;
    }
}