聚美快速編譯之FreeLine 安裝指南

聚美快速編譯之FreeLine 安裝指南

Freeline

開源地址是:https://github.com/alibaba/freeline

Freeline是螞蟻聚寶團(tuán)隊(duì)15年10月在Android平臺(tái)上的量身定做的一個(gè)基于動(dòng)態(tài)替換的編譯方案,5月阿里集團(tuán)內(nèi)部開源。

  • 穩(wěn)定性方面:完善的基線對(duì)齊,進(jìn)程級(jí)別異常隔離機(jī)制。
  • 性能方面:內(nèi)部采用了類似Facebook的開源工具buck的多工程多任務(wù)并發(fā)思想:端口掃描,代碼掃描,并發(fā)編譯,并發(fā)dx,并發(fā)merge dex等策略,在多核機(jī)器上有明顯加速效果,另外在class及dex,resources層面作了相應(yīng)緩存策略,做到真正增量開發(fā),另外引入并優(yōu)化buck的部分加速組件dx,DexMerger,資源編譯方面,深入改造了Aapt資源編譯流程,當(dāng)資源發(fā)生改變時(shí)候,秒級(jí)完成增量包編譯,其中增量包僅含最小的變更集合(10Kb~數(shù)百Kb內(nèi)),后期也被運(yùn)用到線上進(jìn)行資源/代碼動(dòng)態(tài)替換。相比目前instant-run,buck,layoutcast等方案快數(shù)倍速度。

Freeline 有什么優(yōu)勢(shì)呢?

  1. 真增量,構(gòu)建過程快且增量包體積小,極大提升更改代碼部署到手機(jī)速度,較Android studio2.0及 LayoutCast快3~5倍
  2. 跨平臺(tái)Linux,mac,windows
  3. 全版本覆蓋 2.x ~ 6.x版本均支持
  4. 部署流程簡化,更改代碼后,構(gòu)建過程中,與手機(jī)建立了tcp長連接,一行命令即可完成增量部署,毋需到各自子bundle所在的目錄構(gòu)建完成后再進(jìn)入portal/launcher進(jìn)行打包再安裝到手機(jī)的過程
  5. 事務(wù)支持,在開發(fā)過程引入的異常不會(huì)破壞工作空間
  6. 無縫支持mPass,解決了類似maven各個(gè)節(jié)點(diǎn)需merge合并等與常規(guī)開發(fā)流程不一致的問題
  7. 進(jìn)程級(jí)別異常隔離,開發(fā)體驗(yàn)持續(xù)穩(wěn)定

誰在使用 Freeline?

目前 Freeline 在阿里內(nèi)部穩(wěn)定支撐螞蟻聚寶,高德地圖等ANDROID技術(shù)團(tuán)隊(duì)日常開發(fā),兼容mPaas/gradle架構(gòu).

原理介紹:

https://yq.aliyun.com//articles/59122

聚美 App 使用指南

由于我們使用 HG 來管理,所以會(huì)出現(xiàn)很多不同的分支,因此基于最新的 default_3.94 這個(gè)分支來進(jìn)行推廣。本文中羅列出一些在使用過程的一些坑點(diǎn),請(qǐng)同學(xué)們避開。

必須準(zhǔn)備好相關(guān)的環(huán)境:
  • gradle 建議直接使用最新的 3.0 版本。必須要在本地配置相關(guān)的環(huán)境變量,在 命令行能查看到 當(dāng)前版本,查看方式是: gradle -v。 同時(shí)需要在 AS 里面這么做:

    。當(dāng)然其他方式也是可以的,但是為了以后的兼容與統(tǒng)一,盡量使用3.0

    • Java 建議使用 8.0以上版本。切莫直接使用 AS 里面提供的 SDK 版本,否則會(huì)出現(xiàn)一些奇怪的問題,應(yīng)該如圖所示:
    • python Mac 里面默認(rèn)自帶該功能,可以直接使用。默認(rèn)是2.7,有人說3.0可能會(huì)出問題,可以先試試。
Freeline 初始化環(huán)境:
  • 根目錄下的 build.gradle
 buildscript {
     repositories {
         jcenter()
     }
     dependencies {
         classpath 'com.antfortune.freeline:gradle:0.5.5'
     }
 }
  • 項(xiàng)目下面的 build.gradle
 apply plugin: 'com.antfortune.freeline'
 
 android {
     ...
     freeline {
         hack true
     }
 }
 
 dependencies {
   compile 'com.antfortune.freeline:runtime:0.5.5'
 }
  • 自定義的 Application
 public class App extends Application {
     @Override
     public void onCreate() {
         super.onCreate();
         FreelineCore.init(this);
     }
 }

在當(dāng)前工作目錄下 執(zhí)行:

    gradle initFreeline

ps: 最主要的耗費(fèi)時(shí)間是在 配置 gradle 相關(guān)的地方。

  • 如果提示 gradle XX 版本有問題, gradle 3.0 不匹配,可能是 gradle 插件版本有問題。在根目錄下面的 build.gradle 里面修改為:
    classpath 'com.android.tools.build:gradle:2.2.0-beta2'

為了保證咱們的運(yùn)行環(huán)境一致,建議直接使用這個(gè)。后面有問題也方便協(xié)商處理。

  • 如果看到:

    雖然上面顯示0%,但是其實(shí)它一直在本地下載東西,網(wǎng)速正常,基本兩分鐘左右就能下載下來。 如果沒有代理的話,可以這么做,直接使用國內(nèi)的東西下載:

    gradle initFreeline -Pmirror (建議直接使用這個(gè))
  • 如果看到 read_project_info_task 的時(shí)間超長, 大于30秒以上,可能是 gradle 出問題了。說明gradle 在本地下載東西,有一種比較好的做法是:直接從 gradle 官網(wǎng)下載到最新的 gradle 壓縮包(一定要是最全的 all 版本)。可以將該壓縮包存起來,并配置本地環(huán)境變量等。對(duì)于圖中出現(xiàn)的問題,可以打開這個(gè)目錄:

    這個(gè)目錄:



    放入壓縮包到這個(gè)文件夾中:

    然后直接運(yùn)行即可。

  • 直接使用這個(gè)命令構(gòu)建:
  • 如果看見這個(gè)表示初始化 Freeline 成功:
  • 直接執(zhí)行這個(gè):

    一般情況下可以直接構(gòu)建成功,但是對(duì)于聚美項(xiàng)目會(huì)失敗,是因?yàn)槔锩娴淖址畬懙牟灰?guī)范,例如截圖:



    這里說的不規(guī)范是因?yàn)槔锩婵赡馨颂厥庾址?,一般肉眼看不到,通過某些工具可以查看。如果遇到上述問題,我們可以手動(dòng)把這些相關(guān)代碼重寫下即可。

根據(jù)代碼行數(shù)能定位到這里:


當(dāng)我們修改成功后,再次運(yùn)行即可。

  • 如果出現(xiàn)


    說明我們的相關(guān)構(gòu)建沒有問題,只是在輸出 apk 包后,最后無法找到相關(guān)的 apk. 現(xiàn)在的做法就是手動(dòng)指定這個(gè)目錄。在項(xiàng)目中 的 主要 Model 里面的 build.gradle 中 的 android { }里面的位置加上
android {

freeline {
    hack true
}
def flavor = "jmtest"

freeline {
    productFlavor flavor
}

freeline {
    def dir = System.getProperty("user.dir");
    apkPath dir + "/ExportApks/"+ flavor + "_" + "3892" + ".apk"
}

freeline {
        def dir = System.getProperty("user.dir");
        apkPath dir + "/ExportApks/"+ flavor + "_" + "3892" + ".apk"
    }
}

請(qǐng)把 ”3982” 替換成 你自己的版本號(hào),目前發(fā)現(xiàn)無法用,后面會(huì)對(duì)這部分內(nèi)容進(jìn)行修改,盡量自動(dòng)化。

當(dāng)我們?cè)O(shè)置成功后,就 Ok 了。如圖:
  • 我們可以設(shè)置別名啟動(dòng):
    alias py="python freeline.py”

以后就可以直接 執(zhí)行 py.

  • 當(dāng)我們出現(xiàn)這種情況的時(shí)候:

    ,

方案1: 可能是你本地的 Debug 模式開啟了混淆,請(qǐng)關(guān)閉混淆即可:

,一般 debug 模式下是不需要混淆的。

方案2:
需要重新配置一些地方:在 項(xiàng)目根目錄下的 build.gradle 文件中,修改這個(gè)com.android.tools.build:gradle的版本為 2.2.0-beta2:

classpath 'com.android.tools.build:gradle:2.2.0-beta2'

即可。

正常運(yùn)行后:
  • 如果出現(xiàn)關(guān)于 freeline 腳本的問題,可以嘗試這么修改:
    module = fn.split('.')[0] 修改為 module = fn[:fn.rfind(".")]

至此,基本聚美相關(guān)就可以運(yùn)行相關(guān)的東西了。

增加 Freeline 的文件對(duì)比情況

開始逐個(gè)文件對(duì)比差異,如果有問題可以根據(jù)下圖修改:













最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容