聚美快速編譯之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ì)呢?
- 真增量,構(gòu)建過程快且增量包體積小,極大提升更改代碼部署到手機(jī)速度,較Android studio2.0及 LayoutCast快3~5倍
- 跨平臺(tái)Linux,mac,windows
- 全版本覆蓋 2.x ~ 6.x版本均支持
- 部署流程簡化,更改代碼后,構(gòu)建過程中,與手機(jī)建立了tcp長連接,一行命令即可完成增量部署,毋需到各自子bundle所在的目錄構(gòu)建完成后再進(jìn)入portal/launcher進(jìn)行打包再安裝到手機(jī)的過程
- 事務(wù)支持,在開發(fā)過程引入的異常不會(huì)破壞工作空間
- 無縫支持mPass,解決了類似maven各個(gè)節(jié)點(diǎn)需merge合并等與常規(guī)開發(fā)流程不一致的問題
- 進(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ì)出問題,可以先試試。
-
Java 建議使用 8.0以上版本。切莫直接使用 AS 里面提供的 SDK 版本,否則會(huì)出現(xiàn)一些奇怪的問題,應(yīng)該如圖所示:
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í)候:
,

,一般 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ù)下圖修改:

























