文章目录

  • 一、使用 DexClassLoader 获取组件类失败报错
  • 二、失败原因分析

一、使用 DexClassLoader 获取组件类失败报错


在上一篇博客 【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( DEX 文件准备 | 拷贝资源目录下的文件到内置存储区 | 配置清单文件 | 启动 DEX 文件中的组件 | 执行结果 ) 中 , 尝试启动 DEX 字节码文件中的 Activity 组件 , 出现如下报错信息 :

2021-12-12 01:02:01.431 25158-25158/? E/AndroidRuntime: FATAL EXCEPTION: mainProcess: com.example.classloader_demo, PID: 25158java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.classloader_demo/com.example.dex_demo.MainActivity2}: java.lang.ClassNotFoundException: Didn't find class "com.example.dex_demo.MainActivity2" on path: DexPathList[[zip file "/data/app/com.example.classloader_demo-sAY0kit-c9kqTzgMRXYoBA==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.classloader_demo-sAY0kit-c9kqTzgMRXYoBA==/lib/arm64, /system/lib64]]at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2881)at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3086)at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1816)at android.os.Handler.dispatchMessage(Handler.java:106)at android.os.Looper.loop(Looper.java:193)at android.app.ActivityThread.main(ActivityThread.java:6718)at java.lang.reflect.Method.invoke(Native Method)at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.dex_demo.MainActivity2" on path: DexPathList[[zip file "/data/app/com.example.classloader_demo-sAY0kit-c9kqTzgMRXYoBA==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.classloader_demo-sAY0kit-c9kqTzgMRXYoBA==/lib/arm64, /system/lib64]]at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)at java.lang.ClassLoader.loadClass(ClassLoader.java:379)at java.lang.ClassLoader.loadClass(ClassLoader.java:312)at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:69)at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:45)at android.app.Instrumentation.newActivity(Instrumentation.java:1215)

二、失败原因分析


使用 DexClassLoader 加载普通的类 com.example.dex_demo.DexTest 并执行器 test() 方法 , 是可以执行成功的 ; 但是加载 Activity 组件类失败了 ;

其中的最主要原因是 , 类加载器的双亲委派机制 , 加载 Android 组件类需要使用系统指定的类加载器 , 这些类加载器设置在 LoadedApk 实例对象中 , 并且这些类加载器只能从特定位置加载字节码文件 ;

自己自定义的 DexClassLoader 没有加载组件类的权限 ;

如果要加载组件类 , 有两种方案 :

  • 替换类加载器 : 使用自定义的 DexClassLoader 类加载器替换 ActivityThread 中的 LoadedApk 中的类加载器 , 将原来的 LoadedApk 中的类加载器设置为新的父节点类加载器 ;
  • 插入类加载器 : 基于双亲委派机制 , 只要将我们自定义的类加载器插入到系统类加载器之上就可以 , 在 组件类加载器 和 最顶层的启动类加载器之间插入自定义的 DexClassLoader 类加载器即可 ;

【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( 使用 DexClassLoader 获取组件类失败 | 失败原因分析 | 自定义类加载器没有加载组件类的权限 )相关推荐

  1. 【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( 在 PathClassLoader 和 BootClassLoader 之间插入 DexClassLoader )

    文章目录 前言 一.在 PathClassLoader 和 BootClassLoader 之间插入 DexClassLoader 1.创建 DexClassLoader 2.使用 DexClassL ...

  2. 【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( DEX 文件准备 | 拷贝资源目录下的文件到内置存储区 | 配置清单文件 | 启动 DEX 文件中的组件 | 执行结果 )

    文章目录 一.DEX 字节码文件准备 二.拷贝 Assets 目录下的 classes2.dex 字节码文件到内置存储区 三.在 AndroidManifest.xml 清单文件中配置组件 四.启动 ...

  3. Java中的类加载器(ClassLoader)及类的加载机制

    类加载器就是用来将class文件加载到内存中的一个java类! 系统默认有三个类加载器! ①BootStrap:这不是java类,是java虚拟机在启动的时候加载的第一个类,这个加载器用来加载核心类, ...

  4. 【Android Gradle 插件】DexOptions 配置 ⑤ ( additionalParameters 属性配置 | --minimal-main-dex 参数最小化主 dex 字节码 )

    文章目录 一.dx --minimal-main-dex 参数 1.参数简介 2.配置 main dex 保留文件 3.配置 android#buildTypes 4.配置 android#dexOp ...

  5. Android进阶:十三、自定义类加载器加载加密类文件

    之前面试的时候有许多面试官问类加载器相关的问题,所以这是一个很重要的知识点.而且对于高级Android研发来讲,懂得更多类加载相关的东西,对开发也会有很多的帮助,比如热更新,类加密等. 其实笔者对类加 ...

  6. 【Android 插件化】Hook 插件化框架 ( 创建插件应用 | 拷贝插件 APK | 初始化插件包 | 测试插件 DEX 字节码 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  7. 欧尼酱讲JVM(08)——字节码中方法内部结构的剖析

    用到的工具--Jclasslib IDEA提供了插件,很方便. 首先 先看一段代码: public class LocalVariablesTest {private int count = 0;pu ...

  8. CAD 启动无法加载配置文件,上次任务中保存的某些配置信 cass主框架程序没有加载

    Cad 启动报错 无法加载配置文件,上次任务中保存的某些配置信xxxxx 解决办法: 参考: https://knowledge.autodesk.com/zh-hans/support/autoca ...

  9. 分析JVM双亲委派模型的类加载源码 自定义类加载器

    双亲委派模型下,在父类加载器无法加载的情况下再由当前类加载器去加载.具体的实现逻辑在java.util.ClassLoader抽象类的loadClass方法中.在该方法中,先检查是否已经加载过,如果没 ...

最新文章

  1. 阿里敏捷实践| 4个迭代,从批量交付向持续交付转型
  2. 圣母大学应用计算机数学统计,圣母大学(美国)应用、计算数学与统计学本科专业.pdf...
  3. Opencv——查找并绘制凸包、凸包与轮廓的关系
  4. 【LeetCode】面试题 03. 数组中重复的数字
  5. 获取一些系统和用户的通用属性
  6. 未来机器人背景的AI人工智能PPT模板
  7. PDF附加字体和不附加字体
  8. 2021-02-14金蝶KIS旗舰版从采购订单下推外购入库单使用说明,金蝶盘点机PDA仓库条码管理
  9. 计算机win7卡顿如何解决方法,win7卡顿严重解决方法_win7运行卡顿严重最流畅设置方法-win7之家...
  10. 数字化转型|利用现代技术和通信手段|改变企业为客户创造价值的方式
  11. 唯冠为何赢了苹果却不付律师费
  12. 【Graphene OS】Manifest Syntax文件详解
  13. 扇形面积公式推导过程
  14. LWN:塞满return stack buffer!
  15. coffeescript html5,CoffeeScript语法
  16. 高一计算机函数公式,求高一数学函数所有公式
  17. pytorch基础(九)- 自定义数据集训练模型 和 迁移学习
  18. 计算机ppt培训心得体会,制作ppt学习心得体会
  19. Canvas 画布中坐标系的位置问题(原点确定)
  20. java 生成uuid

热门文章

  1. ubuntu 13.04下MYSQL 5.5环境搭建
  2. 【转帖】详解CSS网页布局中默认字体样式
  3. 用一句sql语句更新两个表并可更新对应的字段的值
  4. 铁乐学python_Day40_进程池
  5. redirect_uri参数错误解决方法
  6. iOS 9 学习系列:UIStack View
  7. 搭建基于域名虚拟主机
  8. 自学python系列10:python的函数和函数式编程
  9. 关于clientWidth、offsetWidth、clientHeight、offsetHeigh
  10. eclipse——jsp字体设置