-
Notifications
You must be signed in to change notification settings - Fork 622
常见问题
对的!是 Freeline,而不是 FreeLine!
Freeline 是一项极限运动,代表着我们对极致速度、极简、自由的追求。我们希望 Freeline 能够简单易用,并有着极致的编译速度。同时,我们也会持续地优化,继续追求 Android 编译的极致体验。
可以参考知乎回答:有什么办法能加快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 工程进行调试。
不支持。Freeline 基于 *.java -> *.class -> *.dex
这样的编译链进行编译,并通过 multidex 的方案进行增量。故无法支持除 Java 之外的其他 JVM 语言。
不支持,原因同上,Jack 改变了编译链(*.java –> *.jack –> *.dex)。
Freeline 对 release 打包几乎没有影响。Freeline 在 release 打包的时候自动添加的是no-op
的 runtime 依赖,对FreelineCore.init(this);
函数是一个空实现。如果你开启了 Application 代理的话,更是基本上毫无影响,请放心使用。
如果你还是实在放心不下的话,可以在打 release 包的时候,把 freeline 相关的内容注释掉,然后 clean and build。
Freeline 在以下几种情况下会自动进行全量编译:
- 发现 AndroidManifest.xml 有修改
- 发现 build.gradle 文件有修改
- 发现有超过 20 个 Java 文件有修改过(通常在使用 git 切换分支的情况会出现)
首先检查一下,是否连接了多台设备?或者连接一台手机以及打开了一个Android模拟器?
如果有的话,保持只有一个设备连接。
如果没有的话,尝试卸载掉手机上安装的 app,然后重新编译安装。
排查方法如下(建议配合使用python freeline.py -d
):
- 确定
FreelineCore.init(this);
加入到 Application 类中,且在onCreate()
下的第一行,不要根据是否在主进程做特殊处理,否则可能导致FreelineService
无法正常启动;[Freeline 0.7.0+ 开始,默认开启了 Application 替换,这条可以不用检查] - 确定
FreelineService
以及 freeline 相关组件是否正常 merge 到最终的 manifest 中,最终的 manifest 路径在${module}/build/intermediates/manifests
中; - 确定
python freeline.py -v
与定义在 build.gradle 中的 freeline 的版本是否一致; - 确定是否刚刚执行了清空app数据的操作,freeline 缓存数据在
/data/data
路径,清空app数据也会导致连接不上的问题(执行 freeline 命令时,通常会有句明显的日志反复出现:server result is -1
); - 确定是否开启了网络代理导致
127.0.0.1
被重定向? - 一定要先使用 freeline 来打全量包,再来进行增量,否则也会出现这个问题。即,freeline 的全量编译与android-studio自带的RUN会存在冲突。
当上述问题都无法解决时,有个终极的解决方案就是重启试试...不少人通过重启顺利解决连接不上的问题。。。
Aapt 打资源包报错。在aapt的参数中,缺少某些未被freeline自动识别的资源路径,导致部分资源id没有被找到。
解决方案,将缺少的资源路径,在build.gradle
的freeline DSL中加入配置项,如:
freeline {
...
extraResourceDependencyPaths = ['/path/to/resource/directory1', '/path/to/resource/directory2']
}
注意,只需添加到res
路径即可,不需要具体到drawable
、layout
的具体路径
修改一下 build.gradle 文件,添加配置项:
freeline {
...
applicationProxy false
}
在你的Application类中加入:
public class YourApplication extends Application {
public onCreate() {
super.onCreate();
FreelineCore.init(this);
}
}
然后clean,重新打包即可解决问题。
正常现象。推荐先执行gradlew clean
后,再使用 Android Studio 的 RUN,就可以恢复正常了。
提示如:NoConfigFoundException:/path/ not found, please execute gradlew checkBeforeCleanBuild first.
terminal 执行指令:
- Linux/Mac:
./gradlew checkBeforeCleanBuild
- Windows:
gradlew.bat checkBeforeCleanBuild
$ 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?
提示如: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"/>
Freeline 在 Windows 上默认开启 debug 模式,输出 debug output 信息,原因是 Windows CMD 的 terminal API 无法实现类似的进度条的功能,如果你知道如何实现的话,也欢迎给我们提交 PR :)
可以搜一下 Github 上相关的 issue,基本都是与你自己的工程或者机器的环境有关。神方法:重启试试。