Dalvik

Dalvik 字节码
JVM 基于栈架构,程序run时频繁栈上读写数据,耗费CPU时间 \(Java\;\xrightarrow{\mathrm{javac 编译}}.class\)
\[JVM\xrightarrow{\mathrm{解码}.class}run\;Java\;program\]Dalvik 虚拟机基于寄存器架构
\[Java\;\xrightarrow{android\;sdk/dx}.dex(Dalvik\;Executable)\]dex 反编译得到.smali
dex 优化体积

Dalvik 指令
寄存器

字节码类型

方法

1 | |
.method public onResume()V
.locals 0
.line 485
invoke-super {p0}, Lcom/awesapp/isafe/core/ToolbarActivity;->onResume()V
.line 486
invoke-direct {p0}, Lcom/awesapp/isafe/core/MainActivity;->n()V
.line 487
invoke-direct {p0}, Lcom/awesapp/isafe/core/MainActivity;->m()V
return-void
.end method

字段

1 | |
1 | |

nop

move

return

const

操作指令

数组指令

异常

跳转
goto

switch

if

字段操作

方法调用

运算

内部类 xx$xx

ART
Andorid 5才开始使用的虚拟机,兼容Dalvik的特性。AOT(ahead of time)特性:安装APK时候将dex转换成ART使用的机器码。ART将dex转成oat文件。天生支持多dex,可以省略合包过程。加快APP冷启动速度。
JVM::运行的是.java编译后的.class文件
Dalvik:
- 打包过程中.java通过javac编译后的.class文件。
- 但是Dalvik只执行dex文件,dx将.class文件转换.dex
- 启动时候:.dex转换成可快速运行的机器码,multi dex还需要合包,所以启动慢
分区

data分区

system分区
