Dalvik汇编语言
Dalvik虚拟机 JIT(即时编译)
JIT (Just-in-time Compilation,即时编译),又称为动态编译,是一种通过在运行时将字节码翻译为机器码的技术,使得程序的执行速度更快。Android 2.2版本系统的Dalvik虚拟机引入了JIT 技术,官方宣称新版的Dalvik 虚拟机比以往执行速度快3~6倍。
两种字节码编译方式
- method方式: 函数或者访问为单位进行编译
- trace方式:以trace为单位进行编译
method方式很好理解,那什么是trace方式呢?在函数中一般很少是顺序执行代码的,多数的代码都分成了好几条执行路径,其中函数的有些路径在实际运行过程中是很少被执行的,这部分路径被称为“冷路径”,而执行比较频繁的路径被称为“热路径”。采用传统的method 方式会编译整个方法的代码,这会使得在“冷路径”上浪费很多编译时间,并且耗费更多的内存;trace方式编译则能够快速地获取“热路径”代码,使用更短的时间与更少的内存来编译代码。
目前,Dalvik 虚拟机默认采用trace方式编译代码,同时也支持采用method方式来编译。
dalvik汇编
Dalvik 虚拟机为自己专门设计了一套指令集,并且制定了自己的指令格式与调用规范。我们将 Dalvik指令集组成的代码称为Dalvik汇编代码,将这种代码表示的语言称为Dalvik汇编语言
Dalvik指令格式
- 每16位的字采用空格分隔开来。
- 每个字母表示四位,每个字母按顺序从高字节开始,排列到低字节。每四位之间可能使用竖线“”来表示不同的内容。
- 顺序采用A~Z的单个大写字母作为一个4位的操作码, op表示一个8位的操作码。
指令集
空指令:nop
move
return
const
monitor
check
array
throw
goto if-..
cmpl-type
iget iput sget sput
invoke
unop
binop
Dalvik的hello world
编写smali语法来编写一段Dalvik的指令集
新建一个hello.smali,类程序框架:
在 .porlogue下面写入
编译他smali文件,使用smali.jar
java -jar smali.jar -o class.dex hello.smali
dex为可执行文件
运行
adb push Hello.zip /data/local/
adb shell dalvikvm -cp /data/local/Hello.zip HelloWorld