android 扫描某个包下的所有类

注意事项

如果在用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;
    }






}