Buck 是Facebook出品的高效 開源 Android編譯工具,旨在鼓勵開發者構建小規模可重用的程序模塊,2013年發布時,InfoQ對此有過非常詳細的報道。 隨著版本的不斷迭代和功能的不斷演進,越來越多的團隊開始利用Buck改進編譯過程,Vine就是其中之一,該團隊近期在 博客 中分享了Buck使用的經驗。
相比傳統的Android編譯工具,Buck憑借多核及並行技術,極大加速了Android工程的編譯速度。同時,多次編譯過程中,它會對未變動的模塊進行標記,以增量式編譯的方式進一步提高速度。Buck自帶編譯腳本生成功能,並提供編譯過程中單元測試的代碼覆蓋率等數據表單,還為無法用Ant 工具編譯的模塊提供了便捷的編譯方式。Buck跟IntelliJ結合緊密,可通過簡單的編譯腳本生成該IDE可用的工程,極大降低了本地IDE開發後向服務器遷移的成本。
Vine團隊首先介紹了開發環境,包括Android Studio、Gradle編譯系統、Crashlytics等第三方插件以及Jenkins持續集成工具。在開發過程中,Vine發現雖然Gradle 編譯系統支持多平台配置,但是Vine的Android版本開發過程中會遇到兩個問題,一是App的體積會持續不斷地增長,二是隨著越來越多編譯步驟的增加,編譯時間越來越長。在引入Buck前,這兩個問題越來越嚴重,一次完整編譯要花費5分鐘左右時間,而哪怕修改一行代碼的編譯都需要1分鐘。對於 Vine這樣的小型團隊來講,每天都要花費幾個小時在等待編譯完成,這讓他們非常糾結。通過對過程的觀察,Vine發現dex文件合並以及通過USB安裝 App的時間占去了整個的90%,因此決定以此作為突破口,這時他們發現了來自Facebook的Buck很精准地提供了這方面的優化,能夠通過 ExoPackage模式來縮短編譯時間。Buck在這方面有很多的優化,如最小編譯依賴、最小dex傳輸等。具體來講,Buck引入了三個基本的概念,藉此完成高效編譯。編譯規則(rule),規定Buck在給定輸入文件後生成輸出文件的過程。編譯目標(target),項目中用來指定采用哪個規則編譯的字符串。編譯文件(file),可包含多個編譯規則,可類比為Make技術中的Makefile。在上述三個概念的基礎上,Buck會根據file中給定的target尋找特定編譯規則集合,然後根據每個規則來對Android工程進行編譯。這種分布式編譯的方式,在Buck內部以依賴圖的形式表示,它能夠使得相互之間沒有依賴關系的模塊並行編譯,節約編譯時間,並且通過對未改動模塊的標記,還可以進一步加速。
最後Vine團隊用了三個工作日來將編譯環境遷移至Buck,其中包含將遠程jar全部放置本地,運行時修改R值,創建混合 AndroidManifest.xml文件和創建Buck配置文件等。此時一次完整編譯的時間已降低至40秒鐘,而且本次遷移並未破壞和影響 Gradle原本的優勢,有了這樣的成功,Vine團隊打算下一步將Buck和Gradle之間的同步更加自動化。
總而言之,Buck面向的使用者是那些需要從單一代碼庫編譯多個不同target的人,適合進行多平台開發的團隊。值得注意的是,目前Buck不支持 Window平台,因此只能通過Mac或Linux平台進行開發。對Buck安裝、快速入門、以及編譯過程感興趣的讀者可參考Buck官方給出的 教程 。
更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11