• Android开发:《Gradle Recipes for Android》阅读笔记(翻译)6.1——推荐配置


    问题:

    你想要提高Gradle的构建效率。

    解决方案:

    使用下面推荐的技术组合。

    讨论:

    首先,这里没有可以影响app表现的建议。有很多你可以做的事来提高app,很多都和Android的混淆工具有关。这节不是关于这个的,这节是提高构建本身效率的。

    这节讨论那些可以添加到应用根目录下的gradle.properties文件里面的设置。如果你更喜欢全局设置,home目录下面的.gradle的子文件夹下增加一个gradle.properties文件。

    Gradle守护进程

    Gradle守护进程是一个后台进程,在构建之间保持,缓存数据和代码。当你运行命令提示符时,最新的Gradle会自动的启动守护进程。

    默认的,Android Studio在你的项目里面启动一个Gradle守护进程,持续三个小时,对于大部分开发任务都足够。如果你在命令行运行Gradle,你可能不能自动的启动守护进程。

    为了确保守护进程的启动,可以增加下面的配置:

    org.gradle.daemon=true

    守护进程可以通过命令行标志启动或者停止。使用--daemon和--no-daemon可以在私人配置里面启用或者关闭守护经常。如果你担心内部缓存过期或者你正在测试,关闭守护进程是有效的。如果你想要停止一个正在运行的守护进程,可以使用--stop参数。

    并行编译:

    Gradle有个“孵化”选项用来并行编译独立的项目。使用它可以在gradle.properties里面增加一行:

    org.gradle.parallel=true

    这也许不会有太多用处,因为Android项目里面的modules大部分都是相关的,导致很难从并行编译里面获得好处。

    按需求配置:

    一般Gradle在排除一些任务之前为所有项目的都配置了所有的任务。对于一个有很多子项目和很多任务的项目,这不是很有效。所有可以尝试只配置那些和要求的任务相关的项目。

    在gradle.properties使用“configure on demand”:

    org.gradle.configureondemand=true

    大部分Android应用都只有很少的子项目,所以这个特性并不总是有用。

    这是一个潜伏的特性,所以特定的细节可能会在新版本的Gradle里面改变。

    排除不要的任务:

    在4.3节讨论过,-x标志可以用来排除指定的任务,像lint,耗时但是不是每次构建都需要运行的。

    那节同样展示了如何在任务图里面排斥指定任务。

    改变JVM设置:

    根本上将一个Gradle构建是运行在java进程上的,所有那些影响JVM的参数也影响Gradle的表现。下面展示了一些JVM的设置(在gradle.properties里面):

    org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m
        -XX:+HeapDumpOnOutOfMemoryError

    -Xmx设置java进程使用的最大内存。-Xms设置初始分配给进程的内存。这个例子也改变了持久的空间大小,当java.lang.OutOfMemoryError抛出时,将堆栈存放文件里面。

    可以到Java HotSpot VM页面查看更多细节。

    只使用需要的依赖库:

    这尤其值Google Play服务,经常需要大量的library,并且使用单独的模块。

    例如,使用Google地图,你习惯在编译时添加完整的Google Play服务:

    dependencies {
        compile 'com.google.android.gms:play-service:7.8.0'
    }

    这是一个庞大的库,有许多的依赖,一旦Google Play服务被添加下面一系列的library会被添加:

    由于Android的65K方法名限制,你需要添加大量的你不需要的方法来处理。相反的,你可以只添加地图:

    dependencies {
        compile 'com.google.android.gms:play-service-maps:7.8.0'
    }

    两者之间的差异是戏剧性的:

    使用dex选项:

    Android块允许你之指定“dex”进程的参数。dexOptions块包含下面的选项:

    dexOptions {
        incremental true
        javaMaxHeapSize '2g' 
        jumboMode = true 
        preDexLibraries = true
    }

    incremental选项设置是否启用增量模式。文档说“这有非常多的限制,可能不生效。慎重使用”。

    使用javaMaxHeapSize作为指定Xmx的可选方法。

    启用“jumbo mode”允许在dex文件中出现更多的字符串。如果这是一个问题,你应该花更多的时间配置混淆。

    preDexLibraries会提前允许dx进程。文档描述:“这个可以提高增量构建效率,但是clean会变得慢”。

    这些设置可以提高也可以降低表现,所以在确定使用它们之前进行试验。

    列出配置的概况:

    在命令行使用--profile运行Gradle,生成构建的有用信息。结果生成在build/reports/profile目录下的HTML里面。

    举例,运行多flavor的assembleDebug任务,如下:

    > ./gradlew --profile assembleDebug
    :app:preBuild UP-TO-DATE
    :app:preArrogantStarkDebugBuild UP-TO-DATE
    :app:checkArrogantStarkDebugManifest
    :app:preArrogantStarkReleaseBuild UP-TO-DATE
    :app:preArrogantWayneDebugBuild UP-TO-DATE
    :app:preArrogantWayneReleaseBuild UP-TO-DATE
    :app:preFriendlyStarkDebugBuild UP-TO-DATE
    :app:preFriendlyStarkReleaseBuild UP-TO-DATE
    :app:preFriendlyWayneDebugBuild UP-TO-DATE
    :app:preFriendlyWayneReleaseBuild UP-TO-DATE
    :app:preObsequiousStarkDebugBuild UP-TO-DATE
    :app:preObsequiousStarkReleaseBuild UP-TO-DATE
    :app:preObsequiousWayneDebugBuild UP-TO-DATE
    :app:preObsequiousWayneReleaseBuild UP-TO-DATE
    // ... tons of other tasks ...
    :app:assembleObsequiousWayneDebug
    :app:assembleDebug

    输出的文件在build/reports/profile文件夹下面,类似”profile-YYYY-MM-dd-hh-mm-ss.html“的文件名。

    对于小的项目没有很多看的,但是对于大型项目,这是一个很好地途径来发现瓶颈。

  • 相关阅读:
    ansible-playbook最佳实践
    zabbix 优化之 表分区
    ansible-playbook 打通ssh无秘钥
    jQuery 1.9 移除了 $.browser 的替代方法
    也谈前端基础设施建设
    滚动视差网站欣赏
    css常见的快捷开发代码汇总(长期更新)
    如何让搜索引擎抓取AJAX内容?
    Bookmarklet编写指南
    20个网页设计师应该学习的CSS3经典教程实例
  • 原文地址:https://www.cnblogs.com/tootwo2/p/6512679.html
Copyright © 2020-2023  润新知