安卓运行时
安卓运行时(Android Runtime, ART)是安卓操作系统中专门为应用程序设计的核心运行环境,它负责将应用的Java或Kotlin代码编译成设备可以直接执行的原生指令。与早期的Dalvik虚拟机不同,ART主要采用预先编译(AOT)和即时编译(JIT)相结合的策略,在应用安装或运行时将其DEX字节码高效地转换为本地机器码,从而显著提升了应用的启动速度、运行性能和电池续航。除了执行代码,ART还全面负责内存管理(如垃圾回收GC)、线程调度以及系统服务的交互,是支撑所有安卓应用运行的基石。
顶层总览
flowchart LR
INP["Input 应用字节码"]
LNK["Link 类加载与解析"]
EXE["Exec执行"]
PGO["PGO优化"]
AOT["AOT编译"]
MEM["Memory,GC"]
NAT["Native Code, JNI"]
INP -->|"加载dex"| LNK
LNK -->|"解析,验证"| EXE
EXE <-->|"对象分配,GC"| MEM
EXE -->|"热点触发,OSR"| AOT
EXE -->|"热点计数,画像数据"| PGO
PGO -->|"指导 JIT"| EXE
PGO -->|"指导 dex2oat 编译"| AOT
AOT -->|"产出 oat/odex 与 image"| LNK
AOT -->|"提供 Quick Code 供执行"| EXE
EXE <-->|"JNI 调用"| NAT
执行引擎Exec(执行引擎)
flowchart LR
subgraph "Exec(执行引擎)"
INT["Interpreter(mterp)"]
JIT["JIT Compiler(热点 / OSR)"]
CODEC["Code Cache(已编译代码)"]
QCODE["Quick Code(AOT/JIT)"]
NAT["Native Code(JNI)"]
end
INT -->|"热点阈值 / OSR 触发"| JIT
JIT -->|"编译产物写入"| CODEC -->|"入口桩 / 回边"| QCODE
QCODE -->|"deopt(异常慢路径,去优化)"| INT
INT -->|"JNI 调用"| NAT
QCODE -->|"JNI"| NAT
NAT -->|"返回到解释帧"| INT
NAT -->|"返回到已编译帧"| QCODE
类加载与解析Link(类加载与解析)
flowchart LR
subgraph "Link(类加载与解析)"
CL["ClassLoader 栈"]
DEXF["DexFile(.dex)"]
VDX["vdex校验"]
DEXC["DexCache"]
CLINK["ClassLinker解析连接初始化"]
VERI["Verifier"]
end
DEXF -->|"打开"| CL
VDX -->|"校验"| CL
CL -->|"请求解析"| CLINK
CLINK -->|"填充解析缓存"| DEXC
CLINK -->|"触发验证"| VERI -->|"通过 / 拒绝"| CLINK
AOTdex2oat(编译与镜像)
flowchart LR
subgraph "AOT(编译与镜像)"
D2O["dex2oat(安装期,后台)"]
PROF[PGO 指导]
OAT["Quick Code,元数据"]
IMG["app image / boot image"]
REL["relocation"]
end
PROF -->|"方法选择 / 内联 / 热路径"| D2O
D2O -->|"产出"| OAT
D2O -->|"产出"| IMG
OAT -->|"需要时重定位"| REL
IMG -->|"预热加载(Zygote / App)"| REL
PGO画像与优化闭环
flowchart LR
subgraph "PGO(画像与优化)"
HITS["运行时热点计数 / 采样"]
SAVER["ProfileSaver"]
BASE["baseline profile随APK"]
BOOT["boot profile(系统侧)"]
end
HITS -->|"写入画像数据"| SAVER
SAVER -->|"反馈阈值 / 内联 / OSR 策略"| HITS
SAVER -->|"输入"| D2O["dex2oat"]
BASE -->|"输入"| D2O
BOOT -->|"输入"| D2O
SAVER -->|"动态阈值 / 热点集"| JIT["JIT Compiler"]
内存与 GCMemory(内存 & GC)
flowchart LR
subgraph "Memory(内存 & GC)"
IMGSP["Image Space"]
ZYGSP["Zygote Space(共享)"]
ALOSP["Alloc Space:Ros,碰撞指针"]
LOS["Large Object Space"]
REG["Region Space"]
GC["GC(CC/CMC,读写屏障)"]
end
ALOSP -->|"常规分配"| GC
LOS -->|"大对象跟踪"| GC
REG -->|"并发回收 / 压缩"| GC
ZYGSP -->|"子进程 COW 复用"| IMGSP
Native JNI
flowchart LR
subgraph "Native Code(JNI)"
JNIB["JNI 桥"]
CRIT["Critical Native"]
LIBS[".so 本地库"]
INTR["intrinsics(内建本地实现)"]
end
JNIB -->|"JNIEnv,局部引用"| LIBS
CRIT -->|"绕过部分 JNI 开销(受限)"| LIBS
INTR -->|"被 Quick Code 内联调用"| LIBS