Android Freeline加速編譯App方案 使用和總結

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命令行的封裝,方便我們使用。

注意事項


  1. 當使用自定義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);

    }
}

特性

  1. 支持標準的多模塊 Gradle 工程的增量構建
  2. 併發執行增量編譯任務
  3. 進程級別異常隔離機制,App Crash後,仍然可以通過增量編譯來修復
  4. 支持 so 動態更新
  5. 支持 resource.arsc 緩存
  6. 支持 retrolambda
  7. 支持 DataBinding
  8. 支持各類主流注解庫(APT)
  9. 支持 Windows,Linux,Mac 平臺
  10. 大多數情況下增量編譯可以在10s內完成
  11. 支持大多數場景的增量編譯

以下列表爲 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+ 的設備。

侷限性


  1. 第一次增量資源編譯即全量編譯的時候可能會有點慢,因爲需要額外傳遞一個完整的資源包
  2. 不支持刪除帶id的資源,否則可能導致aapt編譯出錯
  3. 暫不支持抽象類的增量編譯
  4. 部分 APT 插件可能需要單獨適配
  5. 不支持開啓 Jack 編譯
    想要使用 lambda 的話,先使用 Retrolambda 吧
  6. 不支持 Kotlin / Groovy / Scala
  7. 在簡單的工程上,與其他構建方案相比,沒有明顯的優勢

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 開源項目

發佈了76 篇原創文章 · 獲贊 68 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章