Android 系統(tǒng)自 5.0(Lollipop)起全面采用 ART(Android Runtime) 替代了早期Android 系統(tǒng)4.4以前的 Dalvik 虛擬機(jī)。雖然 ART 和 JVM(Java 虛擬機(jī))在功能上存在相似性(如字節(jié)碼執(zhí)行、內(nèi)存管理等),但 Android 本身不再依賴傳統(tǒng)意義上的 JVM。寄存器高于棧運(yùn)行速度。以下是詳細(xì)解析:
1. ART 與 JVM 的核心區(qū)別
| 特性 | ART(Android Runtime) | DVM | JVM(Java 虛擬機(jī)) |
|---|---|---|---|
| 字節(jié)碼格式 | 執(zhí)行 DEX ->ELF->.oat文件 | 執(zhí)行 DEX 字節(jié)碼(.dex 文件) |
執(zhí)行 JVM 字節(jié)碼(.class 文件) |
| 編譯方式 | 支持 AOT(預(yù)先編譯) + JIT(即時(shí)編譯) | JIT(即時(shí)編譯) | 主要依賴 JIT 和 解釋執(zhí)行 |
| 架構(gòu)設(shè)計(jì) | 基于寄存器(硬件物理層使用,速度快) | 基于寄存器(軟件層抽象,速度快) | 基于棧(通用設(shè)計(jì)) |
| 內(nèi)存占用 | 優(yōu)化后占用更低 | 內(nèi)存占用高 | 通常較高 |
| 所屬生態(tài) | Android 專用 | Android 專用 | Java 標(biāo)準(zhǔn)生態(tài)(如 Oracle JDK) |

OAT 是 ELF 的擴(kuò)展:專為 ART 設(shè)計(jì),包含 DEX 和本地機(jī)器碼
2. Android 為何不再依賴 JVM?
-
性能優(yōu)化:
ART 的 AOT(預(yù)先編譯)機(jī)制將 DEX 字節(jié)碼在應(yīng)用安裝時(shí)編譯為機(jī)器碼,大幅提升運(yùn)行速度(相比 Dalvik 的 JIT 模式)。 -
資源限制:
移動設(shè)備對內(nèi)存和電量的敏感度更高,基于寄存器的 ART 設(shè)計(jì)更適合移動端。 -
生態(tài)隔離:
Google 為 Android 構(gòu)建了獨(dú)立的運(yùn)行時(shí)環(huán)境,避免與 Oracle JVM 的專利和兼容性問題。
3. Android 開發(fā)中與 JVM 的關(guān)聯(lián)
盡管 Android 系統(tǒng)本身不依賴 JVM,但開發(fā)工具鏈仍與 Java/Kotlin 生態(tài)相關(guān):
-
開發(fā)語言:
Android 應(yīng)用使用 Java/Kotlin 編寫,這些語言最初設(shè)計(jì)時(shí)面向 JVM,但通過以下方式適配 ART:
Java 代碼 → 編譯為 JVM 字節(jié)碼 → 轉(zhuǎn)換為 DEX 字節(jié)碼 → ART 執(zhí)行
JVM是Java虛擬機(jī)的簡稱,通常指Oracle的JVM,用于執(zhí)行Java字節(jié)碼。而Android的DVM和ART都是虛擬機(jī),但它們執(zhí)行的是Dex字節(jié)碼,不是標(biāo)準(zhǔn)的Java字節(jié)碼。雖然Android應(yīng)用是用Java或Kotlin寫的,但編譯后的字節(jié)碼會被轉(zhuǎn)換成Dex格式,由DVM/ART執(zhí)行。
ART/DVM和JVM的區(qū)別在于它們處理字節(jié)碼的方式和架構(gòu)。JVM是基于棧的,而Dalvik/ART是基于寄存器的,這樣設(shè)計(jì)是為了移動設(shè)備優(yōu)化性能。此外,ART引入了AOT(預(yù)先編譯)機(jī)制,與JVM的JIT(即時(shí)編譯)不同,提高了應(yīng)用的運(yùn)行效率。
Android現(xiàn)在使用ART,取代了Dalvik,兩者都是Android專用的運(yùn)行時(shí)環(huán)境,不同于JVM。雖然開發(fā)語言是Java/Kotlin,但編譯后的代碼在ART上運(yùn)行,不依賴JVM。因此,Android系統(tǒng)中不會用到JVM。
-
工具鏈依賴:
- JDK(Java Development Kit):編譯和調(diào)試需要 JDK(如 OpenJDK),但它僅用于生成 JVM 字節(jié)碼,最終會被轉(zhuǎn)換為 DEX。
-
D8/R8 編譯器:將 JVM 字節(jié)碼(
.class文件)優(yōu)化為 DEX 格式(.dex文件)。
JVM 的“影子存在”:
在 Android Studio 的調(diào)試過程中,IDE 可能使用 JVM 的某些工具(如javac編譯器),但這些工具不參與最終應(yīng)用的運(yùn)行時(shí)。
4. 實(shí)際場景驗(yàn)證
-
檢查 APK 內(nèi)容:
解壓 APK 文件后,你會看到classes.dex(ART 執(zhí)行的目標(biāo)),而非*.class文件(JVM 字節(jié)碼)。APK 結(jié)構(gòu)示例: ├── AndroidManifest.xml ├── classes.dex ← ART 字節(jié)碼 ├── res/ └── META-INF/ -
運(yùn)行時(shí)環(huán)境:
通過adb shell連接設(shè)備后,執(zhí)行ps命令查看進(jìn)程信息,所有 Android 應(yīng)用均運(yùn)行在 ART 上,而非 JVM 進(jìn)程。
5.歷史演變與現(xiàn)狀
Android 1.0–4.4:
使用 DVM,犧牲安裝速度換取運(yùn)行效率。
典型問題:應(yīng)用啟動慢,GC 卡頓明顯。
Android 5.0–7.0:
全面轉(zhuǎn)向 ART,引入 AOT 編譯。
安裝時(shí)間變長,但用戶體驗(yàn)顯著提升。
Android 7.0+:
混合編譯模式(AOT + JIT),安裝時(shí)部分編譯,運(yùn)行時(shí)動態(tài)優(yōu)化。
引入 Profile-Guided Optimization (PGO),根據(jù)用戶行為優(yōu)化代碼。
6. 常見誤解澄清
誤解 1:
“Android 用 Java 開發(fā),所以必須依賴 JVM”。
真相:Java/Kotlin 僅是開發(fā)語言,最終代碼會被轉(zhuǎn)換為 DEX 格式由 ART 執(zhí)行。誤解 2:
“Kotlin 替代 Java 后,Android 會拋棄 ART”。
真相:Kotlin 同樣編譯為 DEX 字節(jié)碼,ART 仍是運(yùn)行時(shí)基礎(chǔ)。誤解 3:
“Flutter/Dart 應(yīng)用不需要 ART”。
真相:Flutter 應(yīng)用通過 AOT 編譯為本地機(jī)器碼,但 Android 系統(tǒng)本身仍依賴 ART 運(yùn)行其他組件。誤解 4:
為什么安卓開發(fā)優(yōu)化中,會說適量使用軟引用和弱應(yīng)用,不就是因?yàn)閖vm會回收這些對象嗎?
解釋:在 Android 開發(fā)中,軟引用(SoftReference) 和 弱引用(WeakReference) 的使用確實(shí)與垃圾回收(GC)機(jī)制相關(guān),但它們的核心價(jià)值并不依賴于 JVM 的存在,而是由 Java 語言規(guī)范 和 ART 的垃圾回收機(jī)制 共同決定的。盡管 Android 運(yùn)行時(shí)已從 JVM(Dalvik)切換到 ART,但這些引用的使用邏輯依然適用。GC并非JVM獨(dú)有,DVM、ART都有。
// 使用弱引用避免 Activity 泄漏
public class MyHandler {
private WeakReference<Activity> activityRef; // ? 弱引用
public MyHandler(Activity activity) {
this.activityRef = new WeakReference<>(activity);
}
public void doSomething() {
Activity activity = activityRef.get();
if (activity != null && !activity.isDestroyed()) {
// 安全操作 Activity
}
}
}
7. 未來趨勢
-
ART 持續(xù)優(yōu)化:
Google 不斷改進(jìn) ART 的垃圾回收、編譯效率等(如 Android 12 對 ART 的并發(fā)壓縮 GC 優(yōu)化)。 -
非 JVM 語言支持:
Kotlin/Native、Rust 等語言通過直接編譯為本地代碼,減少對 DEX 的依賴,但 ART 仍是 Android 的核心運(yùn)行時(shí)。
總結(jié)
- ? Android 系統(tǒng)自身不依賴傳統(tǒng) JVM,完全由 ART 負(fù)責(zé)字節(jié)碼執(zhí)行。
- ? 開發(fā)階段需要 JDK,但僅用于將 Java/Kotlin 代碼編譯為中間格式,最終產(chǎn)物是 DEX 字節(jié)碼。
- ? ART 是 Android 的專用運(yùn)行時(shí),針對移動設(shè)備深度優(yōu)化,與 JVM 無直接關(guān)聯(lián)。
- ? JVM:Java 生態(tài)基石,跨平臺但效率不足,不適合移動端。
- ? DVM:Android 早期妥協(xié)方案,基于寄存器但 GC 性能差。DVM 的「基于寄存器」是虛擬機(jī)指令集設(shè)計(jì),屬于軟件層抽象。
- ? ART:現(xiàn)代 Android 核心,AOT/JIT 混合 + 高效 GC,專為移動設(shè)備優(yōu)化。ART 的「物理寄存器使用」是硬件執(zhí)行的自然結(jié)果,與架構(gòu)設(shè)計(jì)無關(guān)。ART 通過 AOT 編譯徹底擺脫了 DVM 的執(zhí)行模型,直接生成高效的本地機(jī)器碼。