文章目录
一、动态字节码技术
二、Dalvik & ART 虚拟机
三、Android 字节码打包过程
总结
一、动态字节码技术
动态字节码技术 就是在 运行时 , 动态修改 Class 字节码 数据 ;
如 : 修改下面字节码文件中的二进制数据信息 ;
动态字节码技术实现 :
首先 , 要 分析整个 Class 字节码中的信息 ;
然后 , 找到要修改的字节码 数据位置 ;
最后 , 替换对应的二进制数据 ;
常用的动态字节码技术 :
Javassist : 创建 / 分析 / 编辑 Java 字节码文件 ;
ASM : 操作 / 分析 Java 字节码文件 ;
使用 Javassist 框架 , 可以自动查找要修改的内容所在字节码文件中的位置 , 不需要开发者自己手动分析 Java 字节码文件 ;
二、Dalvik & ART 虚拟机
Android 5.0 5.05.0 之前使用 Dalvik 虚拟机 . 5.0 5.05.0 之后使用 ART 虚拟机 ;
Dalvik 已经被淘汰 , 目前重点学习 ART 即可 ;
JVM 与 Dalvik 虚拟机区别 :
JVM 是基于栈的 ; 打包后的字节码文件是 jar 文件 ;
Dalvik 是基于寄存器的 ; 打包后的字节码文件是 dex 文件 ; 程序在 CPU 上运行 , 通过执行寄存器上的指令对数据进行操作 ;
jar 文件与 dex 文件 对比图 :
JVM 中有 JIT 即时编译器 , 代码在运行时 , 边解释 , 边运行 , 如果有一段代码经常运行 , 则可以通过 JIT 即时编译器 提前准备 ,
三、Android 字节码打包过程
Android 源码打包成安装文件 , 安装到设备中 , 最后执行应用程序 , 期间的各种执行细节 ;
编写好 Java 源码文件 ;
使用 javac 工具 , 将 Java 源码编译成 class 字节码文件 ;
使用 dx 工具 , 将 class 字节码文件打包到 dex 文件中 ;
通过 APK Builder 将 dex 文件 / 资源文件 / AIDL 文件 / SO 动态库 等 , 打包到 APK 安装包中 ;
总结
推荐书籍 :
深入理解Java虚拟机
深入理解Android 虚拟机