編輯:關於Android編程
年Google發布了新的工具鏈 - Jack(Java Android 編譯工具)和Jill(Jack中間庫鏈接器),它們用於替換存在的javac+dx工具集。
本文我將試著整理關於這個工具鏈的我的想法和觀點。
但在開始深挖Jack&Jill前,我打算繞個小圈,高度概括下已有的工具鏈並介紹你心愛的Android應用的編譯過程。
坦白來說,我不會介紹完整的構建過程 - 我只關注於與我們主題最相關的部分 - 將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工具來生成最終的結果。
隨著這樣的工具開始井噴,顯然Android Gradle構建系統不是真正為字節碼處理器設計的 - 唯一能’抓住’Java字節碼已准備好,而且又未被dx處理的時機的方法,就是添加Gradle任務依賴到Android Gradle插件創建的已存在的任務中。這樣任務的名字是實現細節,它基於項目配置動態生成,並隨著Android Gradle插件不斷進化,Google持續更新它。這導致每次新Android插件發布,這種插件都不能正常工作了。
所以Google需要采取行動。他們做到了 - 他們引入了Transition API - 一個允許增加轉換器的簡單的API - 類將在構建過程的合適時機被調用。轉換的輸入是Java字節碼。這允許插件開發者使用許多處理字節碼的可靠方法,從而停止使用無文檔的私有API。
同時,喜憂參半,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
初始化對象private Paint mPaint;//畫筆 private int count;//點擊次數 private Rect rect;//矩形 public
1、原來是將EditView放到了popupwindow,發現EditView原有的復制、粘貼、全選、選擇功能失效了,所以便用DialogFragment代替了popup
應用開發中需要獲取WebView當前頁面的標題,可能通過對WebChromeClient.onReceivedTitle()方法的重寫來實現 效果圖如下: 代碼如下:
Android使用RecyclerView1. 什麼是RecyclerViewRecyclerView 是 Android-support-v7-21 版本中新增的一個