Freeline簡介
在Android Studio還沒推出Instant Run功能之前,每次修改Android 工程項目時都要將整個項目重新編譯一次,然後再將資源和代碼文件打包成APK文件傳輸到手機上安裝運行。這個過程是非常耗時間的,在配置較低的PC上一般需要高達3分鐘以上,配置較高的PC最低也需要1分鐘以上的時間。程序猿每天無數次修改代碼然後編譯運行都要浪費很多寶貴的時間,之後在Android Studio2.0之後推出了Instant Run功能,也就是交換技術即Swap,來加速Android Studio的編譯和部署的速度。注意的是安裝時間還是受限於測試手機的性能,畢竟配置高的手機安裝軟件的速度肯定要比配置低的要更快一點。
再到2016年8月,阿里螞蟻金服團隊開源了Freeline庫來加速Android Studio的編譯和部署的速度。下面一段是官方對Freeline的介紹:
Freeline 是什麼?
Freeline 是一款 Android 平臺上的秒級編譯方案,能夠顯著地提高 Android 工程的編譯速度。
在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來加速Android工程的構建,Freeline只有極地的侵入性,也就是我們不用編寫多餘的代碼來運行,卻能極大地提高Android工程師們的開發效率,大多數增量構建能夠在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的運行按鈕旁邊就會多出來一個藍色的Freeline Logo按鈕:
這樣就完成Freeline的配置了。使用也很簡單,只需要點擊Freeline按鈕就可以,第一次使用的時候,插件會自動檢測是否安裝了 Freeline,如果沒有安裝的話會彈出提示,按照提示點擊“確定”,插件就會自動爲你修改配置文件,並自動安裝 Freeline 的依賴文件。第一次運行需要全量編譯,所以需要耗時很久,一般大項目起碼10分鐘左右,小項目也需要幾分鐘至少,請耐心等待。
只有最後命令行界面出現 下面輸出時纔算完成全量編譯:
完成了全量編譯後,以後每次修改代碼後就可以點擊Freeline按鈕來進行增量編譯了,提升了編譯和部署的速度,大大提高了開發效率,據官方稱可以到秒級。
可以點擊Android Studio下方的工具欄中的Freeline Console控制檯來輸入python命令或者查看日誌輸出:
如命令>python freeline.py 就是Run Freeline的命令了,跟點擊Freeling按鈕運行的效果是一樣的,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 工程的增量構建
- 併發執行增量編譯任務
- 進程級別異常隔離機制,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
- 在簡單的工程上,與其他構建方案相比,沒有明顯的優勢
Freeline 在以下幾種情況下會自動進行全量編譯:
- 發現 AndroidManifest.xml 有修改
- 發現 build.gradle 文件有修改
- 發現有超過 20 個 Java 文件有修改過(通常在使用 git 切換分支的情況會出現)
原理
Freeline是螞蟻金服旗下一站式理財平臺螞蟻聚寶團隊在Android平臺上的一個基於動態替換的編譯方案,穩定性方面:完善的基線對齊,進程級別異常隔離機制。性能方面:內部採用了類似Facebook的開源工具buck的多工程多任務併發思想, 並對代碼及資源編譯流程做了深入的性能優化。
總結來說,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 開源項目