Android studio 项目构建二|优化编译速度(1)

优化编译速度

优化编译配置项

下面的提示能提高AS工程改的编译速度

保持工具的更新

  1. Android Studio and SDK tools
  2. The Android plugin for Gradle

创建一个用于开发的编译变量

一些配置用于release版本,并不需要在开发当中。那些不需要的编译过程拖慢编译速度。

下面有两个产品类,dev和prod(release)

android {
  ...
  defaultConfig {...}
  buildTypes {...}
  productFlavors {
    // 当编译时会覆盖defaultConfig块的配置
    dev {
      // 命令行编译时禁止使用multidex, 当AS大于等于2.3,minSdkVersion大于等于21时,当发布运行时,编译会自动禁止multidex
      minSdkVersion 21
      versionNameSuffix "-dev"
      applicationIdSuffix '.dev'
    }

    prod {
      // 如果release版本配置在defaultConfig,那这里只需要创建空的块,否则会继承"dev"的配置
    }
  }
}

组合产品类 flavorDimensions

如下会生成(Dev|Pro)(Demo|Full|)

android {
  ...
  defaultConfig {...}
  buildTypes {...}

  // Specifies the flavor dimensions you want to use. The order in which you
  // list each dimension determines its priority, from highest to lowest,
  // when Gradle merges variant sources and configurations. You must assign
  // each product flavor you configure to one of the flavor dimensions.

  flavorDimensions "stage", "mode"

  productFlavors {
    dev {
      dimension "stage"
      minSdkVersion 21
      versionNameSuffix "-dev"
      applicationIdSuffix '.dev'
      ...
    }

    prod {
      dimension "stage"
      ...
    }

    demo {
      dimension "mode"
      ...
    }

    full {
      dimension "mode"
      ...
    }
  }
}

避开编译不需要资源

编译和打包资源禁止一些不需要的语言包和屏幕必读资源。
这个配置只能在开发类下使用

android {
  ...
  productFlavors {
    dev {
      ...
      //这是英语资源和xxhdpi密度
      resConfigs "en", "xxhdpi"
    }
    ...
  }
}

取消Crashlytics

如果不需要跑异常统计报告时,取消这个插件可以加快编译速度

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

也可以在运行是取消Crashlytics 工具, 在应用中做Fabric的初始化

// Initializes Fabric for builds that don't use the debug build type.
Crashlytics crashlyticsKit = new Crashlytics.Builder()
    .core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build())
    .build();

Fabric.with(this, crashlyticsKit);

如果想使用Crashlytics,可以加速编译。

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

使用静态编译配置

在release时需要动态配置属性参数时,有可以避开debug模式。这样
manifest 就不用重新生成。

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;
        }
    }
}

使用静态依赖版本

当声明依赖时,避免使用plus + 号指定版本号,例如:’com.android.tools.build:gradle:2.+’,使用动态版本时导致异常版本更新,解决版本不同也会困难,并且在检查更新时拖慢编译。

离线模式

如果处在慢网络下,采用离线模式,避免Gradle试图使用网络解决依赖。

这里写图片描述

按需启动配置

Gradle在每次编译时会对app里的所有模块和不依赖配置。在大型多模块项目会拖慢编译进度,高度Gradle只配置想要编译的模块。
这里写图片描述

创建lib模块

将代码转换成lib模块。模块后的代码只有在修改以后才会编译,其他时间会Cache起来。

配置dexOptions,启动library预编译

Android插件提供了dexOptions块,我们可以如下配置DEX编译属性提高编译速度。

  • preDexLibraries 声明预编译lib依赖提高增量构建速度。可能会拖慢清理构建。
  • maxProcessCount 设置最大构建运行线程数量 默认4
  • javaMaxHeapSize 设置最大运行DEX堆大小。另外一种方案,设置Gradle的堆大小,具体看下一跳。
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的堆大小和启动dex-in-process

Dex-in-process是让DEX编译在整个编译进程中,而不是分开增量和清理构建两个独立进程快。当AS2.1以后再足够内存情况下回默认开始这个特性。
在gradle.properties中设置堆大小。

org.gradle.jvmargs = -Xmx2048m

图片转换成WebP格式

WebP是一个有损压缩的透明格式,它减少了图片大小,而且节省了在编译过程中压缩时间。然而,当设备解压WebP图片时也会增加少许解压时间。
转换Webp看这里

关闭PNG压缩

如果图片不想转换成WebP,也可以通过关闭自动压缩图片来提交编译速度。

android {
  ...
  aaptOptions {
    cruncherEnabled false
  }
}

参考

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值