原創(chuàng)內容,轉載請注明出處,多謝配合。
最近做了dex2oat相關優(yōu)化,那么簡單總結下一些相關流程與知識點。
這里虛擬機相關基礎知識這里不贅述了,不清楚的可以移步之前的文章:
熱修復&插件化(二)-虛擬機
啟動耗時分析(三)-ART編譯分析
我們都知道,ART虛擬機引入了AOT預編譯,最終編譯任務是交由dex2oat來處理的。dex2oat是一個Android系統(tǒng)的二進制可執(zhí)行文件,保存在system/bin目錄下。
相比傳統(tǒng)的JIT編譯來說,dex2oat編譯的二進制文件是持久化的,當前編譯耗費時間更長、存儲空間占用也更大,但是換來的是下次直接執(zhí)行持久化的機器碼,大幅度提升運行效率。
另外,需要注意的是:dex2oat執(zhí)行編譯操作的時候,會起j參數(shù)后面跟的線程數(shù)去執(zhí)行(常見的-j6),在大量執(zhí)行dex2oat操作的場景下,CPU占用率會非常高,很大概率會占用大核和超大核影響到用戶前臺操作,甚至出現(xiàn)卡頓和黑屏。這里優(yōu)化策略我肯定不會寫出來的,哈哈,但是呢可以把一些相關的流程與知識點總結下。
top -t -m 10
PID TID PR CPU% S VSS RSS PCY UID Thread Proc
23836 23840 4 11% R 1297936K 59156K bg u0_a14 Compiler driver /system/bin/dex2oat
23836 23841 7 11% R 1297936K 59156K bg u0_a14 Compiler driver /system/bin/dex2oat
23836 23843 5 11% R 1297936K 59156K bg u0_a14 Compiler driver /system/bin/dex2oat
23836 23844 6 11% R 1297936K 59156K bg u0_a14 Compiler driver /system/bin/dex2oat
23836 23836 3 11% R 1297936K 59156K bg u0_a14 main /system/bin/dex2oat
23836 23845 7 11% R 1297940K 59156K bg u0_a14 Compiler driver /system/bin/dex2oat
23836 23842 3 11% R 1297936K 59156K bg u0_a14 Compiler driver /system/bin/dex2oat
23836 23839 7 11% R 1297936K 59156K bg u0_a14 Compiler driver /system/bin/dex2oat
本篇文章先對目前觸發(fā)dex2oat操作的通路進行簡單梳理:
一、觸發(fā)路徑
這里是原生的方式:
| 路徑 | 描述 | 編譯方式 | 編譯內容 |
|---|---|---|---|
| Install | 應用安裝通過installd觸發(fā)的編譯 | speed-profile | 主apk |
| OTA升級 | 系統(tǒng)升級通過installd觸發(fā)的編譯 | verify | 主apk |
| load dexFile | 動態(tài)加載插件直接通過虛擬機觸發(fā)的編譯 | quicken | 插件 |
| postboot | 開機1分鐘后,針對全部安裝的7天內未使用且過期的應用通過installd觸發(fā)的編譯 | verify | 主apk |
| idle | 同時滿足充電、idle狀態(tài)且24小時內只觸發(fā)一次,主apk通過installd觸發(fā)編譯,插件通過虛擬機觸發(fā)編譯 | speed-profile | 主apk 和 插件 |
二、觸發(fā)條件
dex2oat觸發(fā)之前會先做條件判斷,來決定是否需要做:
- dex文件完全沒有編譯過。
- 已經(jīng)生成了odex,但是后續(xù)執(zhí)行了更高優(yōu)先級的compile filter,因此需要重新編譯覆蓋。
- OTA系統(tǒng)升級,boot image發(fā)生了變化。
所謂的過期就是針對后兩點而言的。
從編譯通路我們可以看到,觸發(fā)dex2oat編譯的方式主要有兩類:
- 經(jīng)過PMS由installd觸發(fā)。
- 動態(tài)加載插件是直接由虛擬機觸發(fā)。
這兩類路徑分別由后面篇文章來分析:
Android 9.0 ART編譯分析(二)-Installd觸發(fā)dex2oat編譯流程
Android 9.0 ART編譯分析(三)-虛擬機觸發(fā)dex2oat編譯流程