美文网首页知识 | 解析Android 技术开发程序员
【译】我每周在构建Gradle时是如何节约出5小时的

【译】我每周在构建Gradle时是如何节约出5小时的

作者: Hidetag | 来源:发表于2016-10-28 12:05 被阅读3560次

    原文链接

    Gradle是一个基于JVM可以用于构建Android工程的编译工具。它和Ant以及Maven类似,但是比他们更优秀。随着Android项目变得越来越复杂,模块化地开发也越来越流行,所以构建的效率性能变得至关重要。每次构建项目中节省几秒,这对于整个项目和工作来说有极大的效率提升。

    你们可能已经意识到,即使是最简单的Gradle调用也比较慢。在我的Mac上,大约需要6秒钟来简单地列出项目的可用gradlew。

    下面是一些能够提升Gradle执行效率的提示:

    Gradle Daemon(Gradle守护进程)

    你可以减少Gradle的启动时间(在我的电脑上下降到2秒钟),下面是使用守护进程来构建项目:

    org.gradle.daemon=true

    Parallel Project Execution(并行项目执行)

    如果你正在构建一个具有很多Module并且依赖比较关系比较复杂的项目,那么这个改动能对你产生比较重要的影响:

    org.gradle.parallel=true

    Configure projects on demand(根据需求配置项目)

    Gradle在执行任务之前会配置每个项目,并且不管这个项目是否需要特定的构建。"Configure projects on demand"模式可以改变这种方式,只配置所需要的项目。像"Parallel Project Execution"一样,"Configure projects on demand"将对这种多项目并且依赖关系复杂的项目产生重要的影响。

    Global gradle.properties(Gradle全局配置文件)

    在Gradle主目录中定义或者配置的属性优先级高于在项目目录中文件定义的属性。原因是你想避免在你的构建服务器上使用Gradle守护进程,而内存消耗肯定是比启动时间更重要的:

    /Users/cesarferreira/.gradle/gradle.properties

    # The Gradle daemon aims to improve the startup and execution time of Gradle.
    # When set to true the Gradle daemon is to run the build.
    org.gradle.daemon=true
    
    # Specifies the JVM arguments used for the daemon process.
    # The setting is particularly useful for tweaking memory settings.
    # Default value: -Xmx10248m -XX:MaxPermSize=256m
    org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
    
    # When configured, Gradle will run in incubating parallel mode.
    # This option should only be used with decoupled projects. More details, visit
    # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
    org.gradle.parallel=true
    
    # Enables new incubating mode that makes Gradle selective when configuring projects.
    # Only relevant projects are configured which results in faster builds for large multi-projects.
    # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:configuration_on_demand
    org.gradle.configureondemand=true
    

    使用Module是有代价的...我的意思是真的有代价!

    为了构建我目前的linkedcare项目,我不得不去寻找并且fork一些相对适合但不是特别适合我项目的一些依赖库。
    如果这些模块没有被不断修改,考虑这一点非常重要:从头开始编译它们,或者甚至是检查以前的模块是否是最新版本的,所需的时间是直接将该依赖加载为二进制.jar / .aar的四倍,也就是说每次编译Gradle都要去检查依赖是不是最新的,这将花费大量时间。
    提示:运行gradle build -profile获取HTML报告,显示构建过程的时间。
    注意:在版本控制系统中保留“不必要的”模块,以便于对该依赖的快速修复/改进。

    从4分钟到21秒

    基于以上这些优化方式,我们来看看效果:

    21秒?好吧,还不算太差

    任务执行配置

    lint任务

    如果你看看你的任务执行配置文件,你会发现lint任务需要很多时间,你真的需要检查lint输出的增量构建吗? 把它取消吧:

    gradle build -x lint

    缩短到15秒了,很好!

    12秒减少到8秒

    lint vital release还是占用了比较多时间

    另一个lint任务检查,这个任务几乎占据了我们目前构建项目总时间的90%。好吧,现在也将这个任务取消掉:

    gradle build -x lint -x lintVitalRelease

    哈哈哈哈啊哈哈!一直减少到8秒啦

    提示:如果要从增量构建中永久跳过lint检查,可以将其添加到build.gradle中:

    tasks.whenTaskAdded { task ->
        if (task.name.equals("lint")) {
            task.enabled = false
        }
    }
    

    总结一下:

    • 在Gradle目录下有一个全局gradle.properties,所有的项目将继承它(Android中Module的单个Gradle配置文件优先级低于全局的);
    • 运行Gradle build profile工具;
    • 坚持基本模块依赖(基于配置文件工具结果);
    • 跳过不成功的Gradle任务;

    联系原文作者:

    如果您有任何问题或想要分享您的结果->我的twitter @cesarmcferreira☺

    相关文章

      网友评论

      • 锄禾少年不太帅:要写就写清楚,写的不清不楚不知道你想表达什么
        Hidetag:@邹树人_a 前面10楼的人都看清了,就你没看清是么。我标题就注明了,这是一篇译文。
      • 十二点方向:没看明白
        这个gradle.properties是android项目里面的文件
        还是我的as里面自带gradle文件里面的这里我没有找到
        用户目录下面.gradle文件夹中找到不止一个gradle.properties文件
        蒙了。
        希望楼主指教下。 :smile:
      • d0b6ac0d2689:这些命令是放在哪个文件里面呢
      • 丨寂夜丨孤城:gradle build -x lint
        gradle build -x lint -x lintVitalRelease

        放在哪个文件呢。
      • 674fa1c36ad3:执行 gradle build -profile 生成的文件在哪里呀 ~找不到 楼主~
        周公在世:@廷皓 build/reports/profile下
      • 梁怀0_o:mark
        Hidetag:@怀0_o :sunglasses:
      • 2cffbcb5d8e1:mark,对我很有帮助
        Hidetag:@灼伤的影子 :kissing_heart:

      本文标题:【译】我每周在构建Gradle时是如何节约出5小时的

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