參考:https://github.com/alibaba/freeline/blob/master/freeline-docs/zh_cn.md
Python 2.7.3 Release
Win7 Python2.7 安裝教程
Freeline 是什么?
Freeline 是一款 Android 平臺上的秒級編譯方案,能夠顯著地提高 Android 工程的編譯速度。
為什么使用 Freeline?
對于一個大型的 Android 工程來說,每次簡單地修改幾行代碼都需要編譯上 5 分鐘,再等待安裝到設備上的 30 秒到 1 分鐘,再重新進入到需要調試的 Activity。這個調試環(huán)節(jié)每天都在重復幾十次,無形之中每天都有無數(shù)的時間浪費在上面(加班阿QAQ...
Google 推出了官方的 Instant Run,但大家都知道,這個方案有太多的 case 無法覆蓋,甚至在一些比較大型的工程上基本上無法使用。
換 Mac、加內存、上 SSD、修改 Gradle 構建任務、組件化開發(fā)、遷移構建系統(tǒng)到 buck 上等等,聰明的 Android 工程師們想過很多來加速構建的方法,但是成本都不低。
在這樣的背景下,我們開發(fā)了 Freeline 來加速 Android 工程的構建。Freeline 只有極低的侵入性(我們也在研究無侵入的方案),卻能極大地提高 Android 工程師們的開發(fā)效率,大多數(shù)增量構建都能夠在 10 秒內,甚至 1 秒完成,基本上告別了 Gradle 的卡、慢,筆記本不再風扇狂轉、發(fā)熱發(fā)燙。
誰在用?
開源至今,已有來自
BAT、新美大、今日頭條、攜程、聚美優(yōu)品等上百款 App
使用了 Freeline 來提高工程師們的開發(fā)效率,F(xiàn)reeline 對輕量級到重量級的 Android 應用都提供了強有力的增量編譯支持。
如果你也在使用 Freeline,歡迎告訴我們! ->
Freeline 的維護情況
Freeline 主工程目前主要由兩位螞蟻金服的工程師在維護,Android Studio 插件目前主要由社區(qū)開發(fā)者維護。
Freeline 從本質上來說是 Gradle 構建系統(tǒng)上的 hack 解決方案,所以對于多種多樣的 Android 工程可能還存在著一些兼容性問題(不過已經有上百個 App 驗證過 Freeline 的有效性,其實也不要太過擔心),這些兼容性問題也是維護期間主要要解決的問題。
未來,F(xiàn)reeline 還會持續(xù)跟進并支持每個最新的 Android 版本,如果你在使用過程中遇見任何問題,歡迎向我們提 issue,我們會盡快幫忙解決。
Freeline 支持的特性
- 支持標準的多模塊 Gradle 工程的增量構建
- 并發(fā)執(zhí)行增量編譯任務
- 進程級別異常隔離機制
- 支持 so 動態(tài)更新
- 支持 resource.arsc 緩存
- 支持 retrolambda
- 支持 DataBinding
- 支持各類主流注解庫(APT)
- 支持 Windows,Linux,Mac 平臺
以下列表為 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+ 的設備。
開始使用
接入前的準備
對于 Windows 用戶來說,你需要提前安裝 Python 2.7+(Freeline 暫時還不支持 Python 3+),安裝完之后需要重啟一下 Android Studio。
對于 Linux/Mac 用戶,如果你已經安裝了 Python 3+,推薦你將其alias
設為python3
,再單獨安裝 Python 2.7+,并作為默認的 Python 指令,避免與 Android Studio 插件自動運行的python
命令沖突,導致無法正常使用插件。
如何接入?
我們提供了兩種接入 Freeline 的方法,最簡單的方法是通過 Android Studio 的插件來接入(實際上是對命令行的方式做了封裝,提供自動化的解決方案),另一種則是手工通過修改配置與執(zhí)行命令的方式來接入。
方法一:Android Studio 插件
在最新版本的 Freeline 插件中,提供了自動化一鍵接入的方式,不需要像以前一樣手動修改build.gradle
配置文件了。
在Android Studio中,通過以下路徑Preferences → Plugins → Browse repositories
,搜索“freeline”,并安裝。
直接點擊Run Freeline
的按鈕,就可以享受Freeline帶來的開發(fā)效率的提升啦(當然,你可能會先需要一個較為耗時的全量編譯過程)。
第一次使用的時候,插件會自動檢測是否安裝了 Freeline,如果沒有安裝的話會彈出提示,按照提示點擊“確定”,插件就會自動為你修改配置文件,并自動安裝 Freeline 的依賴文件。
方法二:命令行方式接入
配置 project-level 的 build.gradle,加入 freeline-gradle 的依賴:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.antfortune.freeline:gradle:x.x.x'
}
}
然后,在你的主 module 的 build.gradle 中,應用 freeline 插件的依賴:
apply plugin: 'com.antfortune.freeline'
android {
...
}
最后,在命令行執(zhí)行以下命令來下載 freeline 的 python 和二進制依賴。
-
Windows[CMD]:
gradlew initFreeline
-
Linux/Mac:
./gradlew initFreeline
對于國內的用戶來說,如果你的下載的時候速度很慢,你也可以加上參數(shù),執(zhí)行gradlew initFreeline -Pmirror
,這樣就會從國內鏡像地址來下載。
接入有問題?
接入 Freeline 時有幾點需要注意的[編譯過程也會報錯提醒]:
- debug 模式下不要開啟混淆
- 如果有多個 productFlavor 的話,需要配置指定 flavor
如果第一次運行的時候出現(xiàn)了耗時長達十幾分鐘的話,需要注意一下是否卡在下載 gradle 文件了。檢查的方法即手動執(zhí)行
gradlew checkBeforeCleanBuild
。如果是卡在下載 gradle 文件的話,可以查找一下網(wǎng)絡上相關的資料看下如何解決這個問題。
其他更多關于 Freeline DSL 的使用,可以參考
如何升級?
如果你安裝了 freeline 插件的話,在 Android Studio 中通過以下路徑:Build → Freeline → Check Freeline Update
即可自動檢測新版本,點擊update
按鈕,插件會自動為你進行升級。
當然,你也可以使用命令行的方式來升級 Freeline,修改方法如下:
- 修改 project-level 的
build.gradle
文件,將classpath 'com.antfortune.freeline:gradle:x.x.x'
修改為最新版本 - 在命令行中執(zhí)行(國內的同學推薦加上
-Pmirror
參數(shù)):-
Windows[CMD]:
gradlew initFreeline
-
Linux/Mac:
./gradlew initFreeline
-
Freeline 的局限
- 第一次增量資源編譯的時候可能會有點慢,因為需要額外傳遞一個完整的資源包
- 不支持刪除帶id的資源,否則可能導致aapt編譯出錯
- 暫不支持抽象類的增量編譯
- 我們正在嘗試解決這個問題
- 部分 APT 插件可能需要單獨適配
- 絕大部分 APT 插件還是都支持的
- 不支持開啟 Jack 編譯
- 想要使用 lambda 的話,先使用 Retrolambda 吧
- 不支持 Kotlin / Groovy / Scala
-
能夠支持這幾個基于 JVM 的語言的工具叫做
JRebel for Android,你可以看看
-
Freeline 原理
Freeline 本質上是熱更新技術在編譯期的運用,通過對同一個 apk 進行持續(xù)地熱更新來達到增量編譯的效果。基于 Freeline 進行修改,也能夠實現(xiàn)線上應用的熱修復以及 A/B Test。
Freeline 與其他類似的加速構建方案,比如 Instant Run、Buck、JRebel for Android 有什么區(qū)別呢?開發(fā)者如何來選擇加速構建方案呢?可以參考這個知乎回答:有什么辦法能加快Android Studio中Gradle build速度? - Yong Huang 的回答 - 知乎。
Freeline 的具體原理可參考以下文章:
感覺以下開源項目為 Freeline 的順利開發(fā)提供了幫助:
命令行工具使用
注意,以下說明中的gradlew
分別指代 Windows 環(huán)境下gradlew
,Linux/Mac 環(huán)境下的./gradlew
。
Gradle Task: initFreeline
主要用于下載 freeline 的二進制依賴(包括 python 文件等)和生成工程描述文件。
在 build.gradle 中應用了 freeline gradle 插件之后,initFreeline
這個任務會被添加到 Gradle 工程的根工程上,可以執(zhí)行gradlew initFreelien
來執(zhí)行這個任務。
我們也為 initFreeline 這個任務提供了多種參數(shù)方便開發(fā)者們做一些定制化的修改。
參數(shù):
- mirror
- 使用方法:
gradlew initFreeline -Pmirror
- 參數(shù)說明:將下載鏈接指向國內鏡像。不加參數(shù)的時候,默認從 aws 上進行下載,如果你所處的網(wǎng)絡環(huán)境訪問 aws 有問題的話,加上這個參數(shù)可以讓你獲得更好的下載速度。
- 使用方法:
- freelineVersion
- 使用方法:
gradlew initFreeline -PfreelineVersion=0.8.2
- 參數(shù)說明:下載指定版本的 freeline 依賴文件。注意,使用這個參數(shù)的時候,請務必保證 build.gradle 文件中配置的 freeline 版本與指定要下載的 freeline 版本的版本號是一致的,以免產生一些不必要的編譯錯誤。
- 使用方法:
- freelineTargetUrl
- 使用方法:
gradlew initFreeline -PfreelineTargetUrl="http://xxx.com/freeline.zip"
- 參數(shù)說明:從指定的鏈接處下載 freeline 依賴文件。
- 使用方法:
- freelineCdnUrl
- 使用方法:
gradlew initFreeline -PfreelineCdnUrl="http://xxx.com"
- 參數(shù)說明:使用指定的鏡像處下載,適合訪問外網(wǎng)需要白名單,在內網(wǎng)自己搭建鏡像的同學使用
- 使用方法:
- freelineLocal
- 使用方法:
gradlew initFreeline -PfreelineLocal="your-local-freeline-path"
- 參數(shù)說明:使用已經下載好的 freeline 依賴文件來安裝,參數(shù)指向下載好的 freeline 依賴文件的本地路徑。
- 使用方法:
Gradle Task: checkBeforeCleanBuild
主要用于生成工程描述文件,每次 freeline 全量編譯前會先執(zhí)行一下這個任務。當你執(zhí)行 python 命令提示報錯的時候:freeline_core.exceptions.NoConfigFoundException: xxxxxx/project_description.json not found, please execute gradlew checkBeforeCleanBuild first.
,也需要先執(zhí)行一下gradlew checkBeforeCleanBuild
。
Gradle Build
freeline 為了不污染日常編譯的編譯產物,在執(zhí)行gradlew assemble
之類的編譯命令時,不會啟動 freeline 植入的任務。如果你想要在命令行運行 freeline 的任務,查看 freeline 輸出的日志的話,需要在編譯命令中,加入?yún)?shù)-PfreelineBuild=true
。
freeline gradle 插件會在編譯時,自動為工程加入 freeline 的 runtime 依賴(對于 release、test 版本自動加入 no-op 版本),如果你希望能夠將 freeline runtime 的源碼引入到工程中的話,需要在 freeline DSL 中加入配置,如:
freeline {
...
autoDependency false
}
然后使用 freeline 重新進行編譯。如果要手動在命令行進行編譯的話,需要加入?yún)?shù):-PdisableAutoDependency=true
。
freeline.py
使用 freeline 進行編譯的主要入口,freeline 主要通過 python 來實現(xiàn)跨平臺。
參數(shù):
- -h
- 使用方式:
python freeline.py -h
- 參數(shù)說明:輸出 freeline 的參數(shù)使用說明
- 使用方式:
- -v
- 使用方式:
python freeline.py -v
- 參數(shù)說明:獲取 freeline.py 的版本號
- 使用方式:
- -f
- 使用方式:
python freeline.py -f
- 參數(shù)說明:強制進行全量編譯
- 使用方式:
- -d
- 使用方式:
python freeline.py -d
(注:可與各類參數(shù)疊加使用) - 參數(shù)說明:輸出 freeline 的調試日志(注意:不是對 Android 工程進行調試)
- 使用方式:
- -w
- 使用方式:
python freeline.py -f -w
- 參數(shù)說明:讓應用啟動的時候等待調試工具連接(目前只支持全量編譯的時候配合使用),日常調試推薦直接使用 Android Studio 的
attach debugger to Android process
- 使用方式:
Freeline DSL
Freeline DSL 用來輔助進行工程配置,幫助 freeline 與 Android 工程無縫集成。主要配置在 Android 的主 module 的 build.gradle 文件中,形如:
android {
...
freeline {
... // 具體的配置內容
}
}
注意,當涉及到在配置中定位具體的文件路徑的時候,為了便于團隊協(xié)作共同使用同一份 build.gradle 配置文件,推薦使用類似這樣的方式,來書寫文件路徑:project.rootProject.file("your-relative-path").getAbsolutePath()
以下為具體的配置的說明:
-
hack
- 引入版本:0.5.0,目前已廢棄
- 參數(shù)類型:boolean
- 默認值:false
- 參數(shù)說明:是否使用 freeline 來打包的全局開關
-
buildScript
- 引入版本:0.5.0
- 參數(shù)類型:String
- 默認值:gradlew :main_module:assemble{ProductFlavor}Debug
- 參數(shù)說明:工程的全量編譯腳本,freeline 在全量打包時使用這個命令腳本來編譯出 apk 產物
-
productFlavor
- 引入版本:0.5.0
- 參數(shù)類型:String
- 默認值:""
- 參數(shù)說明:當工程含有多個 productFlavor 的時候,需要指定一個 flavor。如果未指定 flavor,則可能造成編譯失敗報錯退出,會有錯誤日志引導添加這個配置參數(shù)
-
apkPath
- 引入版本:0.5.0
- 參數(shù)類型:String
- 默認值:freeline 會在編譯過程中自動去找到編譯產物 apk 的路徑
- 參數(shù)說明:編譯產物 apk 的路徑,freeline 也有可能找到錯誤的編譯產物路徑,這個時候可以手動配置正確的路徑參數(shù)
-
extraResourceDependencyPaths
- 引入版本:0.5.0
- 參數(shù)類型:List[String]
- 默認值:[]
- 參數(shù)說明:額外的工程的資源依賴路徑。如果使用 freeline 編譯的過程中出現(xiàn)了 aapt 編譯報錯,提示資源沒找到,有可能是某些資源路徑未被 freeline 自動檢測到,這時可以將缺失的資源路徑添加到這個參數(shù)中。注意,資源路徑只需要添加到 res 一級即可,不需要具體到 drawable/layout/.xml/.drawable 這樣的路徑
-
excludeResourceDependencyPaths
- 引入版本:0.5.0,已不需要
- 參數(shù)類型:List[String]
- 默認值:[]
- 參數(shù)說明:排除會導致重復的資源路徑。后期的版本中,通過對 aapt 的修改,繞過了這個問題,已不需要這個參數(shù)
-
excludeHackClasses
- 引入版本:0.5.0
- 參數(shù)類型:List[String]
- 默認值:[]
- 參數(shù)說明:打包過程中,freeline 會對 class 進行插樁,默認會跳過父類為
android/app/Application
的類。如果你有特殊需求需要繞過插樁,可以通過這個配置項進行配置
-
packageName
- 引入版本:0.5.5
- 參數(shù)類型:String
- 默認值:applicationId
- 參數(shù)說明:freeline 默認獲取 applicationId 作為應用的包名。如果你有特殊需求,或者 freeline 獲取到了錯誤的包名的話,可以通過這個配置項配置你指定的包名
-
launcher
- 引入版本:0.5.5
- 參數(shù)類型:String
- 默認值:""
- 參數(shù)說明:freeline 默認從 AndroidManifest.xml 文件中去獲取應用的 launcher Activity,并用于全量編譯后自動啟動應用。如果 freeline 獲取的 launcher 有誤的話,可以通過這個配置項配置你指定的 launcher
-
applicationProxy
- 引入版本:0.7.0
- 參數(shù)類型:boolean
- 默認值:true
- 參數(shù)說明:為了便于快速集成,freeline 默認會替換應用的 Application 類,替換為 FreelineApplication。如果由于這個替換造成了 ClassNotFound 等問題,可以將這里的值置為 false,并手動在你的 Application 類中加入
FreelineCore.init(this);
。修改后,進行編譯之前,記得先 clean,然后再來編譯,避免無謂的錯誤出現(xiàn)
-
autoDependency
- 引入版本:0.7.0
- 參數(shù)類型:boolean
- 默認值:false
- 參數(shù)說明:freeline 自動為應用加載了 runtime 依賴,在非 debug 的 buildType 加載的是 no-op 版本,如果你希望通過引源碼的方式來加入 runtime 依賴,或者手動指定 runtime 的版本,需要將此配置項置為 true,然后再來手動加入依賴
常見問題
常見問題目錄:
- 為什么叫 Freeline?
- Freeline 與 Instant Run有什么區(qū)別?
- 使用 Freeline 時遇見問題怎么辦?
- 如何進行斷點調試?
- 是否支持 Kotlin、Groovy、Scala 等 JVM 語言?
- 是否可以開啟 Jack 來使用 Java 8 的特性?
- 是否會影響 release 打包?
- 為什么 Freeline 會進行全量編譯?
- 不停地提示 check sync status failed /不停地全量編譯?
- Freeline "try to connect device/ connect_device_task failed."
- java.lang.UnsupportedClassVersionError: com/android/build/gradle/AppPlugin : Unsupported major.minor version 52.0
- 資源編譯出錯:Public symbol xxxx declared here is not defined.
- 為什么一啟動就 crash 報錯 NoClassDefFoundError?
- 切換回 Android Studio 的 RUN 時,編譯出錯
- 報錯:NoConfigFoundException
- 與Genymotion自帶的adb發(fā)生沖突
- manifest merge 報錯
- Windows 上為什么沒有類似 Linux/Mac 上的進度條?
- 為什么一直卡在“build increment app”頁面?
- Freeline 根本沒有那么快,你們怎么可以瞎吹牛呢?
使用 Freeline 的過程中如果遇見了任何問題,可以先看下文檔,或者搜索一下已有的 issue,如果還無法解決的話,可以在
上給我們提 issue,我們會盡快幫你解決問題。
為什么叫 Freeline?
對的!是
Freeline,而不是 FreeLine!
Freeline
是一項極限運動,代表著我們對極致速度、極簡、自由的追求。我們希望 Freeline 能夠簡單易用,并有著極致的編譯速度。同時,我們也會持續(xù)地優(yōu)化,繼續(xù)追求 Android 編譯的極致體驗。
Freeline 與 Instant Run有什么區(qū)別?
可以參考知乎回答:有什么辦法能加快Android Studio中Gradle build速度? - Yong Huang 的回答 - 知乎
答案中對比了 Instant Run、Buck (okbuck)、JRebel for Android、Freeline 這幾種加速構建方案。
使用 Freeline 時遇見問題怎么辦?
查看文檔
查看已有的 issue
-
以上兩種方法都無法解決時,可以在
上提 issue 尋求幫助
如何進行斷點調試?
使用 freeline 進行調試跟平時調試基本上是一樣的。推薦選擇 Android Studio 工具欄上的attach debugger to Android process
即可進行斷點調試。如果需要在 Application 的邏輯中進行調試的話,可以使用命令python freeline.py -f -w
,工程會在全量編譯結束啟動時,自動等待 debugger 工具的連接。
注意:python freeline.py -d
僅僅是輸出 freeline 的調試日志而已,并不是真的在對 Android 工程進行調試。
是否支持 Kotlin、Groovy、Scala 等 JVM 語言?
不支持。Freeline 基于
*.java -> *.class -> *.dex
這樣的編譯鏈進行編譯,并通過 multidex 的方案進行增量。故無法支持除 Java 之外的其他 JVM 語言。
是否可以開啟 Jack 來使用 Java 8 的特性?
不支持,原因同上,Jack 改變了編譯鏈(*.java –> *.jack –> *.dex)。
是否會影響 release 打包?
Freeline 對 release 打包幾乎沒有影響。Freeline 在 release 打包的時候自動添加的是no-op
的 runtime 依賴,對FreelineCore.init(this);
函數(shù)是一個空實現(xiàn)。如果你開啟了 Application 代理的話,更是基本上毫無影響,請放心使用。
如果你還是實在放心不下的話,可以在打 release 包的時候,把 freeline 相關的內容注釋掉,然后 clean and build。
為什么 Freeline 會進行全量編譯?
Freeline 在以下幾種情況下會自動進行全量編譯:
- 發(fā)現(xiàn) AndroidManifest.xml 有修改
- 發(fā)現(xiàn) build.gradle 文件有修改
- 發(fā)現(xiàn)有超過 20 個 Java 文件有修改過(通常在使用 git 切換分支的情況會出現(xiàn))
不停地提示 check sync status failed /不停地全量編譯?
以下操作建議使用python freeline.py -d
命令來查看詳細日志:
通常,freeline 在全量編譯后,會自動進行增量編譯,但是在以下幾種情況下,會從增量轉入全量編譯:
- 涉及到 build.gradle、settings.gradle、AndroidManifest.xml 文件有改動
- 增量編譯時,發(fā)現(xiàn)有超過 20 個 java 文件出現(xiàn)改動
也有一種情況,每次都出現(xiàn)一句日志:[WARNING] check sync status failed, a clean build will be automatically executed.
這句日志的意思是,通過 adb 連接上的設備上找到了與本地編譯的項目相同 uuid 的應用(通常是同個項目使用 freeline 打包安裝上的),但是在進行基線校驗的時候校驗失敗,需要重新打包編譯。Freeline 的基線校驗值由 apk 打包的時間與增量次數(shù)共同生成,用于保證本地編譯的版本與設備上安裝的版本是完全一致的。主要是在切換設備的時候,容易出現(xiàn)這個問題。
正常情況下,一次全量編譯后就會恢復正常,但也有可能會反復出現(xiàn)這句日志,一直無法恢復增量編譯,這種時候首先需要檢查一下 PC 上是否連接了多臺設備,或者 Android 模擬器 + 真實設備。如果有的話,首先保持只有一臺設備或者模擬器。
如果還是反復出現(xiàn)這個日志的話,可以嘗試把手機上的 apk 先卸載了,再重新用 freeline 編譯安裝。(如果是這個原因的話,可能是 freeline 的緩存不更新的 bug 導致的,近期會解決)
Freeline "try to connect device/ connect_device_task failed."
排查方法如下(建議配合使用python freeline.py -d
):
- 確定
FreelineCore.init(this);
加入到 Application 類中,且在onCreate()
下的第一行,不要根據(jù)是否在主進程做特殊處理,否則可能導致FreelineService
無法正常啟動;[Freeline 0.7.0+ 開始,默認開啟了 Application 替換,這條可以不用檢查] - 確定
FreelineService
以及 freeline 相關組件是否正常 merge 到最終的 manifest 中,最終的 manifest 路徑在${module}/build/intermediates/manifests
中; - 確定
python freeline.py -v
與定義在 build.gradle 中的 freeline 的版本是否一致; - 確定是否剛剛執(zhí)行了清空app數(shù)據(jù)的操作,freeline 緩存數(shù)據(jù)在
/data/data
路徑,清空app數(shù)據(jù)也會導致連接不上的問題(執(zhí)行 freeline 命令時,通常會有句明顯的日志反復出現(xiàn):server result is -1
); - 確定是否開啟了網(wǎng)絡代理導致
127.0.0.1
被重定向? - 一定要先使用 freeline 來打全量包,再來進行增量,否則也會出現(xiàn)這個問題。即,freeline 的全量編譯與android-studio自帶的RUN會存在沖突。
當上述問題都無法解決時,有個終極的解決方案就是重啟試試...不少人通過重啟順利解決連接不上的問題。。。
java.lang.UnsupportedClassVersionError: com/android/build/gradle/AppPlugin : Unsupported major.minor version 52.0
問題原因,從 Android Studio 2.2 開始,默認使用內置的 Java8 版本,如果你的系統(tǒng)環(huán)境變量中使用的還是 Java7 的話,就會出現(xiàn)這個問題,解決方案就是升級系統(tǒng)的 Java 版本。
資源編譯出錯:Public symbol xxxx declared here is not defined.
Aapt 打資源包報錯。在aapt的參數(shù)中,缺少某些未被freeline自動識別的資源路徑,導致部分資源id沒有被找到。
解決方案,將缺少的資源路徑,在build.gradle
的freeline DSL中加入配置項,如:
freeline {
...
extraResourceDependencyPaths = ['/path/to/resource/directory1', '/path/to/resource/directory2']
}
注意,只需添加到res
路徑即可,不需要具體到drawable
、layout
的具體路徑
為什么一啟動就 crash 報錯 NoClassDefFoundError?
修改一下 build.gradle 文件,添加配置項:
freeline {
...
applicationProxy false
}
在你的Application類中加入:
public class YourApplication extends Application {
public onCreate() {
super.onCreate();
FreelineCore.init(this);
}
}
然后clean,重新打包即可解決問題。
切換回 Android Studio 的 RUN 時,編譯出錯
正常現(xiàn)象。推薦先執(zhí)行gradlew clean
后,再使用 Android Studio 的 RUN,就可以恢復正常了。
報錯:NoConfigFoundException
提示如:NoConfigFoundException:/path/ not found, please execute gradlew checkBeforeCleanBuild first.
terminal 執(zhí)行指令:
-
Linux/Mac:
./gradlew checkBeforeCleanBuild
-
Windows:
gradlew.bat checkBeforeCleanBuild
與Genymotion自帶的adb發(fā)生沖突
$ adb devices
adb server is out of date. killing...
cannot bind 'tcp:5037'
ADB server didn't ACK
*failed to start daemon *
問題出現(xiàn)的原因是 Genymotion 自帶了 adb 工具,會造成沖突。解決的方式是將 Genymotion 所使用的 adb 改為 androidsdk 自帶的 adb。具體可以參考:StackOverflow - How to use adb with genymotion on mac?
manifest merge 報錯
提示如:Exception:
manifest merger failed: uses-sdk:minSdkVersion can not be smaller than 14 declared in library[com.antfortune.freeline:runtime:x.x.x]
工程的 minSdkVersion 比 freeline-runtime 來得低導致的,解決方案如下:
<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="21"
tools:overrideLibrary="com.antfortune.freeline"/>
Windows 上為什么沒有類似 Linux/Mac 上的進度條?
Freeline 在 Windows 上默認開啟 debug 模式,輸出 debug output 信息,原因是 Windows CMD 的 terminal API 無法實現(xiàn)類似的進度條的功能,如果你知道如何實現(xiàn)的話,也歡迎給我們提交 PR :)
為什么一直卡在“build increment app”頁面?
可以搜一下 Github 上相關的 issue,基本都是與你自己的工程或者機器的環(huán)境有關。神方法:重啟試試。
Freeline 根本沒有那么快,你們怎么可以瞎吹牛呢?
這位朋友,歡迎你把使用 Freeline 時出現(xiàn)的日志提示,到
上為我們提個 issue,讓我們一起來探討一下。
EOF
如果對 wiki 有任何疑問或者需要訂正的地方,歡迎聯(lián)系我們。
Freeline Document wirtten by