Skip to content

常见问题

Yong edited this page Nov 30, 2016 · 5 revisions

为什么叫 Freeline?

对的!是 Freeline,而不是 FreeLine!

Freeline 是一项极限运动,代表着我们对极致速度、极简、自由的追求。我们希望 Freeline 能够简单易用,并有着极致的编译速度。同时,我们也会持续地优化,继续追求 Android 编译的极致体验。

Freeline 与 Instant Run有什么区别?

可以参考知乎回答:有什么办法能加快Android Studio中Gradle build速度? - Yong Huang 的回答 - 知乎

答案中对比了 Instant Run、Buck (okbuck)、JRebel for Android、Freeline 这几种加速构建方案。

如何进行断点调试?

使用 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);函数是一个空实现。如果你开启了 Application 代理的话,更是基本上毫无影响,请放心使用。

如果你还是实在放心不下的话,可以在打 release 包的时候,把 freeline 相关的内容注释掉,然后 clean and build。

为什么 Freeline 会进行全量编译?

Freeline 在以下几种情况下会自动进行全量编译:

  • 发现 AndroidManifest.xml 有修改
  • 发现 build.gradle 文件有修改
  • 发现有超过 20 个 Java 文件有修改过(通常在使用 git 切换分支的情况会出现)

不停地提示 check sync error/不停地全量编译?

首先检查一下,是否连接了多台设备?或者连接一台手机以及打开了一个Android模拟器?

如果有的话,保持只有一个设备连接。

如果没有的话,尝试卸载掉手机上安装的 app,然后重新编译安装。

Freeline "try to connect device/ connect_device_task failed."

排查方法如下(建议配合使用python freeline.py -d):

  1. 确定FreelineCore.init(this);加入到 Application 类中,且在onCreate()下的第一行,不要根据是否在主进程做特殊处理,否则可能导致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. 确定是否刚刚执行了清空app数据的操作,freeline 缓存数据在/data/data路径,清空app数据也会导致连接不上的问题(执行 freeline 命令时,通常会有句明显的日志反复出现:server result is -1);
  5. 确定是否开启了网络代理导致127.0.0.1被重定向?
  6. 一定要先使用 freeline 来打全量包,再来进行增量,否则也会出现这个问题。即,freeline 的全量编译与android-studio自带的RUN会存在冲突。

当上述问题都无法解决时,有个终极的解决方案就是重启试试...不少人通过重启顺利解决连接不上的问题。。。

资源编译出错:Public symbol xxxx declared here is not defined.

Aapt 打资源包报错。在aapt的参数中,缺少某些未被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 时,编译出错

正常现象。推荐先执行gradlew clean后,再使用 Android Studio 的 RUN,就可以恢复正常了。

报错:NoConfigFoundException

提示如:NoConfigFoundException:/path/ not found, please execute gradlew checkBeforeCleanBuild first.

terminal 执行指令:

  • Linux/Mac: ./gradlew checkBeforeCleanBuild
  • Windows: gradlew.bat checkBeforeCleanBuild

与Genymotion自带的adb发生冲突

$ adb devices
adb server is out of date.  killing...
cannot bind 'tcp:5037'
ADB server didn't ACK
*failed to start daemon *

问题出现的原因是 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 无法实现类似的进度条的功能,如果你知道如何实现的话,也欢迎给我们提交 PR :)

为什么一直卡在“build increment app”页面?

可以搜一下 Github 上相关的 issue,基本都是与你自己的工程或者机器的环境有关。神方法:重启试试。