避免编译不必要的资源
避免编译和打包不测试的资源(例如,其他语言本地化和屏幕密度资源)。为此,您可以仅为“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,请执行以下操作:
- 依次点击 File > Settings(在 Mac 上,则依次点击 Android Studio > Preferences),打开 Preferences 窗口。
- 在左侧窗格中,依次点击 Build, Execution, Deployment > Gradle。
- 勾选 Offline work 复选框。
- 点击 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)。
首先,参阅以下支持增量注释处理的常见注释处理器列表。如需更完整的列表,请参阅常见注释处理器中的支持状态。某些注释处理器可能需要额外的步骤才能启用优化,因此请务必阅读每种注释处理器的文档。
- 带有 Android Gradle 插件 3.5.0 及更高版本的数据绑定库:借助该库,您可以使用声明性格式而非以程序化方式将布局中的界面组件绑定到应用中的数据源。
- Lombok 1.16.22 及更高版本:自动生成样板代码,例如 setter 和 getter。
- Glide 4.9.0 及更高版本:适用于 Android 的媒体管理和图片加载框架,可将媒体解码、内存和磁盘缓存以及资源池化封装到一个简单易用的界面中。
- Dagger 2.18 及更高版本:提供了一种可实现依赖注入的编译时方法。
- AutoService 和 AutoValue 1.6.3 及更高版本:一系列适用于 Java 的代码生成器。
此外,如果您在应用中使用 Kotlin,则需要使用 kapt 1.3.30 及更高版本才能为 Kotlin 代码支持增量注释处理器。务必阅读有关是否需要手动启用此行为的官方文档。
请注意,如果您必须使用一个或多个不支持增量编译的注释处理器,则注释处理将不会是增量的。但是,如果您的项目使用的是 kapt,则 Java 编译仍然是增量的。如果您不使用 kapt 并且希望 Java 编译是增量的,请考虑在 gradle.properties
文件中添加以下标记。添加后,Android Gradle 插件会在一个单独的任务中执行所有注释处理器,并允许 Java 编译任务以增量方式运行。
android.enableSeparateAnnotationProcessing = true
来源:CSDN
作者:nshzzu130
链接:https://blog.csdn.net/nshzzu130/article/details/104054180