android 扫描某个包下的所有类

这篇具有很好参考价值的文章主要介绍了android 扫描某个包下的所有类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

注意事项

如果在用Android Studio开发过程中,如果新增了类,扫描不到。只能把APP卸载了,才能扫描到。
可能是Instance Run 的影响。

后面研究一下这篇文章,看看能不能解决
Android 遍历Apk下的所有类文件文章来源地址https://www.toymoban.com/news/detail-815709.html

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;
    }






}

到了这里,关于android 扫描某个包下的所有类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 系统登录的时候的密码如何做到以加密的形式进行登录【java.security包下的api】工具类。

    rsaSplitCodec()方法 四个方法我直接贴出来,两个方法是关于公钥的,两个方法是关于私钥的 我们写一个测试方法,看看明文加密之后的密文,在经过解密后的明文是否一致。 运行结果: 所以以后在登录的时候呢,前端会对界面输入的明文密码进行公钥加密成密文密码,然后再

    2024年01月25日
    浏览(44)
  • Unity Android 之 读取下载获取移动端 sdcard 路径下的指定文件夹的所有图片的几种方式的简单整理

    目录 Unity Android 之 读取下载获取移动端 sdcard 路径下的指定文件夹的所有图片的几种方式的简单整理 一、简单介绍 二、实现原理 三、注意事项 四、简单实现步骤 五、关键代码 附录: 一、不同平台使用宏区分路径加载 二、Unity3D中的资源路径 三、Unity3D各平台路径(包括手

    2024年01月19日
    浏览(84)
  • python 中,sklearn包下的f1_score、precision、recall使用方法,Accuracy、Precision、Recall和F1-score公式,TP、FP、TN、FN的概念

    目录 1.sklearn.metrics.f1_score 2.sklearn.metrics.precision_score 3.sklearn.metrics.recall_score 4.Accuracy,、Precision、 Recall和F1-score公式​​​​​​​ 5.TP、FP、TN、FN的概念 重要参数说明: y_true: 一维数组,或标签指示数组/稀疏矩阵 (真实值) y_pred: 一维数组,或标签指示数组/稀疏矩阵 (

    2023年04月24日
    浏览(53)
  • Python实现获得所有拼音为某个拼音的所有汉字

    好久没有写博客了,这几年的开发让我感受良多,同时我也感觉到了我自己成长的还不够。所以,以后这里将会有我个人所有的项目经验总结,以及项目中使用到的一些方便的小工具也会写出来。 目录 前言 一、获取所有拼音为某个拼音的汉字。 二、拿到所有项目中的代码,

    2023年04月09日
    浏览(48)
  • Linux查看某个进程的所有连接

    使用 netstat 命令: 将 进程号 替换为你要查找的进程的进程号。 使用 lsof 命令: 同样,将 进程号 替换为你要查找的进程的进程号。 进程号即为进程的 PID (Process ID),它是操作系统中用于唯一标识一个进程的数字标识符。在Linux系统中,PID是分配给运行的每个进程的唯一值。

    2024年02月15日
    浏览(40)
  • linux下kill某个用户所有进程

    参考:linux下4种kill某个用户所有进程的方法_lihuaichen的博客-CSDN博客_linux杀死所有python         使用: top 或者 ps 查看当前用户的运行进程;         使用  kill pid方式可以 杀死某个想杀死的进程; 那么想kill掉所有进程的方法:(4种)         pkill方式:      

    2024年02月11日
    浏览(45)
  • python django获取某个角色的某个数据和——例如:获取所有订单的应付金额总和

    model关系如下: 获取指定时间段内所有订单的应付金额总和 方法一:使用aggregate() 方法二:使用sum()

    2024年02月06日
    浏览(37)
  • ES替换某个索引下的字段的值

    在ES的操作中,如果我们已经同步完所有的索引,但是发现同步的时候数据出现了失误,那么在数据量很大的情况下还是要避免重新同步,这个时候就用到了更新替换操作: 针对于name字段进行替换,将name字段中包含/的替换成/ 针对nested结构的字段则有点不同了,下面的操作

    2024年02月06日
    浏览(47)
  • jsonpath提取字段某个字段为指定值的其他字段数据&提取某个字段的所有值

    1.jsonpath提取某个字段为指定值的其他字段数据 [ [ { “code”: “a255e81dc5a5442e”, “name”: “原始货号”, “values”: [ { “code”: “223e768a1b18b64c”, “attrCode”: “a255e81dc5a5442e”, “displayName”: “P11”, “frontName”: “P11”, “images”: [], “originCode”: “P11” } ], “originCode”: “

    2024年01月23日
    浏览(46)
  • git快速查看某个文件修改的所有commit

    1. git blame file git blame 可以显示历史修改的每一行记录,有时候我们只想了解某个文件一共提交几次commit,只显示commit列表,这种方式显然不满足要求。 2.git log常规使用 (1)显示整个project的所有commit     (2)显示某个文件的所有commit 这是git log不添加参数的常规使用,可查

    2024年02月09日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包