天天看點

ART世界探險(20) - Android N上的編譯流程ART世界探險(20) - Android N上的編譯流程

就在我們分析android m版本的art還隻走出了一小段路的時候,android n的新art就問世了。

android n上的art還是有不小的改進的。不過做為一個關注細節的系列文章,我們還是從compile的過程說起。

在安裝的時候,預設情況下,android n隻做interpret-only的編譯,如下指令行所示:

是以我們更新一下編譯時候的時序圖:

ART世界探險(20) - Android N上的編譯流程ART世界探險(20) - Android N上的編譯流程

在安裝的時候不編譯了,那麼就要在運作時通過jit來編譯,這個流程如下:

ART世界探險(20) - Android N上的編譯流程ART世界探險(20) - Android N上的編譯流程

比起m上我們分析過的版本,n上的新版本的compileall的注釋更詳細了,結構也更清晰了一點。

我們先來看看android m版的:

再看看對應的android n的compileall,是不是看起來正規了許多呢?

compilerdriver的compile方法,從android m時代的不足10行,到了android n上也變成40多行了。

android m上的compilerdriver::compile:

android n對應的compile方法:

android m版的compiledexfile:

android n版本增加了一個compileclassvisitor,通路者模式啊,更加上檔次了。

雖然在android n上改用了compileclassvisitor,但是本質上還是跟android m上的compilerdriver::compileclass是一回事情。最終還是要落實到compilemethod方法上去。

細節就略過不分析了。

我們先過一下compileclassvisitor的邏輯:

然後會調到compilerdriver中的static函數compilemethod。

繼續閱讀