Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Jack和Jill的陰暗面

Jack和Jill的陰暗面

編輯:關於Android編程

年Google發布了新的工具鏈 - Jack(Java Android 編譯工具)和Jill(Jack中間庫鏈接器),它們用於替換存在的javac+dx工具集。

本文我將試著整理關於這個工具鏈的我的想法和觀點。

但在開始深挖Jack&Jill前,我打算繞個小圈,高度概括下已有的工具鏈並介紹你心愛的Android應用的編譯過程。

Android代碼編譯 101

坦白來說,我不會介紹完整的構建過程 - 我只關注於與我們主題最相關的部分 - 將Java源碼轉換成DEX文件。

從第一只恐龍踏足地球,編譯過程就是這樣了:

\

我們從Java源碼開始。目的是 - 編譯這些源碼生成設備中JVM可理解的可執行指令。<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPrbU09pKYXZhKLfHQW5kcm9pZCnTptPDo6zO0sPH1rvQ6NKqSmF2YbHg0uvG9yg8c3Ryb25nPmphdmFjPC9zdHJvbmc+KaGjy/y/ydLUseDS60phdmHUtMLrsqLJ+rPJSmF2Ybb+vfjWxsLrKCouY2xhc3POxLz+KaGjSmF2Ybb+vfjWxsLrv8nNqLn9s6O55rXE1NrE47v6xvfJz9TL0NC1xEpWTda00NChozwvcD4NCjxwPs7KzOLKx6Os1NpBbmRyb2lkyeixuMnPo6zO0sPHyrnTw7fHserXvLXESlZNoaPO0sPHyrnTw8HL0N64xLDmsb6jrLjDsOaxvrjftsjT1ruowcvK1rv6u7e+s6GjwP3I50pWTbG7s8bOqjxzdHJvbmc+RGFsdmlrPC9zdHJvbmc+KLvy1d88c3Ryb25nPkFSVDwvc3Ryb25nPtTauPy807jf0Ke1xEwryeixuMnPKaGjPC9wPg0KPHA+0vLOqtDeuMTBy0pWTaOsSmF2Ybb+vfjWxsLr0rLQ6NKq0N64xKOsyrm1w0RhbHZpa7/J1rTQ0KGj1eLKxzxzdHJvbmc+ZHg8L3N0cm9uZz65pL7ftcTWsNTwIC0gy/zK1bW9SmF2Ybb+vfjWxsLrKDxlbT4uY2xhc3M8L2VtPs7EvP4po6yyotequ7uzyUFuZHJvaWTTzbrEtcS2/r341sbOxLz+KCouZHjOxLz+KaGjPC9wPg0KPHA+1rW1w9K7zOHKx7mks8zW0LD8uqy12sj9t72/4sqxIC0gamFyKLvy1d9hYXIp0M7KvSAtz+C3tLK70OjSqrSmwO2jrLXayP23vb/i1rvKxyouY2xhc3POxLz+tcTRucv1vK+6z6Gj0vK0y7XayP23vb/i1rG908rkyOu4+GR4uaS+36Os0vLOqs7Sw8eyu9Do0qqx4NLry/yhozwvcD4NCjxwPrW9z9bU2s/gtbG1xLzytaWjrLbUsrujvzwvcD4NCjxoMyBpZD0="二進制碼處理">二進制碼處理

隨著時間推移,Android開發者變得更加富有經驗,人們開始開發很酷的工具和插件,它們可以在Java二進制碼級提升你的代碼(a.k.a字節碼操作)。

你看你聽說過這些更流行的工具:

Proguard Jacoco coverage Retrolambda …等等

這給我們很酷的能力來後處理我們的代碼w/o修改我們的原來的代碼。F.i. Proguard可以分享你的Java字節碼並刪除無用部分(也稱為最小化)。或者Retrolambda代替帶匿名內部類的Java8的lambda表達式,這樣你的’lambda表達式’就可以在不支持Java8特性的Android VM中工作了。

流程如下:

\

每個類(它的字節碼)由字節碼處理插件處理,並將結果傳遞給dx工具來生成最終的結果。

轉換API

隨著這樣的工具開始井噴,顯然Android Gradle構建系統不是真正為字節碼處理器設計的 - 唯一能’抓住’Java字節碼已准備好,而且又未被dx處理的時機的方法,就是添加Gradle任務依賴到Android Gradle插件創建的已存在的任務中。這樣任務的名字是實現細節,它基於項目配置動態生成,並隨著Android Gradle插件不斷進化,Google持續更新它。這導致每次新Android插件發布,這種插件都不能正常工作了。

所以Google需要采取行動。他們做到了 - 他們引入了Transition API - 一個允許增加轉換器的簡單的API - 類將在構建過程的合適時機被調用。轉換的輸入是Java字節碼。這允許插件開發者使用許多處理字節碼的可靠方法,從而停止使用無文檔的私有API。

Jack & Jill

同時,喜憂參半,Google的工程師超級忙於創造新事物,創造毀人心的東西!自動駕駛汽車!Jack和Jill!

Jack - 是編譯器。類似javac,但是它做了些許不同的事:
\

如你所見,Jack直接將Java源碼編譯成Dex文件!我們不在有中間的*.class文件,因此dx工具不需要了!

但是等等!如果在工程中引入一個第三方庫(.class文件集合),怎麼辦?

那麼,Jill該出場了:

Jill可以處理class文件並轉換成特殊的Jayce格式,該格式可用於Jack編譯器的輸入。

現在,讓我們冷靜思考一下… 對於我們沉迷的那些很酷的工具,將要發生什麼?它們都需要.class文件,而Jack編譯器不在需要.class文件了…

幸運的是,Jack提供了一些重要的開箱即用功能:

Retrolambda - 不再需要。Jack可以妥善處理lambda表達式 Proguard - 現已合並入Jack中,因此你仍可以使用混淆和最小化代碼。

然後,缺點列表如下:

Jack不支持轉換API - 無中間Java字節碼可修改,所以有些我沒有提到的插件將不能工作 Jack現在不支持注解處理,因此如果你嚴重依賴如Dagger,AutoValue等庫,切換到Jack需要三思。變更,Jack Wharton指出,N預覽版的Jack已經支持注解處理了,但未通過Gradle釋放。 運行在Java字節碼級的Lint檢查器不支持 Jack工作效率比javac+dx慢 Jacoco不支持 - 可是,我個人覺得Jacoco是可疑的(真的不像你想的那樣),所以可以完全拋棄它 Dexguard - 現在不支持企業版Proguard

我意識到我剛提到的事情都是臨時的,Google正在積極解決這些問題,但不幸的是,在人們開始意識到切換到新工具鏈的實際成本如此之高時,針對Android支持Java8特性的全部激動將完全褪去。

Jack是很酷的進步,它在編譯鏈上將給Google帶來更多的控制和靈活性,但是它處於初級階段,它開始變得流行前,需要一段時間來積累。

你的,
Pavel Dudka

AAR比JAR更進一步 - 它也包含Android相關的數據,如asset,資源和其他JAR不支持的數據 運行在最新N版本的
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved