就在我們分析android m版本的art還隻走出了一小段路的時候,android n的新art就問世了。
android n上的art還是有不小的改進的。不過做為一個關注細節的系列文章,我們還是從compile的過程說起。
在安裝的時候,預設情況下,android n隻做interpret-only的編譯,如下指令行所示:
是以我們更新一下編譯時候的時序圖:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLhFjNmlTZlFGOlRGZ5czNjJzYlZjNxMGOjJ2YlVWZjljZzYTM1czM08CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
在安裝的時候不編譯了,那麼就要在運作時通過jit來編譯,這個流程如下:
比起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。