17个小技巧让你的Gradle构建速度飞起来!

保持你的工具是最新的

Android工具包支持的构建往往是最新的,所以官方的一些建议和技巧往往都是针对于最新版本的。所以,为了充分利用最新的定制化,保持一下工具是最新的:
Android Studio and SDK tools
The Android plugin for Gradle

创建变体

当你开发你的app的时候,发布版本的gradle当中的很多配置完全是不需要的。启用不必要的构建进程会降低你的构建速度,所以通过配置build variant 可以在你开发app时构建你所需要的配置。下面的例子是创建一个dev版本的和一个prod版本:

android {
  ...
  defaultConfig {...}
  buildTypes {...}
  productFlavors {
    // When building a variant that uses this flavor, the following configurations
    // override those in the defaultConfig block.
    dev {
      // To avoid using legacy multidex when building from the command line,
      // set minSdkVersion to 21 or higher. When using Android Studio 2.3 or higher,
      // the build automatically avoids legacy multidex when deploying to a device running
      // API level 21 or higher—regardless of what you set as your minSdkVersion.
      minSdkVersion 21
      versionNameSuffix "-dev"
      applicationIdSuffix '.dev'
    }

    prod {
      // If you've configured the defaultConfig block for the release version of
      // your app, you can leave this block empty and Gradle uses configurations in
      // the defaultConfig block instead. You still need to create this flavor.
      // Otherwise, all variants use the "dev" flavor configurations.
    }
  }
}

避免编译不需要的资源

android {
  ...
  productFlavors {
    dev {
      ...
      // The following configuration limits the "dev" flavor to using
      // English stringresources and xxhdpi screen-density resources.
      resConfigs "en", "xxhdpi"
    }
    ...
  }
}

关掉Crashlytics对于debug构建

android {
  ...
  buildTypes {
    debug {
      ext.enableCrashlytics = false
    }
}

使用静态构建配置

int MILLIS_IN_MINUTE = 1000 * 60
int minutesSinceEpoch = System.currentTimeMillis() / MILLIS_IN_MINUTE

android {
    ...
    defaultConfig {
        // Making either of these two values dynamic in the defaultConfig will
        // require a full APK build and reinstallation because the AndroidManifest.xml
        // must be updated (which is not supported by Instant Run).
        versionCode 1
        versionName "1.0"
        ...
    }

    // The defaultConfig values above are fixed, so your incremental builds don't
    // need to rebuild the manifest (and therefore the whole APK, slowing build times).
    // But for release builds, it's okay. So the following script iterates through
    // all the known variants, finds those that are "release" build types, and
    // changes those properties to something dynamic.
    applicationVariants.all { variant ->
        if (variant.buildType.name == "release") {
            variant.mergedFlavor.versionCode = minutesSinceEpoch;
            variant.mergedFlavor.versionName = minutesSinceEpoch + "-" + variant.flavorName;
        }
    }
}

使用静态依赖版本

当你使用版本依赖在build.gradle中,你应该避免使用带+号的本本,例如'com.android.tools.build:gradle:2.+'.。使用动态的版本号可能会引起无法预期的版本更新,增加解决版本差异的难度,并且由于Gradle检查更新会降低构建速度。所以你应该使用静态的版本数字号来代替。

打开Offline模式

QQ20170613-115423.png
  1. 打开Preferences,点击File>Settings.
  2. 左边面板,点击Build,Execution,Deployment>Gradle.
  3. 勾选offline work选项.
  4. 点击Apply 或者 Ok.https://docs.gradle.org/current/userguide/more_about_tasks.html

打开配置

configure on demand.png
  1. 打开Preferences,点击File>Settings.
  2. 左边面板,点击Build,Execution,Deployment>Compiler.
  3. 勾选Configure on demand项.
  4. 点击Apply 或者 Ok.

创建library模块

找出你app中可以模块化的代码。模块化你的代码可以令构建系统只编译你修改的modules并且为未来的构建缓存。它还可以令 configuration on demand& parallel project execution更加有效率。

创建Task对于自定义构建逻辑

当你构建项目的时候,如果你发现构建log日志中出现了很长时间的Configuring Projects,这时候回顾一下build.gradle文件中的语法,然后找出你可以引入到一个自定义的Gradle task中。这样的好处是,构建的结果可以被缓存。了解更多,阅读official Gradle documentation

配置dexOptions打开pre-dexing

Android plugin 提供了dexOptions block,所以你可以配置可以提高构建速度的DEX build属性:

  • preDexLibraries
  • maxProcessCount
  • javaMaxHeapSize
    例如:
android {
  ...
  dexOptions {
    preDexLibraries true
    maxProcessCount 8
    // Instead of setting the heap size for the DEX process, increase Gradle's
    // heap size to enable dex-in-process. To learm more, read the next section.
    // javaMaxHeapSize "2048m"
  }
}

增加Gradle的堆内存大小

org.gradle.jvmargs = -Xmx2048m

转换images成WebP

WebP是一种提供有损压缩(类似JPEG)当然也有透明度(类似PNG),但是能够提供更好的压缩性能比起JPEG和PNG。在未执行构建时间内的压缩图片来达到减少图片文件大小,并且可以加速你的构建速度,特别是当你的app使用了很多个图片资源。然而,你也许会注意到设备CPU的使用量会有一小段上升当解压WebP图片。使用Android Studio,你就可以很容易的使用 convert your images to WebP

禁用PNG crunching

如果你不想把你的PNG图片转换成WebP,你仍然可以在每次build你的应用的时候,通过图片自动压缩加速你的构建速度。

android {
  ...
  aaptOptions {
    cruncherEnabled false
  }
}

使用Instant Run

Instant Run能够很明显的减少构建时间。在某种情况下,甚至可以不用重启的当前的Activity。使用Instant Run通过点击Apply Changes当你的app发生改变之后,并且当你使用如下操作时它默认是打开的:

  • 使用debug build variant
  • 使用Android plugin for Gradle版本2.3或者更高
  • minSdkVersion设置成15或者更高版本
  • 把你的应用运行在Android 5.0(API level 21)或者更高的版本上
    如果你在工具栏上看不到Apply Changes按钮,确保你在IDE中没有关掉通过以下步骤:
  1. 打开Settings or Preferences
  2. 导航到Build,Execution,Deployment > Instant Run.
  3. 确保Enable Instant Run是勾选的。

使用Build Cache

Build Cache存储了当构建时Android Plugin Gradle生成的一些未解压的AARspre-dexed remote dependencies输出。当使用了高速缓存cache之后你的clean build速度会大大加快,因为构建系统可以在一连串的构建中通过不重新创建他们的情况下复用这些缓存文件。

禁用注解annotation

当使用注解时Incremental Java compilation是不可用的。所以尽量避免使用注解,这样你就可以在构建的时候只编译你修改的classes文件这样的方式来获取好处。

剖析你的build

很多大型的项目,或者是一些实现了自己的构建逻辑,也许需要你仔细的观察构建过程并找到瓶颈所在。你可以分析在build生命周期中的每一个阶段和构建任务中Gradle所花费的时间。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,692评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,482评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,995评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,223评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,245评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,208评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,091评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,929评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,346评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,570评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,739评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,437评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,037评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,677评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,833评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,760评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,647评论 2 354

推荐阅读更多精彩内容