优化gradle编译配置

北城余情 提交于 2020-01-20 19:10:05

避免编译不必要的资源

避免编译和打包不测试的资源(例如,其他语言本地化和屏幕密度资源)。为此,您可以仅为“dev”性质的版本指定一个语言资源和屏幕密度,如下面的示例中所示:

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

对调试编译版本停用 Crashlytics

如果您不需要生成 Crashlytics 报告,请按如下方法停用该插件,以提高调试编译速度:

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

 

此外,您还需要通过更改在应用中初始化对 Fabric 的支持的方式,在运行时对调试编译版本停用 Crashlytics 套件

 

禁用自动版本号生成

如果您想要将 Crashlytics 用于调试编译版本,仍可以通过阻止 Crashlytics 在每次编译过程中使用自己的唯一版本号更新应用资源,提高增量编译的速度。由于此版本号存储在清单引用的资源文件中,因此禁止自动生成版本号还可以将 Apply Changes 和 Crashlytics 一起用于您的调试编译版本。

要阻止 Crashlytics 自动更新其版本号,请将以下内容添加到 build.gradle 文件中:

    android {
      ...
      buildTypes {
        debug {
          ext.alwaysUpdateBuildId = false
        }
    }
   要详细了解如何在使用 Crashlytics 时优化您的编译版本,请参阅官方文档

将静态编译配置值用于调试编译版本

始终为会进入调试编译类型的清单文件或资源文件的属性使用静态/硬编码值。

例如,您每次需要运行更改时,要使用动态版本代码、版本名称、资源或可以更改清单文件的任何其他编译逻辑,都需要完整的 APK 编译版本,即使实际更改仅需要一个热交换,也是如此。如果您的编译配置需要此类动态属性,请将其隔离到您的发布版编译变体中,并使该值对您的调试编译版本保持静态,如下面的 build.gradle 文件所示。

    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.
            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 检查有无更新而减慢编译速度。您应该使用静态/硬编码版本号。

启用离线模式

如果网络连接速度比较慢,那么在 Gradle 尝试使用网络资源解析依赖项时,编译时间可能会延长。您可以指示 Gradle 仅使用已缓存到本地的工件,从而避免使用网络资源。

要在使用 Android Studio 编译项目时离线使用 Gradle,请执行以下操作:

  1. 依次点击 File > Settings(在 Mac 上,则依次点击 Android Studio > Preferences),打开 Preferences 窗口。
  2. 在左侧窗格中,依次点击 Build, Execution, Deployment > Gradle
  3. 勾选 Offline work 复选框。
  4. 点击 Apply 或 OK

如果您正在通过命令行编译,请传递 --offline 选项

创建库模块

在应用中查找可以转换成 Android 库模块的代码。以这种方式将您的代码模块化,可以让编译系统仅编译您修改的模块,并缓存输出以用于未来的编译版本。此外,这种方式也会让并行项目执行更有效(当您启用该优化时)。

 

为自定义编译逻辑创建任务

生成编译分析报告后,如果分析报告显示相当长的一部分编译时间用在了“配置项目”阶段,请检查 build.gradle 脚本并查找您可以添加到自定义 Gradle 任务中的代码。将某些编译逻辑移到任务中后,它仅会在需要时运行,可以缓存结果以用于后续编译版本,并且该编译逻辑将可以并行运行(如果您已启用并行项目执行)。要了解详情,请阅读官方 Gradle 文档

提示:如果您的编译版本中包含大量自定义任务,则您可能需要通过创建自定义任务类来整理 build.gradle 文件。将您的类添加到 project-root/buildSrc/src/main/groovy/ 目录中,Gradle 会自动将其添加到项目中所有 build.gradle 文件的类路径中。

将图片转换为 WebP 格式

WebP 是一种图片文件格式,提供有损压缩(如 JPEG)以及透明度(如 PNG),不过与 JPEG 或 PNG 相比,这种格式可以提供更好的压缩效果。降低图片文件大小可以加快编译速度(无需在编译时进行压缩),尤其是当应用使用大量图片资源时。不过,在解压缩 WebP 图片时,您可能会注意到设备的 CPU 使用量有小幅上升。通过使用 Android Studio,您可以轻松地将图片转换为 WebP 格式

停用 PNG 处理

如果您无法(或者不想)将 PNG 图片转换为 WebP 格式,仍可以在每次编译应用时停用自动图片压缩,从而提高编译速度。如果您使用的是 Android 插件 3.0.0 或更高版本,则默认情况下仅针对“调试”编译类型停用 PNG 处理。要针对其他编译类型停用此优化,请将以下代码添加到 build.gradle 文件中:

    android {
        buildTypes {
            release {
                // Disables PNG crunching for the release build type.
                crunchPngs false
            }
        }

    // If you're using an older version of the plugin, use the
    // following:
    //  aaptOptions {
    //      cruncherEnabled false
    //  }
    }
    

 

由于编译类型或产品性质不定义此属性,因此在编译应用的发布版本时,您需要手动将此属性设置为 true

启用编译缓存

编译缓存可以存储编译项目时 Android Plugin for Gradle 生成的特定输出(例如,未打包的 AAR 和经过 dex 预处理的远程依赖项)。使用缓存时,整洁编译版本的速度会明显加快,因为编译系统在进行后续编译时可以直接重用这些缓存文件,而无需重新创建。

使用 Android 插件 2.3.0 及更高版本的新项目会默认启用编译缓存(除非您明确停用编译缓存)。要了解详情,请参阅利用编译缓存加快整洁编译版本的速度

使用增量注解处理器

Android Gradle 插件 3.3.0 及更高版本改进了对增量注释处理的支持。因此,要提高增量编译速度,您应更新 Android Gradle 插件并尽可能仅使用增量注释处理器。

注意:此功能与 Gradle 4.10.1 及更高版本(Gradle 5.1 除外)兼容(请参阅 Gradle 问题 8194)。

首先,参阅以下支持增量注释处理的常见注释处理器列表。如需更完整的列表,请参阅常见注释处理器中的支持状态。某些注释处理器可能需要额外的步骤才能启用优化,因此请务必阅读每种注释处理器的文档。

此外,如果您在应用中使用 Kotlin,则需要使用 kapt 1.3.30 及更高版本才能为 Kotlin 代码支持增量注释处理器。务必阅读有关是否需要手动启用此行为的官方文档。

请注意,如果您必须使用一个或多个不支持增量编译的注释处理器,则注释处理将不会是增量的。但是,如果您的项目使用的是 kapt,则 Java 编译仍然是增量的。如果您不使用 kapt 并且希望 Java 编译是增量的,请考虑在 gradle.properties 文件中添加以下标记。添加后,Android Gradle 插件会在一个单独的任务中执行所有注释处理器,并允许 Java 编译任务以增量方式运行。

    android.enableSeparateAnnotationProcessing = true
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!