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分区