2.2.1 虚拟机
(1)Java虚拟机
java字节码
基于栈架构
(2)Dalvik虚拟机(jit机制)
Android 5.0以下
dalvik字节码
dalvik可执行文件体积更小
基于寄存器架构
(3)ART虚拟机
Android 5.0版本及以上
2.2.2 Dalvik字节码
dalvik指令格式
dex文件反汇编工具
smali.jar\ddx.jar
了解dalvik寄存器
dalvik中的寄存器都是32位
寄存器之v命名法与p命名法
局部变量寄存器
参数寄存器
dalvik字节码
类型
smali==>Java
V void
Z boolean
B byte
S short
C char
I int
J long 重点
F float
D double
L java类类型 重点
[ 数组类型
字段
Lpackage/name/ObjectName;->FieldName:Ljava/lang/String;
方法
Lpackage/name/ObjectName;->MethodName(III)Z
2.2.3 Dalvik指令集
基础字节码-名称后缀/字节码后缀 目的寄存器 源寄存器
名称后缀是wide,表示数据宽度为64位
字节码后缀是from16,表示源寄存器为16位
空操作指令
nop
数据操作指令
move(-wide/-object/-result/-result-object/-result-wide/-exception)
move(-wide/-object)/from16
move(-object)/16
返回指令(重点)
return-void(表示方法的放回值为空)
return(表示方法的放回值为32位非对象类型的值)
return-wide(表示方法的放回值为64位非对象类型的值)
return-object(表示方法的放回值为对象类型的值)
数据定义指令(重点)
const(-wide/-string/-class)
const/4
const(-wide)/16
const(-wide)/32
const(-wide)/high16
锁指令
monitor
实例操作指令
check-cast(类型转换)
instance-of(检查)
new-instance(新建)
数组操作指令
array-length(获取数组长度)
new-array(新建数组)
filled-new-array(定义数组并初始化)
filled-new-array/range(定义数组并初始化/指定取值范围)
filled-array-data(数组元素取值与赋值)
异常指令(throw)
跳转指令(重点)
goto
packed-switch(有规律)、sparse-switch(无规律)
if-eq(等于)/if-ne(不等于)
if-lt(小于)/if-le(小于等于)
if-gt(大于)/if-ge(大于等于)
比较指令(cmp)
大于(1)/等于(0)/小于(-1)=>cmpg、cmp
大于(-1)/等于(0)/小于(1)=>cmpl
字段操作指令
普通字段=>iget(读)/iput(写)
静态字段=>sget(读)/sput(写)
方法调用指令(重点)
invoke-virtual(调用实例的虚方法)
invoke-super(调用实例的父类/基类方法)
invoke-direct(调用实例的直接方法)
invoke-static(调用实例的静态方法)
invoke-interface(调用实例的接口方法)
数据转换指令
neg-数据类型=>求补
not-数据类型=>求反
数据类型1-to-数据类型2=>将数据类型1转换为数据类型2
数据运算指令
add/sub/mul/div/rem 加/减/乘/除/模
and/or/xor 与/或/非
sh1/shr/ushr 有符号左移/有符号右移/无符号右移
2.2.4 smali汇编
.class public LHelloWorld;
.super Ljava/lang/Object;
.method public static main([Ljava/lang/String;)V
.registers 4
.parameter
.prologue
#空指令
nop
nop
nop
nop
#数据定义指令
const/16 v0, 0x8
const/4 v1, 0x5
const/4 v2, 0x3
#数据操作指令
move v1, v2
#数组操作指令
new-array v0, v0, [I
array-length v1, v0
#实例操作指令
new-instance v1, Ljava/lang/StringBuilder;
#方法调用指令
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
#跳转指令
if-nez v0, :cond_0
goto :goto_0
:cond_0
#数据转换指令
int-to-float v2, v2
#数据运算指令
add-float v2, v2, v2
#比较指令
cmpl-float v0, v2, v2
#字段操作指令
sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
const-string v1, "Hello World" #构造字符串
#方法调用指令
invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
#返回指令
:goto_0
return-void
.end method