Android Freeline加速編譯App方案 使用和總結
Freeline簡單介紹
在Android Studio還沒推出Instant Run功能之前,每次改動Android project項目時都要將整個項目又一次編譯一次,然後再將資源和代碼文件打包成APK文件傳輸到手機上安裝執行。這個過程是非常耗時間的,在配置較低的PC上一般須要高達3分鐘以上。配置較高的PC最低也須要1分鐘以上的時間。程序員每天無數次改動代碼然後編譯執行都要浪費非常多寶貴的時間。之後在Android Studio2.0之後推出了Instant Run功能,也就是交換技術即Swap,來加速Android Studio的編譯和部署的速度。
註意的是安裝時間還是受限於測試手機的性能。畢竟配置高的手機安裝軟件的速度肯定要比配置低的要更快一點。
再到2016年8月,阿裏螞蟻金服團隊開源了Freeline庫來加速Android Studio的編譯和部署的速度。
以下一段是官方對Freeline的介紹:
Freeline 是什麽?
Freeline 是一款 Android 平臺上的秒級編譯方案。能夠顯著地提高 Android project的編譯速度。
在Google的Instant Run庫裏,分為4種模式。Hot Swap,Cold Swap,Warm Swap和Full Apk四種模式,Android Studio則依據你對代碼的改動來選擇這四種模式當中的一種來編譯和部署,每種模式相應的情景都是不同的,大家能夠參考以下鏈接中的文章:
你真的了解 Instant Run 嗎?
Instant Run
因為Hot Swap,Cold Swap和Warm Swap這三種模式覆蓋的情景非常少,使用條件非常有限,所以基本非常多情況下都會執行Full Apk,即又一次全然編譯和安裝Apk。可見Instant Run的效率非常低。
Freeline就是為了解決這種局面,使我們對代碼改動後的執行能盡可能去使用Swap模式,而不是Full Apk。眼下其它加速編譯過程的技術手段還有改動Gradle構建任務,組件化開發。遷移構建系統到buck上等等。
在這種背景下。螞蟻金服的大佬們就開發了Freeline來加速Androidproject的構建,Freeline僅僅有極地的侵入性。也就是我們不用編寫多余的代碼來執行。卻能極大地提高Androidproject師們的開發效率,大多數增量構建能夠在10秒內,甚至1秒完畢。基本上告別了Gradle的卡,慢,和減少對Cpu的利用率。
用法
因為Freeline是利用python來執行命令行的,所以我們就必須在電腦上安裝 Python 2.7+,註意是 Python 2.7+,眼下還不支持Python3+。
能夠在一下鏈接下載:
https://www.python.org/downloads/release/python-2713/
註意要下載相應的版本號,有32位和64位版本號。
下載完後依據軟件提示 默認安裝。一路點next就能夠了。
安裝完後就須要進行環境設置了。桌面 右鍵我的電腦,選擇屬性-高級系統設置
選擇高級選項卡以下的 環境變量,打開環境變量對話框,在系統變量以下選中Path,然後編輯:
點擊編輯環境變量對話框中選擇編輯文本,在變量值後面加入例如以下:
;C:\Python27
註意前面有個英文分號 ; 。
之後就打開Android Studio ,點擊左上角的File - Setting,在打開的Setting對話框中選擇Plugins,然後點擊 Browse repositories:
搜索freeline就能夠找到相應的插件了。然後安裝就可以,最後重新啟動Android Studio:
重新啟動後在Android Studio的執行button旁邊就會多出來一個藍色的Freeline Logobutton:
這樣就完畢Freeline的配置了。使用也非常easy,僅僅須要點擊Freelinebutton就能夠,第一次使用的時候,插件會自己主動檢測是否安裝了 Freeline,假設沒有安裝的話會彈出提示。依照提示點擊“確定”。插件就會自己主動為你改動配置文件,並自己主動安裝 Freeline 的依賴文件。第一次執行須要全量編譯,所以須要耗時非常久,一般大項目起碼10分鐘左右,小項目也須要幾分鐘至少,請耐心等待。
僅僅有最後命令行界面出現 以下輸出時才算完畢全量編譯:
完畢了全量編譯後,以後每次改動代碼後就能夠點擊Freelinebutton來進行增量編譯了。提升了編譯和部署的速度,大大提高了開發效率,據官方稱能夠到秒級。
能夠點擊Android Studio下方的工具欄中的Freeline Console控制臺來輸入python命令或者查看日誌輸出:
如命令>python freeline.py 就是Run Freeline的命令了,跟點擊Freelingbutton執行的效果是一樣的。Freeling插件就是對python命令行的封裝,方便我們使用。
註意事項
- 當使用自己定義Application時。須要進行一些build.gradle文件進行一些配置。須要改動的配置項為excludeHackClasses:
excludeHackClasses
引入版本號:0.5.0
參數類型:List[String]
默認值:[]
參數說明:打包過程中。freeline 會對 class 進行插樁,默認會跳過父類為> android/app/Application的類。假設你有特殊需求須要繞過插樁。能夠通過這個配置項進行配置
假設自己定義Application類為MyApplication,我們須要在項目app的build.gralde的Android節點中加入例如以下內容:
android {
....//省略
freeline {
excludeHackClasses=[‘MyApplication.class‘]
}
}
然後在MyApplication的onCreate方法中調用Freeline的初始化方法:
public class MyApplication extends Application {
@Override
public void onCreate(){
super.onCreate();
FreelineCore.init(this);
}
}
特性
- 支持標準的多模塊 Gradle project的增量構建
- 並發執行增量編譯任務
- 進程級別異常隔離機制,App Crash後。仍然能夠通過增量編譯來修復
- 支持 so 動態更新
- 支持 resource.arsc 緩存
- 支持 retrolambda
- 支持 DataBinding
- 支持各類主流註解庫(APT)
- 支持 Windows,Linux,Mac 平臺
- 大多數情況下增量編譯能夠在10s內完畢
- 支持大多數場景的增量編譯
以下列表為 Freeline 支持的熱更新情況:
—— | Java | drawable, layout, etc. | res/values | native so |
---|---|---|---|---|
add | √ | √ | √ | √ |
change | √ | √ | √ | √ |
remove | √ | √ | x | - |
Freeline 已經分別在 API 17,19,22,23的 Android 模擬器、Android 6.0 Nexus 6P 以及 Android 4.4 錘子手機上經過測試。假設想要充分體驗 Freeline 增量編譯的速度的話。最好使用 Android 5.0+ 的設備。
局限性
- 第一次增量資源編譯即全量編譯的時候可能會有點慢。因為須要額外傳遞一個完整的資源包
- 不支持刪除帶id的資源,否則可能導致aapt編譯出錯
- 暫不支持抽象類的增量編譯
- 部分 APT 插件可能須要單獨適配
- 不支持開啟 Jack 編譯
想要使用 lambda 的話,先使用 Retrolambda 吧
- 不支持 Kotlin / Groovy / Scala
- 在簡單的project上,與其它構建方案相比,沒有明顯的優勢
Freeline 在以下幾種情況下會自己主動進行全量編譯:
- 發現 AndroidManifest.xml 有改動
- 發現 build.gradle 文件有改動
- 發現有超過 20 個 Java 文件有改動過(通常在使用 git 切換分支的情況會出現)
原理
Freeline是螞蟻金服旗下一站式理財平臺螞蟻聚寶團隊在Android平臺上的一個基於動態替換的編譯方案。穩定性方面:完好的基線對齊,進程級別異常隔離機制。性能方面:內部採用了相似Facebook的開源工具buck的多project多任務並發思想, 並對代碼及資源編譯流程做了深入的性能優化。
總結來說,Freeline就是一個增量編譯方案,主要是為了加快開發過程中項目編譯速度,眼下僅僅支持debug模式非混淆的開發。Freeline 本質上是熱更新技術在編譯期的運用,通過對同一個 apk 進行持續地熱更新來達到增量編譯的效果。基於 Freeline 進行改動,也能夠實現線上應用的熱修復以及 A/B Test。
Freeline 的詳細原理可參考以下文章:
Freeline - Android平臺上的秒級編譯方案
Android秒級編譯工具Freeline新特性支持!
總結
眼下Android Studio最新的版本號2.3,經過本人的幾次對Instant Run和Freeline進行一些測試,得出的一些數據。
中小項目測試:
Instant Run 增量編譯時間:
Freeline 增量編譯時間:
從小項目的測試結果中能夠得出。最新版本號Android Studio 中對Instant Run的優化已經非常好了,比Freeline快一點點,所以小項目中使用Freeline並不比其它方案有優勢。
大項目測試:
因為自己的項目引用了外部SDK,導致Freeline執行失敗,可能後期Freeline團隊會持續改進吧。所以提醒大家在使用這個方法時,請務必進行項目調研,分析是否適合開發需求,盡量符合Freeline的開發要求。註意第一次執行Freeline的全量編譯時間卻是非常可怕的,足足跑了456秒。不要以為程序停止了。可是僅僅要全量編譯之後,以後執行的時候差點兒都是增量編譯了,這點不用操心了:
還有一個長處就是Freeline對Cpu的消耗比較小。使用Instant Run時CPU占用率非常高,導致筆記本電腦風扇呼呼狂轉。可是使用Freeline就清涼非常多了,對Cpu占用率稍低,應該是內部使用了多線程並發執行增量編譯任務。建議電腦配置低或低版本號的Android Studio的童鞋能夠試試Freeline。
參考資料:
https://www.freelinebuild.com Freeline官方站點
https://github.com/alibaba/freeline Freeline 開源項目
Android Freeline加速編譯App方案 使用和總結