前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Android 逆向】类加载器 ClassLoader ( 加载 Android 组件的类加载器 | 双亲委派机制实例分析 )

【Android 逆向】类加载器 ClassLoader ( 加载 Android 组件的类加载器 | 双亲委派机制实例分析 )

作者头像
韩曙亮
发布于 2023-03-30 01:07:08
发布于 2023-03-30 01:07:08
32100
代码可运行
举报
运行总次数:0
代码可运行

文章目录

一、加载 Android 组件的类加载器


打印 Activity 组件类 的 类加载器 及 该 类加载器 的 父类类加载器 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.example.classloader_demo;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 获取当前 Activity 的 类加载器 ClassLoader
        ClassLoader classLoader = MainActivity.class.getClassLoader();

        // 打印当前 Activity 的 ClassLoader 类加载器
        Log.i(TAG, "MainActivity ClassLoader : " + classLoader);

        // 获取 类加载器 父类
        ClassLoader parentClassLoader = classLoader.getParent();

        // 打印当前 Activity 的 ClassLoader 类加载器 的父类
        Log.i(TAG, "MainActivity Parent ClassLoader : " + parentClassLoader);
    }
}

执行结果 :

日志打印结果 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2021-12-07 19:03:19.295 15050-15050/com.example.classloader_demo 
I/MainActivity: MainActivity ClassLoader : 
dalvik.system.PathClassLoader
[DexPathList[
[zip file "/data/app/com.example.classloader_demo-
wBls1CbThiHbSEKLGKgS7w==/base.apk"],
nativeLibraryDirectories=[/data/app/com.example.classloader_demo-
wBls1CbThiHbSEKLGKgS7w==/lib/arm64, /system/lib64]]]

2021-12-07 19:03:19.295 15050-15050/com.example.classloader_demo 
I/MainActivity: MainActivity Parent ClassLoader : 
java.lang.BootClassLoader@3d6cf66

完整日志 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2021-12-07 19:03:19.295 15050-15050/com.example.classloader_demo I/MainActivity: MainActivity ClassLoader : dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.example.classloader_demo-wBls1CbThiHbSEKLGKgS7w==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.classloader_demo-wBls1CbThiHbSEKLGKgS7w==/lib/arm64, /system/lib64]]]
2021-12-07 19:03:19.295 15050-15050/com.example.classloader_demo I/MainActivity: MainActivity Parent ClassLoader : java.lang.BootClassLoader@3d6cf66

二、加载 Android 组件的类的双亲委派机制实例


Activity 类加载分析 :

Activity 组件类的类加载器是 dalvik.system.PathClassLoader ,

dalvik.system.PathClassLoader 类加载器的 父类节点是 java.lang.BootClassLoader 类加载器 ,

java.lang.BootClassLoader 是根节点的 类加载器 ;

双亲委派机制 :

在双亲委派机制中 , 类加载任务 , 先被分配给 PathClassLoader , PathClassLoader 不处理 , 将任务委派给父类节点 BootClassLoader;

BootClassLoader 是根节点的类加载器 , 其尝试加载 Activity 类 , 发现加载不了 , 没有这个能力 , 然后 BootClassLoader 将任务 委派给子节点 PathClassLoader , PathClassLoader 尝试加载 Activity 类 , 加载成功 , 返回该类 ;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-12-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Android 插件化】插件化原理 ( 类加载器 )
【Android 插件化】插件化简介 ( 组件化与插件化 ) 【Android 插件化】插件化原理 ( JVM 内存数据 | 类加载流程 ) 【Android 插件化】插件化原理 ( 类加载器 ) 【Android 插件化】“ 插桩式 “ 插件化框架 ( 原理与实现思路 ) 【Android 插件化】“ 插桩式 “ 插件化框架 ( 类加载器创建 | 资源加载 ) 【Android 插件化】“ 插桩式 “ 插件化框架 ( 注入上下文的使用 ) 【Android 插件化】“ 插桩式 “ 插件化框架 ( 获取插件入口 Activity 组件 | 加载插件 Resources 资源 ) 【Android 插件化】“ 插桩式 “ 插件化框架 ( 运行应用 | 代码整理 )
韩曙亮
2023/03/29
6500
【Android 插件化】插件化原理 ( 类加载器 )
【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( 使用 DexClassLoader 获取组件类失败 | 失败原因分析 | 自定义类加载器没有加载组件类的权限 )
在上一篇博客 【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( DEX 文件准备 | 拷贝资源目录下的文件到内置存储区 | 配置清单文件 | 启动 DEX 文件中的组件 | 执行结果 ) 中 , 尝试启动 DEX 字节码文件中的 Activity 组件 , 出现如下报错信息 :
韩曙亮
2023/03/30
1.2K0
【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( 使用 DexClassLoader 获取组件类失败 | 失败原因分析 | 自定义类加载器没有加载组件类的权限 )
【Android 逆向】类加载器 ClassLoader ( 使用 DexClassLoader 动态加载字节码文件 | 拷贝 DEX 文件到内置存储 | 加载并执行 DEX 字节码文件 )
在 【Android 逆向】类加载器 ClassLoader ( 使用 DexClassLoader 动态加载字节码文件 | 准备 DEX 字节码文件 ) 博客中 , 准备了 classes.dex 字节码文件 , 将字节码文件拷贝到了 将 app\src\main\assets\classes.dex 目录中 ;
韩曙亮
2023/03/30
9700
【Android 逆向】类加载器 ClassLoader ( 使用 DexClassLoader 动态加载字节码文件 | 拷贝 DEX 文件到内置存储 | 加载并执行 DEX 字节码文件 )
Android解析ClassLoader(二)Android中的ClassLoader
前言 在上一篇文章我们学习了Java的ClassLoader,很多同学会把Java和Android的ClassLoader搞混,甚至会认为Android中的ClassLoader和Java中的ClassLoader是一样的,这显然是不对的。这一篇文章我们就来学习Android中的ClassLoader,来看看它和Java中的ClassLoader有何不同。 1.ClassLoader的类型 我们知道Java中的ClassLoader可以加载jar文件和Class文件(本质是加载Class文件),这一点在A
用户1269200
2018/02/01
1.4K0
Android解析ClassLoader(二)Android中的ClassLoader
【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( 替换 LoadedApk 中的类加载器 | 加载 DEX 文件中的 Activity 类并启动成功 )
在 上一篇博客 【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( DEX 文件准备 | 拷贝资源目录下的文件到内置存储区 | 配置清单文件 | 启动 DEX 文件中的组件 | 执行结果 ) 的代码基础上 , 使用类加载器加载 com.example.dex_demo.MainActivity2 组件前 , 先替换 LoadedApk 的类加载器 , 就可以成功加载 DEX 文件了 , 该操作类似于热修复 ;
韩曙亮
2023/03/30
1.8K0
【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( 替换 LoadedApk 中的类加载器 | 加载 DEX 文件中的 Activity 类并启动成功 )
【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( 在 PathClassLoader 和 BootClassLoader 之间插入 DexClassLoader )
在 上一篇博客 【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( 替换 LoadedApk 中的类加载器 | 加载 DEX 文件中的 Activity 类并启动成功 ) 中 , 通过 替换 LoadedApk 中的类加载器可以成功加载 DEX 字节码文件中的 Activity 类 , 并成功启动 Activity ;
韩曙亮
2023/03/30
1.3K0
【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( 在 PathClassLoader 和 BootClassLoader 之间插入 DexClassLoader )
Android中的ClassLoader分析
Dalvik是Google公司自己设计用于Android平台的Java虚拟机。它可以支持已转换为.dex(即Dalvik Executable)格式的Java应用程序的运行,.dex格式是专为Dalvik设计的一种压缩格式,可以减少整体文件尺寸,提高I/o操作的类查找速度所以适合内存和处理器速度有限的系统。
g小志
2018/09/11
9830
Android中的ClassLoader分析
ClassLoader解析(二):Android中的ClassLoader
main方法时ZygoteInit入口方法,其中调用了ZygoteInit的preload方法,preload方法中又调用了ZygoteInit的preloadClasses方法。
用户1205080
2019/01/23
1.5K0
ClassLoader解析(二):Android中的ClassLoader
【Android 逆向】类加载器 ClassLoader ( 类加载器源码简介 | BaseDexClassLoader | DexClassLoader | PathClassLoader )
ClassLoader 抽象类中的 private final ClassLoader parent 成员 , 用于实现双亲委派机制 , 所有的 ClassLoader 子类 , 如 PathClassLoader , DexClassLoader 等类加载器 , 都会存在一个 ClassLoader parent 成员 , 用于表示该 类加载器 的父节点 是哪个 类加载器 ;
韩曙亮
2023/03/30
1.1K0
Android插件化学习之路(二)之ClassLoader完全解析
Java代码都是写在Class里面的,程序运行在虚拟机上时,虚拟机需要把需要的Class加载进来才能创建实例对象并工作,而完成这一个加载工作的角色就是ClassLoader。
老马的编程之旅
2022/06/22
5890
Android类加载之双亲委派机制
我们定义一个CustomClassLoader加载器,去加载String.class文件的流程如下:
码农帮派
2021/02/25
1.7K0
Android类加载之双亲委派机制
【Java 虚拟机原理】Android 类加载机制 ( 双亲委派机制 | BootClassLoader | PathClassLoader | DexClassLoader )
个类加载器 , BootClassLoader , PathClassLoader , DexClassLoader ;
韩曙亮
2023/03/29
7400
【Java 虚拟机原理】Android 类加载机制 ( 双亲委派机制 | BootClassLoader | PathClassLoader | DexClassLoader )
【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( DEX 文件准备 | 拷贝资源目录下的文件到内置存储区 | 配置清单文件 | 启动 DEX 文件中的组件 | 执行结果 )
在 dex_demo 应用 Module 中 , 创建 com.example.dex_demo.MainActivity2 类 ;
韩曙亮
2023/03/30
7600
【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( DEX 文件准备 | 拷贝资源目录下的文件到内置存储区 | 配置清单文件 | 启动 DEX 文件中的组件 | 执行结果 )
Android ClassLoader详解
我们知道不管是插件化还是组件化,都是基于系统的ClassLoader来设计的。只不过Android平台上虚拟机运行的是Dex字节码,一种对class文件优化的产物,传统Class文件是一个Java源码
xiangzhihong
2018/02/05
1.4K0
Android ClassLoader详解
【Android 逆向】类加载器 ClassLoader ( Android 的八种类加载器 | ClassLoader | BaseDexClassLoader | DexClassLoader )
ClassLoader 是抽象类 , 是所有 类加载器 ClassLoader 的父类 ;
韩曙亮
2023/03/30
1K0
【Android 逆向】类加载器 ClassLoader ( Android 的八种类加载器 | ClassLoader | BaseDexClassLoader | DexClassLoader )
ClassLoader 类加载器
  C/C++代码实现的加载器,用于加载指定的JDK的核心类库,比如java.lang.、java.uti.等这些系统类。Java虚拟机的启动就是通过Bootstrap ClassLoader创建一个初始类来完成的。
用户3112896
2019/09/26
8950
Android旁门左道之动态替换应用程序
本文讨论了Android类加载器的两种分类,以及它们的区别和联系。作者详细介绍了双亲委托模型以及自定义类加载器的工作原理。通过示例代码,作者展示了如何通过自定义类加载器解决一些类加载器无法解决的问题,包括动态替换系统类、实现自定义视图、以及解决一些系统类加载器带来的问题。
MelonTeam
2018/01/04
2.3K2
Android旁门左道之动态替换应用程序
Android类加载之PathClassLoader和DexClassLoader
任何结论在没有经过实际检验之前都不能够确定一定没问题。三年前写的文章回过头来发现有些部分内容是有问题的(PS:这的确比较尴尬),再次对结果进行验证之后重新修改了之前的结论。幸亏文章阅读量不是很多,希望被误导的同学能够在其他地方得到正确结论。
静默加载
2020/05/29
2.6K0
类加载器与双亲委派模型1 类加载器 2 双亲委派模型
类加载器(ClassLoader)是Java语言的一项创新,也是Java流行的一个重要原因。 在类加载的第一阶段“加载”过程中,需要通过一个类的全限定名来获取定义此类的二进制字节流,完成这个动作的代码块就是类加载器。这一动作是放在Java虚拟机外部去实现的,以便让应用程序自己决定如何获取所需的类。
JavaEdge
2018/09/20
6180
类加载器与双亲委派模型1  类加载器
2 双亲委派模型
类加载器ClassLoader
上篇文章说到,Class类可以通过一个类的全限定名去加载类,那么底层是如何去加载的呢?这就是我们今天要聊的类加载器ClassLoader,其可以通过一个类的全限定名来获取描述此类的二进制字节流,也即是将编译过后的Class文件加载到内存中。
Liusy
2020/09/01
7720
类加载器ClassLoader
推荐阅读
【Android 插件化】插件化原理 ( 类加载器 )
6500
【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( 使用 DexClassLoader 获取组件类失败 | 失败原因分析 | 自定义类加载器没有加载组件类的权限 )
1.2K0
【Android 逆向】类加载器 ClassLoader ( 使用 DexClassLoader 动态加载字节码文件 | 拷贝 DEX 文件到内置存储 | 加载并执行 DEX 字节码文件 )
9700
Android解析ClassLoader(二)Android中的ClassLoader
1.4K0
【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( 替换 LoadedApk 中的类加载器 | 加载 DEX 文件中的 Activity 类并启动成功 )
1.8K0
【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( 在 PathClassLoader 和 BootClassLoader 之间插入 DexClassLoader )
1.3K0
Android中的ClassLoader分析
9830
ClassLoader解析(二):Android中的ClassLoader
1.5K0
【Android 逆向】类加载器 ClassLoader ( 类加载器源码简介 | BaseDexClassLoader | DexClassLoader | PathClassLoader )
1.1K0
Android插件化学习之路(二)之ClassLoader完全解析
5890
Android类加载之双亲委派机制
1.7K0
【Java 虚拟机原理】Android 类加载机制 ( 双亲委派机制 | BootClassLoader | PathClassLoader | DexClassLoader )
7400
【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( DEX 文件准备 | 拷贝资源目录下的文件到内置存储区 | 配置清单文件 | 启动 DEX 文件中的组件 | 执行结果 )
7600
Android ClassLoader详解
1.4K0
【Android 逆向】类加载器 ClassLoader ( Android 的八种类加载器 | ClassLoader | BaseDexClassLoader | DexClassLoader )
1K0
ClassLoader 类加载器
8950
Android旁门左道之动态替换应用程序
2.3K2
Android类加载之PathClassLoader和DexClassLoader
2.6K0
类加载器与双亲委派模型1 类加载器 2 双亲委派模型
6180
类加载器ClassLoader
7720
相关推荐
【Android 插件化】插件化原理 ( 类加载器 )
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档