使用DexClassLoader类动态加载插件dex

DexClassLoader类的源码

package dalvik.system;public class DexClassLoader extends BaseDexClassLoader {public DexClassLoader(String dexPath, String optimizedDirectory,String librarySearchPath, ClassLoader parent) {super(dexPath, null, librarySearchPath, parent);}
}

DexClassLoader类构造方法参数:

  • String dexPath:指定了 .dex 文件的路径。
  • String optimizedDirectory:指定了优化后的 .dex 文件存放的目录。在 Android 系统中,为了提高应用的启动速度和运行效率,会对 .dex 文件进行优化,生成 .odex 文件。这个参数就是用来指定优化后的 .odex 文件存放的位置。
  • String librarySearchPath:指定了系统库文件的搜索路径。
  • ClassLoader parent:指定了父类加载器。

编写插件加载dex中的类,并调用其中的函数

PluginDex01

新建一个native工程PluginDex01
创建一个类

public class PluginClass {public static void testMethod(){Log.e("plugindex","testMethod is called");}
}

然后编译生成apk(Build apk),然后提取apk
在这里插入图片描述
这里生成了四个dex文件,查看他们的内容找到有testMethod函数的dex文件
通过jadx反编译dex找到在class3.dex
在这里插入图片描述
class3.dex改名为plugin.dex,然后通过adb把它push到/data/local/tmp目录下

在这里插入图片描述

PluginDex02

新建一个工程PluginDex02,用来加载dex中的PluginClass类并调用testMethod函数
首先需要在AndroidManifest.xml中添加sdcard读取权限
在这里插入图片描述
编写代码加载plugin.dex并调用testMethod函数

        String dexpath = "/data/local/tmp/plugin.dex";  // dex路径DexClassLoader dexClassLoader = new DexClassLoader(dexpath,this.getApplication().getCacheDir().getAbsolutePath(),null,MainActivity.class.getClassLoader());try {Class PluginClass = dexClassLoader.loadClass("com.example.plugindex01.PluginClass"); // 加载类Log.e("PluginDex02",dexClassLoader.toString()+"---"+PluginClass.toString());Method testMethod = PluginClass.getMethod("testMethod");testMethod.invoke(null);} catch (ClassNotFoundException e) {throw new RuntimeException(e);} catch (NoSuchMethodException e) {throw new RuntimeException(e);} catch (InvocationTargetException e) {throw new RuntimeException(e);} catch (IllegalAccessException e) {throw new RuntimeException(e);}

在这里插入图片描述

  • 打印dexClassLoader的父类加载器
    printClassLoader(dexClassLoader);
    在这里插入图片描述

    this->dalvik.system.DexClassLoader[DexPathList[[dex file "/data/local/tmp/plugin.dex"],nativeLibraryDirectories=[/system/lib64]]]
    parent->dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.example.plugindex02-GQcsk_5ktyHhY_g_qUMA-A==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.plugindex02-GQcsk_5ktyHhY_g_qUMA-A==/lib/arm64, /data/app/com.example.plugindex02-GQcsk_5ktyHhY_g_qUMA-A==/base.apk!/lib/arm64-v8a, /system/lib64]]]
    parent->java.lang.BootClassLoader@84d413c
    parent is null
    

    dexClassLoader的类加载器是DexClassLoader,父类加载器是PathClassLoader,再往上是BootClassLoader,再往上就是空了

  • 把dexClassLoader里的父类加载器修改为String类的类加载器
    只需要在DexClassLoader类的构造方法里把最后一个参数父类加载器修改为String类的类加载器即可

            String dexpath = "/data/local/tmp/plugin.dex";  // dex路径DexClassLoader dexClassLoader = new DexClassLoader(dexpath,this.getApplication().getCacheDir().getAbsolutePath(),null,String.class.getClassLoader());
    

    打印结果
    在这里插入图片描述
    dexClassLoader的父类加载器变成了BootClassLoader

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

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

相关文章

国产服务器部署1.获取银河麒麟V10服务器。首先挂gpt数据盘

要做系统国产化,现记录国产化的全过程:银河麒麟V10采用ARM架构,基于Ubuntu 18.04 LTS版本的Linux操作系统。‌‌ #uname -r 看系统是x86还是arm 1.获取银河麒麟V10服务器。首先挂数据盘。 1)#lsblk -f vdb为数据盘。需要格式…

Excel:vba实现插入图片

实现的效果: 实现的代码: Sub InsertImageNamesAndPictures()Dim PicPath As StringDim PicName As StringDim PicFullPath As StringDim RowNum As IntegerDim Pic As ObjectDim Name As String 防止表格里面有脏数据Cells.Clear 遍历工作表中的每个图…

性能测试需求分析详解

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 1、客户方提出 客户方能提出明确的性能需求,说明对方很重视性能测试,这样的企业一般是金融、电信、银行、医疗器械等;他们一…

机器学习之fetch_olivetti_faces人脸识别--基于Python实现

fetch_olivetti_faces 数据集下载 fetch_olivetti_faceshttps://github.com/jikechao/olivettifaces sklearn.datasets.fetch_olivetti_faces(*, data_homeNone, shuffleFalse, random_state0, download_if_missingTrue, return_X_yFalse, n_retries3, delay1.0)[source] L…

智能离线语音识别不灵敏?如何改善和提升识别率?

前言 有用户反馈离线语音识别不灵敏,跟着笔者一起分析原因吧。笔者知识能力有限,难免会误,还请大家批评指正。 1 影响离线语音识别的因素 笔者分析离线语音识别不灵敏的原因有以下几点 1.1 运行硬件的算力限制 由于离线语音识别在本地MCU…

人工智能在干部选拔任用中的应用研究

干部选拔任用是关系到党和国家事业发展的重要环节。在当今科技飞速发展的时代,人工智能技术的出现为干部选拔任用提供了新的思路和方法。人工智能以其强大的数据处理能力、精准的分析预测能力和高效的决策支持能力,有望在干部选拔任用中发挥重要作用。 …

Grandle 报错_项目无法编译问题解决

文章目录 AndroidStudio 编译遇到的问题Gradle 报错-无法编译需要解决的问题说明AS 与 AGP 版本对应不同平台AS版本及下载地址gradle 无法下载 和 找不到使用腾讯镜像gradle-wrapper.properties 文件找不到 依赖库无法下载,下载速度慢更换阿里镜像仓库阿里仓库镜像下…

C++ 实现俄罗斯方块游戏

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

JS进阶级案例-----时钟

首先呢&#xff0c;是由四张图片构成&#xff0c;使用css摆放好&#xff0c;再使用JS给三个指针绑定获取时间和要旋转的角度&#xff0c;在获取对应的指针元素&#xff0c;给到定时器&#xff0c;实现时钟动态更新。 <!DOCTYPE html> <html lang"en"> &…

【前端基础】HTML 基础

目标&#xff1a;掌握标签基本语法&#xff0c;能够独立布局文章页。 核心技术点 网页组成 排版标签 多媒体标签及属性 综合案例一 - 个人简介 综合案例二 - Vue 简介 02-标签语法 HTML 超文本标记语言——HyperText Markup Language。 超文本&#xff1a;链接标记&a…

UE5相机系统初探(一)

UE5相机系统初探&#xff08;一&#xff09; 和Unity类似&#xff0c;UE的相机也是由名为Camera的component控制的。那么&#xff0c;在UE中要如何实现一个跟随玩家的第三人称相机呢&#xff1f;假设我们已经有了一个表示玩家的类ACF_Character&#xff0c;首先第一步就是要先在…

数据库->联合查询

目录 一、联合查询 1.联合查询 2.多表联合查询时MYSQL内部是如何进⾏计算的 3.多表联合查询 3.1语法 3.2指定多个表&#xff0c;进行联合查询 3.3通过表与表中的链接条件过滤掉无效数据 3.4通过指定列查询&#xff0c;精简查询结果​编辑 3.5可以通过给表起别名的方式&…

有关《WebGIS开发 从入门到实践》的分享

从30号发布了新书的上架消息之后&#xff0c;已有不少的朋友、学生下单购买了&#xff0c;有部分已经收到了书了&#xff0c;收到书大致翻阅后也第一时间向我进行了反馈。本文结合我在写本书时的思考和收到的大家反馈&#xff0c;给大家介绍一下我们花了三年写完出的《WebGIS开…

YOLO——yolo v4(2)

文章目录 一、损失函数改进1.GIOU损失2.DIOU损失3.CIOU损失 二、非极大值抑制 YOLOv4是一种先进的目标检测算法&#xff0c;它在YOLO系列的基础上进行了多项改进和优化。 一、损失函数改进 IOU损失表示预测框A和真实框B之间交并比的差值&#xff0c;反映预测检测框的检测效果。…

网络请求优化:理论与实践

文章目录 引言1. DNS 解析耗时因素优化措施扩展阅读 2. 创建连接耗时因素优化措施扩展阅读 3. 发送 / 接收数据耗时因素优化措施扩展阅读 4. 关闭连接耗时因素优化措施扩展阅读 总结 引言 网络请求的性能会直接影响到用户体验。本文将探讨网络请求的各个步骤&#xff0c;以及如…

R语言结构方程模型(SEM)

原文链接&#xff1a;R语言结构方程模型&#xff08;SEM&#xff09;https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247624956&idx4&sn295580a016a86cfee8ee2277c93e32d5&chksmfa8da91bcdfa200da897f1f267492039865bdfe5d75a1c6e6df92ff5005e0eb5cc33a…

android数组控件Textview

说明&#xff1a;android循环控件&#xff0c;注册和显示内容 效果图&#xff1a; step1: E:\projectgood\resget\demozz\IosDialogDemo-main\app\src\main\java\com\example\iosdialogdemo\TimerActivity.java package com.example.iosdialogdemo;import android.os.Bundl…

GA/T1400视图库平台EasyCVR视频分析设备平台微信H5小程序:智能视频监控的新篇章

GA/T1400视图库平台EasyCVR是一款综合性的视频管理工具&#xff0c;它兼容Windows、Linux&#xff08;包括CentOS和Ubuntu&#xff09;以及国产操作系统。这个平台不仅能够接入多种协议&#xff0c;还能将不同格式的视频数据统一转换为标准化的视频流&#xff0c;通过无需插件的…

【机器学习】26. 聚类评估方法

聚类评估方法 1. Unsupervised Measure1.1. Method 1: measure cohesion and separationSilhouette coefficient Method 2&#xff1a;Correlation between two similarity matricesMethod 3&#xff1a;Visual Inspection of similarity matrix 2. Supervised measures3. 决定…

不适合的学习方法

文章目录 不适合的学习方法1. 纯粹死记硬背2. 过度依赖单一资料3. 线性学习4. 被动学习5. 一次性学习6. 忽视实践7. 缺乏目标导向8. 过度依赖技术9. 忽视个人学习风格10. 过于频繁的切换 结论 以下是关于不适合的学习方法的更详细描述&#xff0c;包括额外的内容和相关公式&…