Android开发工具编译痛点
现在Android开发工具应该大部分都是Android Studio吧,对于一个大型App来说,动辄就是十几个工程相互依赖,稍微改几行代码,跑一下都得好几分钟,当然这跟电脑的配置也有关系。虽然目前google推出InstantRun,在AS 2.0上使用的一个插件,用于提高编译速度,但是就我使用后的感觉来说,并不是很理想,可能是我们这边工程较为复杂,编译完完整的工程也得需要一两分钟。在这里羡慕下Xcode秒级编译速度,肯定的是,很多Android开发友们也有这样的感觉。
为了解决这个痛点,最近公司有一个同事调研了Freeline这个工具,结果是非常惊喜的,增量编译是秒级别的,在这里,我不骗大家!!很荣幸可以认识使用它。
Freeline介绍
Freeline是蚂蚁金服旗下一站式理财平台蚂蚁聚宝团队在Android平台上的量身定做的一个基于动态替换的编译方案,稳定性方面:完善的基线对齐,进程级别异常隔离机制。性能方面:内部采用了类似Facebook的开源工具buck的多工程多任务并发思想, 并对代码及资源编译流程做了深入的性能优化。
简单来说,就是阿里提供的一个增量编译方案,主要是为了加快日常开发过程中的项目编译速度,但是目前只支持debug模式非混淆的开发。
Pros
支持大多数场景的增量编译
支持retrolambda与注解
支持so动态替换
支持Windows/Linux/macOS
App crash后,仍然可以通过增量编译来修复
大多数情况下增量编译可以在10s内完成
Cons
初次接入可能存在一定的问题,需要稍微花点时间来解决
在简单的工程上,与其他构建方案相比,没有明显的优势
不支持删除带id的资源,会报错
不支持Kotlin
这边直接进入Freeline的使用方法讲解,使用其实也很简单,请跟着司机走~
Freeline使用
1.Freeline接入
- 在根目录的build.gradle中添加classpath 'com.antfortune.freeline:gradle:${latest-version}',目前最新版本为0.8.2
- 在主工程(application工程)的build.gradle中添加 apply plugin: 'com.antfortune.freeline'
- ./gradlew initFreeline -Pmirror:初始化Freeline相关依赖, 也可以使用参数-PfreelineVersion={your-specific-version}来下载特定版本的 freeline 依赖,在所在项目的终端运行以上命令行即可。
Ps:
- 项目路径不能包含中文、空格;
- 命令行符号有误,应该是./gradlew initFreeline -Pmirror “-”是减号,并且建议还是要加上镜像-Pmirror否则下载很慢
上面配置可见下图:
根目录-build.gradle 主工程—build.gradle 初始化Freeline依赖 初始化Freeline成功2.日常开发-增量编译与全量编译
- 增量编译:python freeline.py
- 全量编译:python freeline.py -f
Ps:
- 第一次必须全量编译,记录设置工程文件的修改信息,后面才可以增量编译,第一次全量编译都比较慢,所以大家要耐着心等待编译完成.
- 如果删除带id的资源则必须手动强制全量更新,增量更新会报错
- Freeline目前只支持debug buildType,并且不支持混淆
- gradle的改变都会触发全量更新
- 从Freeline的编译切换到as的编译,必须先clean build一次
- 增量更新有可能启动不了关闭的app,但修改已经更新到app里,手动启动app即可看到
全量编译:
全量编译当全量编译完成,我改动二十几行代码,进行增量编译:
改动代码后的增量编译结果表示,这个工具很强大,让我们开发效率直线上升,不用再苦苦等着缓慢编译的完成,使用方法简单。为了不加班,大家赶紧用起来吧!
源码可见:https://github.com/alibaba/freeline
如果你的工程结构较为复杂,在第一次使用freeline编译的时候报错了的话,你可以添加一些freeline提供的配置项,来适配你的工程。具体可以看Freeline DSL References。
么么哒!
网友评论
一直提示找不到工程。。。博主知道啥情况么,下面还一个错误是: build failed with script: gradlew.bat :host:assembleBetaDebug -P freelineBuild=true --stacktrace,这个问题有遇到过么
[ERROR] --------------------------------------------------------
Traceback (most recent call last):
File "/Users/berlin/Downloads/AndroidZhuishushenqi/AndroidZhuishushenqi/freeline/freeline_core/task.py", line 123, in execute
self.task.execute()
File "/Users/berlin/Downloads/AndroidZhuishushenqi/AndroidZhuishushenqi/freeline/freeline_core/gradle_clean_build.py", line 74, in execute
output, err, code = cexec(command.split(' '), callback=None)
File "/Users/berlin/Downloads/AndroidZhuishushenqi/AndroidZhuishushenqi/freeline/freeline_core/utils.py", line 28, in cexec
p = Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE, env=env, cwd=cwd)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 710, in __init__
errread, errwrite)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 1335, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
撸主 这是个啥意思? mac电脑
NoClassDefFoundError: com/android/tools/idea/gradle/dsl/model/GradleBuildModel (6 minutes ago)
[ERROR] --------------------------------------------------------
Traceback (most recent call last):
File "D:\GitlabProject\Android\V9.5.0\iCredit\freeline_core\task.py", line 123, in execute
self.task.execute()
File "D:\GitlabProject\Android\V9.5.0\iCredit\freeline_core\gradle_clean_build.py", line 75, in execute
output, err, code = cexec(command.split(' '), callback=None)
File "D:\GitlabProject\Android\V9.5.0\iCredit\freeline_core\utils.py", line 28, in cexec
p = Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE, env=env, cwd=cwd)
File "D:\Program Files\Python\lib\subprocess.py", line 711, in __init__
errread, errwrite)
File "D:\Program Files\Python\lib\subprocess.py", line 959, in _execute_child
startupinfo)
WindowsError: [Error 2]
第一次运行有这个错,遇到过没?
每次都有这个,而且都等好久
这个命令你是在哪里敲的,我的Terminal好像跟你的不一样啊,打了命令后,他硕'.gradlew' 不是内部或外部命令,也不是可运行的程序,怎么破。。。
或批处理文件。
",