Freeline 一款 Android平臺上的秒級編譯方案

參考: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 DSL References

如何升級?

如果你安裝了 freeline 插件的話,在 Android Studio 中通過以下路徑:Build → Freeline → Check Freeline Update即可自動檢測新版本,點擊update按鈕,插件會自動為你進行升級。

當然,你也可以使用命令行的方式來升級 Freeline,修改方法如下:

  1. 修改 project-level 的build.gradle文件,將classpath 'com.antfortune.freeline:gradle:x.x.x'修改為最新版本
  2. 在命令行中執(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 的過程中如果遇見了任何問題,可以先看下文檔,或者搜索一下已有的 issue,如果還無法解決的話,可以在

Github

上給我們提 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 時遇見問題怎么辦?

  1. 查看文檔

  2. 查看已有的 issue

  3. 以上兩種方法都無法解決時,可以在

    Github

    上提 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):

  1. 確定FreelineCore.init(this);加入到 Application 類中,且在onCreate()下的第一行,不要根據(jù)是否在主進程做特殊處理,否則可能導致FreelineService無法正常啟動;[Freeline 0.7.0+ 開始,默認開啟了 Application 替換,這條可以不用檢查]
  2. 確定FreelineService以及 freeline 相關組件是否正常 merge 到最終的 manifest 中,最終的 manifest 路徑在${module}/build/intermediates/manifests中;
  3. 確定python freeline.py -v與定義在 build.gradle 中的 freeline 的版本是否一致;
  4. 確定是否剛剛執(zhí)行了清空app數(shù)據(jù)的操作,freeline 緩存數(shù)據(jù)在/data/data路徑,清空app數(shù)據(jù)也會導致連接不上的問題(執(zhí)行 freeline 命令時,通常會有句明顯的日志反復出現(xiàn):server result is -1);
  5. 確定是否開啟了網(wǎng)絡代理導致127.0.0.1被重定向?
  6. 一定要先使用 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路徑即可,不需要具體到drawablelayout的具體路徑

為什么一啟動就 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)的日志提示,到

Github

上為我們提個 issue,讓我們一起來探討一下。

EOF

如果對 wiki 有任何疑問或者需要訂正的地方,歡迎聯(lián)系我們。

Freeline Document wirtten by

Yong

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,443評論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,530評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,407評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,981評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,759評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,204評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,263評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,415評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 48,955評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,650評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,892評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,675評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,967評論 2 374

推薦閱讀更多精彩內容