android 的ClassLoader加载dex

子类:BaseDexClassloader 的子类

               1 PathClassLoader,==》用于android应用程序的类加载器,可以加载制定的dex,以及j a r,zip,apk中的classes。dex 

                 2 inMamemoryDexClassLoader =>android 8.0之后添加的,用来加载内存中的                                                         dex文件

                  3 DexClassLoader ==》加载指定的dex,以及jar,zip,apk中的classes.dex

 其中,我们自己写的ma inactivity等是被PathClassLoader加载的。

        但系统的Activity.class 是被 =》bootCalsss Loader加载的,这个加载的是Framework 层的class文件.例如下面的两个返回就是不一样的。


//Path Class Loader
val classLoader1 =getclassLoader// Boot Class Loader
val classLoader2 = Activity.class.getclassLoader
DexClassLoader 和 PathClassLoader 区别。

直接看两个构造方法:都是可以加载额外的de x的,几乎没有区别,有些博客说的错的

/**1.DexClassLoader需要传入opt优化后的optdex的文件存放路径,
2.但是PathClassLoader 传的null,PathClassLoader所以不优化?
不是的,也会加载优化,PathClassLoader会存到“/data/davlic-cache”里面去
3. optimizedDirectory -》必须是app的私有目录。不能用sd card,
*/public DexClassLoader(String dexPath, String optimizedDirectory, String librarySearchPath, ClassLoader parent) {super((String)null, (File)null, (String)null, (ClassLoader)null);throw new RuntimeException("Stub!");}public class PathClassLoader extends BaseDexClassLoader {public PathClassLoader(String dexPath, ClassLoader parent) {super((String)null, (File)null, (String)null, (ClassLoader)null);throw new RuntimeException("Stub!");}public PathClassLoader(String dexPath, String librarySearchPath, ClassLoader parent) {super((String)null, (File)null, (String)null, (ClassLoader)null);throw new RuntimeException("Stub!");}
}

那么Class Loader又是怎么加载dex的呢?

        dex  加载都是先从parent父类开始找,不停往上找,找不到,再来找自己本身,这里说的是parent父亲,不是指的继承关系里的父类

1.双亲委托机制;某个类加载器加载类时,首先加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就返回成功,否则自己去加载。

接下来就是BaseDexLoader中的 find Class方法了。

   @Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException {List<Throwable> suppressedExceptions = new ArrayList<Throwable>();Class c = pathList.findClass(name, suppressedExceptions);if (c == null) {ClassNotFoundException cnfe = new ClassNotFoundException("Didn't find class \"" + name + "\" on path: " + pathList);for (Throwable t : suppressedExceptions) {cnfe.addSuppressed(t);}throw cnfe;}return c;}///主要就是 Class c = pathList.findClass(name, suppressedExceptions);

pathList? 又是什么呢?还是源码里。

private final DexPathList pathList;并且在构造方法中。

public BaseDexClassLoader(String dexPath, File optimizedDirectory,String librarySearchPath, ClassLoader parent, boolean isTrusted) {super(parent);this.pathList = new DexPathList(this, dexPath, librarySearchPath, null, isTrusted);if (reporter != null) {reportClassLoaderChain();}}

继续挖。。。。

 public Class<?> findClass(String name, List<Throwable> suppressed) {for (Element element : dexElements) {Class<?> clazz = element.findClass(name, definingContext, suppressed);if (clazz != null) {return clazz;}}if (dexElementsSuppressedExceptions != null) {suppressed.addAll(Arrays.asList(dexElementsSuppressedExceptions));}return null;}

注意:Element中包含一个dexfile,

再后面就是记录dex地址,和dex的opt优化的地址。----》loadDexFile --->kotlin里面会提示不推荐= =

loadDexFile,遍历de x的所有所有class。

最后还是很多的native(c/c++)函数,来完成加载。

Elementz中的find Class(),就是借助DexFile,DexFile加载一个类,DexFile通过native defineClassNAtive()这样的方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/235976.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【已解决】解决Springboot项目访问本地图片等静态资源无法访问的问题

今天在开发一个招聘系统的时候&#xff0c;有投递简历功能&#xff0c;有投递就会有随之而来的查看简历对吧&#xff0c;我投递过的简历&#xff0c;另存为一个文件夹&#xff0c;就是说本地磁盘(或者服务器)有一个专门存放投递过的简历的文件夹&#xff0c;用于存放PDF&#x…

Vue组件间通信(六种方式)

第一种&#xff1a;props 适用场景&#xff1a;父子组件通信 注意事项&#xff1a; 如果父组件给子组件传递数据&#xff08;函数&#xff09;&#xff1a;本质上上是子组件给父组件传递数据 如果父组件给子组件传递的数据&#xff08;非函数&#xff09;&#xff0c;本质上…

重新配置torch1.8 cuda11.1 torchtext0.9.0虚拟Pytorch开发环境

这里写目录标题 起因发现选择安装cuda 11.1核对下自己的显卡是否支持下载该版本的CUDACUDA下载地址CUDA安装过程 在anaconda中创建一个虚拟环境1.以下是环境的配置过程2.查看虚拟环境列表3.激活虚拟环境 安装torch和torchtext包的过程1.输入下面这句代码&#xff0c;就可以直接…

韩语中的一次多用-柯桥基础韩语学习

1.动词&#xff0c;写 일기를 쓰다 写日记 2.动词&#xff0c;戴&#xff08;帽子&#xff0c;眼镜&#xff0c;口罩&#xff09; 안경을 쓰다 戴眼镜 3.动词&#xff0c;使用&#xff08;材料&#xff0c;道具&#xff0c;手段&#xff09; 세제를 쓰다 使用洗剂 4.动词&am…

大创项目推荐 深度学习 大数据 股票预测系统 - python lstm

文章目录 0 前言1 课题意义1.1 股票预测主流方法 2 什么是LSTM2.1 循环神经网络2.1 LSTM诞生 2 如何用LSTM做股票预测2.1 算法构建流程2.2 部分代码 3 实现效果3.1 数据3.2 预测结果项目运行展示开发环境数据获取 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天…

Ethernet/IP 之IO 连接简要记录

IO连接 EIP的IO连接提供了在一个生产者和多个消费者之间的特定的通信路径&#xff0c;以达到IO数据在IO连接下传输。 生产者对象产生IO数据通过生产者IO连接管理者对象将连接ID和数据组帧发送给消费者IO连接管理者对象然后将IO数据发送给消费者对象。 显示消息连接 显式消息传…

《信息安全工程师教材》-蒋建春、信息安全完全参考手册-Mark Rhodes Ousley、CISSP官方学习指南第九版、ISO27002学习

文章目录 介绍关系学习顺序重复内容学习方法建议学习时间可能重合的部分更详细的学习计划 介绍 《信息安全工程师教材》- 蒋建春&#xff1a;这本教材可能是针对中国地区信息安全工程师的认证考试而编写的&#xff0c;它可能会涵盖信息安全的基本概念、技术和政策&#xff0c;特…

2866. 美丽塔 II --力扣 --JAVA

题目 给你一个长度为 n 下标从 0 开始的整数数组 maxHeights 。 你的任务是在坐标轴上建 n 座塔。第 i 座塔的下标为 i &#xff0c;高度为 heights[i] 。 如果以下条件满足&#xff0c;我们称这些塔是 美丽 的&#xff1a; 1 < heights[i] < maxHeights[i]heights 是一个…

【点选验证码识别】某招标网站反爬虫分析与验证码自动识别

文章目录 1. 写在前面2. 风控描述3. 验证码裁剪4. 验证码识别 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xff01; 【作者推荐】&#xff1a;对JS逆向感兴趣…

winlator模拟器汉化版是款功能非常强大的安卓游戏模拟器。

winlator模拟器 可以支持玩家在手机上运行各种经典游戏&#xff0c;拥有强大的兼容性&#xff0c;不同芯片、系统和手机都可以完美的运行。进入软件后&#xff0c;可以对显卡配置等进行改变&#xff0c;有利于帮助运行较新的游戏&#xff0c;同时也能够跳过配置检查。相比于其…

ssm基于javaweb的疫情管理系统的设计与实现+vue论文

摘 要 针对于疫情信息管理方面的不规范&#xff0c;容错率低&#xff0c;管理人员处理数据费工费时&#xff0c;采用新开发的疫情管理系统可以从根源上规范整个数据处理流程的正规性和合法性。 疫情管理系统实现的功能包括健康打卡管理&#xff0c;返校申请管理&#xff0c;留…

【Vulnhub 靶场】【DarkHole: 1】【简单】【20210730】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/darkhole-1,724/ 靶场下载&#xff1a;https://download.vulnhub.com/darkhole/DarkHole.zip 靶场难度&#xff1a;简单 发布日期&#xff1a;2021年07月18日 文件大小&#xff1a;2.9 GB 靶场作者&#xff1a…

新手一键重装系统Win11详细教程

Win11系统如果出现了重大问题&#xff0c;无法通过简单的操作解决&#xff0c;那么我们就可以直接选择重新安装正常的操作系统。作为新手用户&#xff0c;对于装机过程不是很了解&#xff0c;那么可以参考下面小编分享的一键重新安装系统Win11的详细教程步骤&#xff0c;轻轻松…

js作用域

声明修饰符 let具有块级作用域 let声明的变量具有块级作用域,for循环流程控制部分(小括号内),循环体部分(大括号内)、以及函数体、大括号包裹的代码块、中使用let声明的变量仅在该块状作用域内可见.如果在全局环境中使用let声明则是全局变量. 在chrome控制台使用let声明变量…

速盾网络:网络安全守护者

速盾网络作为一家专业的网络安全服务提供商&#xff0c;致力于为企业和个人提供全面、高效、可靠的网络安全解决方案。以下是速盾网络的主要业务介绍&#xff1a; 一、CDN加速 速盾网络拥有全球化的CDN加速网络&#xff0c;通过分布在全球各地的节点&#xff0c;为客户提供快速…

第80讲:GTID全局事务标识符的基本概念以及在Binlog中应用GTID

文章目录 1.GTID的基本概念1.1.为什么要引入GTID1.2.什么是GTID 2.开启GTID全局事务标识符的功能3.模拟产生Binlog日志观察开启GTID功能的区别3.1.模拟产生Binlog日志3.2.观察Binlog日志中的事件信息3.2.观察节点状态有什么变化3.3.观察Binlog日志会有什么变化 4.使用GTID来截取…

HuggingFace下载模型

目录 方式一&#xff1a;网页下载 方式二&#xff1a;Git下载 方式一&#xff1a;网页下载 方式二&#xff1a;Git下载 有些模型的使用方法页面会写git clone的地址&#xff0c;有些没写&#xff0c;直接复制网页地址即可 网页地址&#xff1a; ​https://huggingface.co/…

【matlab】绘制横状双组渐变柱状图

【matlab】绘制横状双组渐变柱状图

xrandr

xrandr xrandr 是用于与 X RandR 扩展进行交互的命令行工具。它允许对 X server 进行实时配置&#xff08;即无需重新启动即可使配置生效&#xff09;&#xff0c;xrandr 提供了显示模式&#xff08;如分辨率、刷新率等&#xff09;的自动检测&#xff0c;以及动态配置输出&am…

阿里云登录镜像仓库报错: Error response from daemon: Get https://

阿里云登录镜像仓库报错: Error response from daemon: Get https:// 1. 故障现象 开发反应自用笔记本连接镜像仓库是正常的,但通过服务器连接镜像仓库一直失败. 报错信息如下: Error response from daemon: Get https://registry.cn-hangzhou.aliyuncs.com/v2/: unauthoriz…