美文网首页开发工具安卓知识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]
        第一次运行有这个错,遇到过没?
      • 葬泪:真好。可以省些时间
        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