Android 9.0 ART編譯分析(一)-編譯通路梳理

原創(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編譯流程

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
禁止轉載,如需轉載請通過簡信或評論聯(lián)系作者。

相關閱讀更多精彩內容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,684評論 1 32
  • 原創(chuàng)文章,轉載請注明出處,多謝! 一、ART簡介 編譯方式:具有JIT(Just-In-Time)和AOT(Ahe...
    Stan_Z閱讀 20,127評論 0 26
  • 摘自:http://www.2cto.com/kf/201401/270288.html一、Android系統(tǒng)性能...
    GB_speak閱讀 3,938評論 1 3
  • 我懷疑一點:老大,你是不是一點都不愛我,還覺得我總不跟你離婚,總喊你回家 是累贅!是你見好煩的事?。?主要是煩...
    童基宸辰哈閱讀 186評論 0 0
  • 閱讀1小時,總計845小時,第807日 閱讀《印度哲學》至第五、六章 屬性的重要性在于,它們使我們將此物與彼物區(qū)分...
    龍?zhí)赘缢_克海龍閱讀 84評論 0 0

友情鏈接更多精彩內容