Android ClassLoader学习

在看android ClassLoader之前,先看Java虚拟机中的ClassLoader:



ClassLoader种类:

    BootClassLoader:和Java虚拟机中的BootstrapClassLoader基本相同,主要加载FrameWork层的文件

    PathClassLoader:和Java虚拟机中的AppClassLoader基本相同,加载已经安装的apk文件的class文件

    DexClassLoader:和CustomClassLoader基本相同,加载指定目录的class文件

    BaseDexClassLoader:是 PathClassLoader和DexClassLoader的父类

测试:



第二的classloader是手机有关的,第一和第三个是一个应用至少用到的classLoader。

特点和作用

双亲代理模型的特点:

在加载一个类前,先看看这个类是否已经加载够,如果没有就看他的父类是否已经加载,都没有加载过的话就完成加载。没有重复加载。

类加载的共享功能(继承加载)
类加载的隔离功能(但两个类的类名和包名和是被同一个ClassLoader加载的,才是同一个类)

ClassLoader源码

类的加载

在ClassLoader中:

protected Class<?> loadClass(String name, boolean resolve)
    throws ClassNotFoundException
{
        // First, check if the class has already been loaded
        Class c = findLoadedClass(name);
        if (c == null) {
            long t0 = System.nanoTime();
            try {
                if (parent != null) {
                    c = parent.loadClass(name, false);
                } else {
                    c = findBootstrapClassOrNull(name);
                }
            } catch (ClassNotFoundException e) {
                // ClassNotFoundException thrown if class not found
                // from the non-null parent class loader
            }

            if (c == null) {
                // If still not found, then invoke findClass in order
                // to find the class.
                long t1 = System.nanoTime();
                c = findClass(name);

                // this is the defining class loader; record the stats
            }
        }
        return c;
}

跳进findClass()中

protected Class<?> findClass(String name) throws ClassNotFoundException {
    throw new ClassNotFoundException(name);
}

发现并没有实现,其实ClassLoader的findClass是交给他的子类实现的

追踪过程,从DexClassLoader->BaseDexClassLoader->findClass()->DexpatchList.findClass()->DexFile.loadClassBinaryName()->defineClass->defineClassNative(),最终是有Native方法来实现的。





Element 是重要的环节


DexFile.loadClassBinaryName()


loadClassBinaryName->defineClass


defineClass->defineClassNative()


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android逆向学习通常是指对Android应用程序进行分析、理解和修改的过程,这对于开发者来说是一个重要的技能,特别是对于深入理解软件工作原理和优化性能有帮助。以下是Android逆向学习的一个基本路线: 1. **基础环境搭建**:首先需要掌握Java语言,因为大部分Android应用是用Java或Kotlin编写的。安装Android Studio开发工具,并配置好模拟器或真机调试环境。 2. **APK分析**:了解如何查看和分析APK文件结构,包括资源文件、Dex字节码和Manifest文件。可以使用如`apktool`这样的工具进行反编译操作。 3. **Dalvik/Dex学习**:学习Android的虚拟机模型 Dalvik 和后来的 ART(Android Runtime),了解其执行过程,包括ClassLoader、Method Resolution等机制。 4. **逆向工具**:熟悉常见的逆向工具有IDA Pro、Jeb、Smali、Procyon等,用于静态分析和动态跟踪。 5. **代码解读**:通过阅读反编译后的Smali代码,理解核心业务逻辑,识别关键函数和数据结构。 6. **框架和库的理解**:研究Android的核心框架(如Activity、Fragment)、第三方库(如RxJava、Volley等)的工作原理。 7. **异常处理和调试**:学习如何利用Android Debug Bridge (ADB) 进行日志查看和远程调试,以便发现和解决问题。 8. **安全相关知识**:了解加固技术(如DEX加密、混淆)以及常见漏洞检测和修复策略。 9. **实践项目**:通过参与实际项目,将理论知识应用于实战,提升逆向能力和解决问题的能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值