问题:

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

解决方案:

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

讨论:

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

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

Gradle守护进程

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

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

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

  1. org.gradle.daemon=true

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

并行编译:

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

  1. org.gradle.parallel=true

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

按需求配置:

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

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

  1. org.gradle.configureondemand=true

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

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

排除不要的任务:

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

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

改变JVM设置:

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

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

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

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

只使用需要的依赖库:

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

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

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

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

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

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

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

使用dex选项:

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

  1. dexOptions {
  2. incremental true
  3. javaMaxHeapSize '2g'
  4. jumboMode = true
  5. preDexLibraries = true
  6. }

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

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

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

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

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

列出配置的概况:

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

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

  1. > ./gradlew --profile assembleDebug
  2. :app:preBuild UP-TO-DATE
  3. :app:preArrogantStarkDebugBuild UP-TO-DATE
  4. :app:checkArrogantStarkDebugManifest
  5. :app:preArrogantStarkReleaseBuild UP-TO-DATE
  6. :app:preArrogantWayneDebugBuild UP-TO-DATE
  7. :app:preArrogantWayneReleaseBuild UP-TO-DATE
  8. :app:preFriendlyStarkDebugBuild UP-TO-DATE
  9. :app:preFriendlyStarkReleaseBuild UP-TO-DATE
  10. :app:preFriendlyWayneDebugBuild UP-TO-DATE
  11. :app:preFriendlyWayneReleaseBuild UP-TO-DATE
  12. :app:preObsequiousStarkDebugBuild UP-TO-DATE
  13. :app:preObsequiousStarkReleaseBuild UP-TO-DATE
  14. :app:preObsequiousWayneDebugBuild UP-TO-DATE
  15. :app:preObsequiousWayneReleaseBuild UP-TO-DATE
  16. // ... tons of other tasks ...
  17. :app:assembleObsequiousWayneDebug
  18. :app:assembleDebug

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

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

Android开发:《Gradle Recipes for Android》阅读笔记(翻译)6.1——推荐配置的更多相关文章

  1. Android开发工具全面转向Android Studio(3)——AS project/module的目录结构(与Eclipse对比)

    如果AS完全还没摸懂的,建议先看下Android开发工具全面转向Android Studio(2)——AS project/module的CRUD. 注:以下以Windows平台为标准,AS以目前最新 ...

  2. Android开发工具全面转向Android Studio(2)——AS project/module的CRUD

    本文有些地方可能需要衔接Android开发工具全面转向Android Studio(1)——准备开发环境,读起来效果会更好. 这个世界很奇妙,所有的东西离不开CRUD,即增删改查.即使人本身也遵循这个 ...

  3. 配置cordova的android开发环境(无android studio)

    原文:配置cordova的android开发环境(无android studio) 趁元旦放假想试一下cordova,不想安装庞大的android studio,所以想最小化安装,居然花了一整天的时间 ...

  4. 收集整理Android开发所需的Android SDK、开发中用到的工具、Android开发教程、Android设计规范,免费的设计素材等。

    AndroidDevTools Android Dev Tools官网地址:www.androiddevtools.cn 收集整理Android开发所需的Android SDK.开发中用到的工具.An ...

  5. Eclipse搭建Android开发环境并运行Android项目

    Eclipse搭建Android开发环境并运行Android项目 (详细) 安装环境: window 10 64位 安装工具: JDK.Eclipse.SDK.ADT 安装步骤: 1.JAVA JDK ...

  6. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)6.2——DSL文档

    问题: 你需要查找Android Gradle DSL的完整文档. 解决方案: 访问Gradle Tools网站,从Android开发网站下载ZIP文件. 讨论:Android开发网站首页有完整的AP ...

  7. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)5.1——单元测试

    问题: 你想要测试app中的非android部分. 解决方案: 可以使用Android Studio1.1里面增加的单元测支持和Android的Gradle插件. 讨论: ADT插件只支持集成测试,并 ...

  8. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)2.3——用Eclipse ADT导出App

    问题: 想在一个已经存在的Eclipse ADT的项目中使用Gradle 解决方案: Eclipse ADT插件可以帮助生成Gradle文件 讨论: Eclipse的ADT插件是在2013年推出Gra ...

  9. Android开发:《Gradle Recipes for Android》阅读笔记1.2

    在android开发中会需要配置使用app的android SDK的最低版本和目标版本,这个是bulidl.gradle的android模块设置.默认有以下几个设置: applicationId,这个 ...

随机推荐

  1. Drupal启动阶段之三:数据库

    Drupal在数据库启动阶段仅仅是简单地包含了database.inc文件,然后再注册类加载器: function _drupal_bootstrap_database() { // Initiali ...

  2. 【MySQL】设置字符集UTF-8(解决)

    1.检查你需要的字符集,GBK或者UTF8 2.数据库是否是UTF8, 3.数据表是否是UTF8 4.模板是否设置了UTF-8 以上都没设置错误,那么继续往下看: 进入目标数据库,使用语句: SHOW ...

  3. 织梦dedecms修改include和plus重命名提高安全性防漏洞注入挂马

    织梦dedecms是新手站长使用得比较多的一个建站开源程序,正因如此,也是被被入侵挂马比较多的程序.下面就来跟大家说一下怎么重新命名dedecms的include文件夹以及plus文件夹来提高网站的安 ...

  4. Lintcode---单词的添加与查找

    设计一个包含下面两个操作的数据结构:addWord(word), search(word) addWord(word)会在数据结构中添加一个单词.而search(word)则支持普通的单词查询或是只包 ...

  5. jquery遍历总结(转)

    遍历 DOM jQuery 提供了多种遍历 DOM 的方法. 遍历方法中最大的种类是树遍历(tree-traversal). 下一章会讲解如何在 DOM 树中向上.下以及同级移动. 向上遍历 DOM ...

  6. js限制文本框只能输入数字方法

    输入大于0的正整数 <input onkeyup="if(this.value.length==1){this.value=this.value.replace(/[^1-9]/g,' ...

  7. VS编译duilib项目时候的错误解决方法整理

    @1:找不到Riched20.lib 用everything等软件搜索下磁盘.找到所在的文件夹加入到vs的库文件夹就可以.我得是C:\Program Files (x86)\Microsoft SDK ...

  8. 关于UNIX/Linux下安装《UNIX环境高级编程》源代码的问题

    <UNIX环境高级编程(第三版)>是一本广为人知的unix系统编程书籍. 但是,书中的代码示例,要想正确的编译运行,要先做好准备工作: 1.下载源代码 传送门:http://apueboo ...

  9. poj 1475 Pushing Boxes 推箱子(双bfs)

    题目链接:http://poj.org/problem?id=1475 一组测试数据: 7 3 ### .T. .S. #B# ... ... ... 结果: //解题思路:先判断盒子的四周是不是有空 ...

  10. Struts提交form之后抛出异常java.lang.IllegalArgumentException: The path of an ForwardConfig cannot be null

    原因:在ActionForm中使用了ActionErrors,并且ActionErrors中的内容不为空,所以Struts会根据action的配置跳转到input指定的页面.但是我在配置action的 ...