Android 秒級(jí)編譯 Freeline
我們知道 Android 的編譯很慢,尤其是項(xiàng)目大點(diǎn)的時(shí)候,那編譯速度簡(jiǎn)直難以忍受,極大的降低了我們的開(kāi)發(fā)效率,之前的文章「」給大家介紹過(guò),但是是付費(fèi)的,用起來(lái)不是那么自由,而今天給大家介紹另外一個(gè)強(qiáng)大的工具 -- Freeline,絕對(duì)秒級(jí)編譯。
GitHub:https://github.com/alibaba/freeline
什么是 Freeline?
Freeline 是螞蟻金服旗下平臺(tái)螞蟻聚寶 Android 團(tuán)隊(duì)開(kāi)發(fā)的一款針對(duì) Android 平臺(tái)的增量編譯工具,它可以充分利用緩存文件,在幾秒鐘內(nèi)迅速地對(duì)代碼的改動(dòng)進(jìn)行編譯并部署到設(shè)備上,有效地減少了日常開(kāi)發(fā)中的大量重新編譯與安裝的耗時(shí),現(xiàn)已開(kāi)源。
穩(wěn)定性方面:完善的基線對(duì)齊,進(jìn)程級(jí)別異常隔離機(jī)制。
性能方面:內(nèi)部采用了類似 Facebook 的開(kāi)源工具 buck 的多工程多任務(wù)并發(fā)思想:端口掃描,代碼掃描,并發(fā)編譯,并發(fā) dx,并發(fā) merge dex 等策略,在多核機(jī)器上有明顯加速效果,另外在 class 及 dex,resources 層面作了相應(yīng)緩存策略,做到真正增量開(kāi)發(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ù)倍速度。
有何優(yōu)勢(shì)?
1. 真增量,構(gòu)建過(guò)程快且增量包體積小,極大提升更改代碼部署到手機(jī)速度,較 Android studio 2.0 及 LayoutCast 快 3~5 倍
2. 跨平臺(tái) Linux,mac,windows
3. 全版本覆蓋 2.x ~ 6.x版本均支持
4. 部署流程簡(jiǎn)化,更改代碼后,構(gòu)建過(guò)程中,與手機(jī)建立了 tcp 長(zhǎng)連接,一行命令即可完成增量部署,毋需到各自子 bundle 所在的目錄構(gòu)建完成后再進(jìn)入 portal/launcher 進(jìn)行打包再安裝到手機(jī)的過(guò)程
5. 事務(wù)支持,在開(kāi)發(fā)過(guò)程引入的異常不會(huì)破壞工作空間
6. 無(wú)縫支持 mPass,解決了類似 maven 各個(gè)節(jié)點(diǎn)需 merge 合并等與常規(guī)開(kāi)發(fā)流程不一致的問(wèn)題
7. 進(jìn)程級(jí)別異常隔離,開(kāi)發(fā)體驗(yàn)持續(xù)穩(wěn)定
支持的功能
- 支持標(biāo)準(zhǔn)的多模塊 Gradle 工程的增量構(gòu)建
- 并發(fā)執(zhí)行增量編譯任務(wù)
- 進(jìn)程級(jí)別異常隔離機(jī)制
- 支持 so 動(dòng)態(tài)更新
- 支持 resource.arsc 緩存
- 支持 retrolambda
- 支持 DataBinding
- 支持各類主流注解庫(kù)
- 支持 Windows,Linux,Mac 平臺(tái)
如何使用?
首先你的電腦上應(yīng)該安裝 Python,如果沒(méi)有安裝,請(qǐng)自行搜索安裝,相信你可以搞得定。
其次配置 project-level 的 build.gradle,加入 freeline-gradle 的依賴:
- buildscript {
- repositories {
- jcenter()
- }
- dependencies {
- classpath 'com.antfortune.freeline:gradle:0.8.2'
- }
- }
然后,在你的主 module 的 build.gradle 中,一般也就是你 app 目錄下的 build.gradle 文件,應(yīng)用 freeline 插件的依賴,記得點(diǎn)擊 Sync 按鈕進(jìn)行同步下載。
- apply plugin: 'com.antfortune.freeline'
- android {
- ...
- }
***,在命令行執(zhí)行以下命令來(lái)下載 freeline 的 python 和二進(jìn)制依賴,注意切換到項(xiàng)目目錄執(zhí)行:
- Windows[CMD]: gradlew initFreeline
- Linux/Mac: ./gradlew initFreeline
對(duì)于國(guó)內(nèi)的用戶來(lái)說(shuō),如果你的下載的時(shí)候速度很慢,你也可以加上參數(shù),執(zhí)行g(shù)radlew initFreeline -Pmirror,這樣就會(huì)從國(guó)內(nèi)鏡像地址來(lái)下載。
下載完成之后,在命令行輸入 python freeline.py 即可進(jìn)行編譯運(yùn)行。
當(dāng)然如果每次都輸入也挺麻煩的,最簡(jiǎn)單的用法是直接安裝 Android Studio 插件。
在 Android Studio 中,通過(guò)以下路徑 Preferences → Plugins → Browse repositories,搜索“freeline”,并安裝,之后你會(huì)看到工具欄有如下按鈕:
直接點(diǎn)擊 Run Freeline 的按鈕,本質(zhì)上也就是幫你在命令行輸入上述命令而已。
使用體驗(yàn)
自己在項(xiàng)目上親自體驗(yàn)了,綜合使用下來(lái)確實(shí)很爽,真正實(shí)現(xiàn)了秒級(jí)編譯,不管你是更改了代碼文件還是資源文件,直接編譯運(yùn)行真正是秒級(jí)的,而在之前可能得等上個(gè)一兩分鐘。但是使用下來(lái)有以下注意事項(xiàng):
- ***次增量資源編譯的時(shí)候有點(diǎn)慢,不過(guò)也就在***次的時(shí)候慢,后面速度蹭蹭的;
- 如果設(shè)備上之前有安裝不是用 Freeline 編譯打包的 apk,請(qǐng)先卸載,之后再用 Freeline 編譯打包;
- ***次 Freeline 編譯安裝之后不會(huì)自動(dòng)啟動(dòng) App,這點(diǎn)請(qǐng)大家注意下,因?yàn)?**次我一直在等待,等了好久以為沒(méi)成功,后來(lái)才發(fā)現(xiàn)其實(shí)安裝成功了的,只是沒(méi)有打開(kāi)而已;
- 不支持多設(shè)備同時(shí)連接,也就是說(shuō)不管是模擬器還是真機(jī),只允許同時(shí)一臺(tái)設(shè)備連接,否則會(huì)失敗;
- 不支持刪除帶 id 的資源,否則可能導(dǎo)致 aapt 編譯出錯(cuò);
- 如果你的項(xiàng)目有使用 Kotlin 語(yǔ)言,那么 Freeline 不支持;
- 如果你的項(xiàng)目又想用 Freeline,又想使用 Gradle,記得執(zhí)行 Gradle 腳本之前先執(zhí)行 ./gradlew clean,否則會(huì)編譯失敗;
總體而已 Freeline 會(huì)有一些限制,以及兼容性可能也會(huì)有點(diǎn)問(wèn)題,但是試用下來(lái)沒(méi)遇到多大的問(wèn)題,而且對(duì)于調(diào)試的效率提升簡(jiǎn)直太大了,值得推薦給大家!
【本文為51CTO專欄作者“stormzhang”原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)聯(lián)系原作者(微信號(hào):googdev)】