美文网首页开发工具安卓知识AndroidStudio的使用
AndroidStudio Freeline实现工程秒级编译

AndroidStudio Freeline实现工程秒级编译

作者: Venus_明 | 来源:发表于2016-11-23 11:20 被阅读2975次

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:

  1. 项目路径不能包含中文、空格;
  2. 命令行符号有误,应该是./gradlew initFreeline -Pmirror “-”是减号,并且建议还是要加上镜像-Pmirror否则下载很慢

上面配置可见下图:

根目录-build.gradle 主工程—build.gradle 初始化Freeline依赖 初始化Freeline成功

2.日常开发-增量编译与全量编译

  • 增量编译:python freeline.py
  • 全量编译:python freeline.py -f

Ps:

  1. 第一次必须全量编译,记录设置工程文件的修改信息,后面才可以增量编译,第一次全量编译都比较慢,所以大家要耐着心等待编译完成.
  2. 如果删除带id的资源则必须手动强制全量更新,增量更新会报错
  3. Freeline目前只支持debug buildType,并且不支持混淆
  4. gradle的改变都会触发全量更新
  5. 从Freeline的编译切换到as的编译,必须先clean build一次
  6. 增量更新有可能启动不了关闭的app,但修改已经更新到app里,手动启动app即可看到

全量编译:

全量编译

当全量编译完成,我改动二十几行代码,进行增量编译:

改动代码后的增量编译

结果表示,这个工具很强大,让我们开发效率直线上升,不用再苦苦等着缓慢编译的完成,使用方法简单。为了不加班,大家赶紧用起来吧!

源码可见:https://github.com/alibaba/freeline
如果你的工程结构较为复杂,在第一次使用freeline编译的时候报错了的话,你可以添加一些freeline提供的配置项,来适配你的工程。具体可以看Freeline DSL References

么么哒!

相关文章

网友评论

  • NathansLiu:集成成功后感觉起飞了!
  • 爱听调频的大叔:请问下博主,org.gradle.execution.taskpath.ProjectFinderByTaskPath$ProjectLookupException: Project 'host' not found in root project 'SafeyeCen'.

    一直提示找不到工程。。。博主知道啥情况么,下面还一个错误是: build failed with script: gradlew.bat :host:assembleBetaDebug -P freelineBuild=true --stacktrace,这个问题有遇到过么
  • afa19b0bbb9a:Freeline ERROR
    [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电脑
  • wecode:为什么无法在模拟器中打开测试app呢
  • FynnJason:你好,我有个疑问一直不太理解,就是编译完之后,怎么运行到手机上呢?还是要用AS自带的run到手机上啊,那freeline编译又有什么意义呢?
  • c4f10497f2d7:你好,为什么我的freeline不能使用呢?
    NoClassDefFoundError: com/android/tools/idea/gradle/dsl/model/GradleBuildModel (6 minutes ago)
  • 满天丿星:[ERROR] Freeline ERROR
    [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]
    第一次运行有这个错,遇到过没?
  • 5dd61e5ba369:真好。可以省些时间
    Venus_明: @葬泪 😀
  • 凌空御风:先收藏!
    Venus_明: @凌空御风 😀
  • Wing_Li:Gradle build task is running, please wait a minute...
    每次都有这个,而且都等好久
    Wing_Li:@VenusGoGo 就是按照流程一步一步来的,感觉好像每次都是全量编译。即使我使用增量编译的命令,他也是全量编译。
    Venus_明:@Wing_Li 没遇到过这个情况,你把操作步骤说详细些
  • Souv:项目是不允许有中文路径对吧
    Venus_明:@Souv 嗯,空格也不允许的
  • 皮球二二:唉感觉还是项目从小开始集成这个比较好,大了之后问题就多了。还有你这个跟文档描述是一致的,但是还少了好多配置吧,比如freeLine的dsl
    Venus_明:@r17171709 嗯,加了些注意事项,我马上把freeLine的DSL放上去,谢谢
  • Souv:明天试下,想我i5,8g内存编译要几分钟真心受不了
    Venus_明: @Souv 😀
  • uncochen:感觉很强大,明天试一下,另外,我已经下班了哈哈哈
    Venus_明:@uncochen 好事~
  • Avalon1:赞一个
    Venus_明:@Avalon1 :smile:
  • 清晨傍晚单着:关键还是升级电脑配置。我升级后就不用这个了~
    Venus_明:@清晨傍晚单着 有时候工程比较多,电脑配置升级后效果也不明显
  • 卜俊文:./gradlew initFreeline -Pmirror
    这个命令你是在哪里敲的,我的Terminal好像跟你的不一样啊,打了命令后,他硕'.gradlew' 不是内部或外部命令,也不是可运行的程序,怎么破。。。
    Watire:@卜俊文 先执行个 chmod +x ./gradlew
    卜俊文:@VenusGoGo 没错啊,我就是在As下用Terminal,但是我用./gradlew,他会报" 不是内部或外部命令,也不是可运行的程序
    或批处理文件。
    ",
    Venus_明:@卜俊文 直接在 AS下terminal
  • Alex_Cin:赞,先收藏再说。
    Venus_明: @Alex_Cin 😃
  • SharpChen:还是JRebel吧
    Venus_明:@_Androider 收费啊
  • 妙法莲花1234:可以,一会就上手,帅张推荐的那个不怎么好用
    妙法莲花1234:@追风917 配合 freeline 插件服用更佳,哈哈哈 :smiley:
    妙法莲花1234:@追风917 刚用了,不错,杠杠的,持续玩耍
    Venus_明: @追风917 😃
  • 小邪1214:试试再评论
    Venus_明: @小邪1214 有遇到问题可以找我帮忙
  • 汤建华:我就一个工程
    Venus_明: @汤建华 一个工程如果比较庞大,也推荐你接入试试

本文标题:AndroidStudio Freeline实现工程秒级编译

本文链接:https://www.haomeiwen.com/subject/ymampttx.html