Android——简单易懂说原理之ClassLoader与热修复原理

本文深入探讨了Android的ClassLoader与Java的区别,重点介绍了Android的ClassLoader类型和加载过程,包括BootClassLoader、DexClassLoader和PathClassLoader。此外,文章详细讲解了Android热修复原理,涉及资源修复、代码修复和动态链接库修复技术,阐述了类加载方案、底层替换方案和Instant Run方案在修复中的应用。
摘要由CSDN通过智能技术生成

写在前面:终于写到热修复原理了,在阅读本文之前最好能有点JNI和JVM基础,相关的文章挺多的,我就不写了,不过我也会尽量将相关的知识穿插进来,减少学习成本。

一、Android ClassLoader

一、java中的ClassLoader与Android中的ClassLoader

Android的ClassLoader和Java的ClassLoader不同,它加载的不是Class文件,而是dex文件。这是因为在Java SE程序中,Java类被编译成.class文件,并且打包成jar文件,之后JVM会通过相应的.class文件和jar文件获得相应的字节码,因此执行顺序为:.java->.class->jar;而在Android使用的无论是Dalvik还是ART(Android4.4发布),都是会用dx工具将所有的.class文件转换为一个.dex文件,然后Android虚拟机再从这个.dex文件中读取指令和数据,因此执行顺序为:.java->.class->.dex。
也就是说,.jar文件里包含多个.class文件,每个.class文件里又包含了该类的常量池、类信息、属性等,当JVM加载该.jar的时候,会加载里面所有的.class文件,如下图所示:
在这里插入图片描述
因此这就出现了一个问题,因为是.class文件一个一个加载的,所以就会很慢,因此这对于内存有限的移动设备并不合适。再来看我们的.apk文件,一个.apk里面只包含了一个.dex文件,并且这个.dex文件把所有.class里面包含的信息都整合在了一起,这样便加快了加载速度。.apk文件结构如下图所示:
在这里插入图片描述
另外,Android中每一个应用都运行在一个Android虚拟机实例中,每一个Android虚拟机实例都运行在一个独立的进程空间中,这样因为有了独立的进程,就可以防止在虚拟机崩溃的时候所有的程序都被关闭。这个Android虚拟机实例是由Android虚拟机进程Zygote在创建应用程序进程时通过fock自身,快速地创建和初始化出来的,以便应用于应用程序的运行。对于一些只读的系统库,所有的Android虚拟机实例都会和Zygote共享一块内存区域,这样就可以节省内存开销了。关于Zygote,可以参考前文Android系统启动流程

二、Android中的ClassLoader类型与继承关系

Android中的ClassLoader类型分为两种类型,分别为系统类加载器和自定义加载器,其中系统类加载器主要包括以下三种:BootClassLoader、DexClassLoader以及PathClassLoader。

  • BootClassLoader:是在Zygote进程的Zygote入口方法中被创建的,Android系统启动时会使用BootClassLoader来预加载常用类。BootClassLoader是ClassLoader的内部类,且继承自Clas
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值