Android Studio 优化构建速度解决方案

原文连接 Android Studio 优化构建速度解决方案

随着项目工程的扩大,程序编译时间也越来越长,同时也影响到了我们整个开发的速度。为了提高开发效率下面将列出一些优化方案:

开发的时候尽可能的使用最新设备进行开发,运行在Android7.0(API level 24)

最新的Android 平台可以让你程序编译运行速度更快,如Android Runtime(ART)还有更好对multiple DEX 支持

1.优化配置文件
  • 确保你的buildToolsVersion,Gradle最新

    Android 编译工具随着版本的更新升级会不断的进行优化,使用最新的版本来开发

    Android Studio and SDK tools

    Gradle 更新

  • 给你的开发环境配置特定的参数

    大多数的配置都是在你开发正式环境版本所需要,而日常编译的时候并不用到这类配置,开启了不必要的配置会减慢你的编译速度

    因此需要你配置一个特定的开发环境变量,如下面代码里"dev"(开发环境),"prod"(正式环境)

    android {
      ...
      defaultConfig {...}
      buildTypes {...}
      productFlavors {
      // 可以参考如下配置
        dev {
        // 为了避免64k方法数限制,将开发环境的最低minSdkVersion 设置到 21以上 或更高
          minSdkVersion 21
          versionNameSuffix "-dev"
          applicationIdSuffix '.dev'
        }
    
        prod {
        // 如果编译正式环境版本使用默认配置,那么你可以置空这块代码
        // 但是你仍然需要创建这个变量,否则全部环境 会使用开发变量的配置
        }
      }
    }
    

    如果你已经配置了上述的环境变量,当你在开发的时候需要混合加入一些新的变量,那么你可以通过flavorDimensions 配置维度 如:在新的环境变量"demo", "full" 进行添加维度

    android {
      ...
      defaultConfig {...}
      buildTypes {...}
    
      // 定义下面你需要用到变量维度
      // 当你使用Gradle进行合并的时候,指定你需要的环境维度
      
      flavorDimensions "stage", "mode"
    
      productFlavors {
        dev {
          dimension "stage"
          minSdkVersion 21
          versionNameSuffix "-dev"
          applicationIdSuffix '.dev'
          ...
        }
    
        prod {
          dimension "stage"
          ...
        }
    
        demo {
          dimension "mode"
          ...
        }
    
        full {
          dimension "mode"
          ...
        }
      }
    }
    
2.避免编译不必要的资源

在开发环境编译的时候,你可以选定一种语言与一个屏幕分辨率参数,如下面

android {
  ...
  productFlavors {
    dev {
      ...
      resConfigs "en", "xxhdpi"
    }
    ...
  }
}
3.开发版本编译关闭奔溃分析日志

如果你不需要奔溃分析日志报告,你可以直接关闭

android {
  ...
  buildTypes {
    debug {
      ext.enableCrashlytics = false
    }
}
4.使用静态配置值在你调试编译时

当你在编译生成正式版本的时候会用到动态版本代码,版本名称,资源等,这些动态生成的配置参数可以在调试运行时候隔离他们,使用静态的配置值进行debug 版本编译,如下面的代码:

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

android {
    ...
    defaultConfig {
        // 默认使用版本静态值
        versionCode 1
        versionName "1.0"
        ...
    }


    // 这些动态值将在你编译正式版本时候生效
    applicationVariants.all { variant ->
        if (variant.buildType.name == "release") {
            variant.mergedFlavor.versionCode = minutesSinceEpoch;
            variant.mergedFlavor.versionName = minutesSinceEpoch + "-" + variant.flavorName;
        }
    }
}

5.使用静态依赖版本值

诸如com.android.tools.build:gradle:2.+可以在编译调试的时候使用当前固定版本值替换

6.配置DexOptions与启用 Library per-dexing
  • Library per-dexing

    使用预生成库进行增量更新

  • maxProcessCount

    设置最大的线程数

  • javaMaxHeapSize

    设置最大堆空间

    android {
      ...
      dexOptions {
        preDexLibraries true
        maxProcessCount 8
        javaMaxHeapSize "2048m"
      }
    }
    
7.增大Gradle编译堆栈空间

如在你的 gradle.properties 文件下 增大设置堆栈空间

org.gradle.jvmargs = -Xmx2048m
8.使用WebP 图片格式

将PNG图片转换成WebP

9.禁用PNG图片处理

如果你不想转换webp格式的图片,但是你仍旧想提高你的编译运行速度,那你可以参照如下配置 禁用PNG图片自动压缩

android {
  ...
  aaptOptions {
    cruncherEnabled false
  }
}

提示:当你以一次构建成功后,你会发现接下来的clean build操作会越来越快(即使不使用本页的任何优化)。这个是因为Gradle 进程会有一个“热身”提高性能的过程,类似JVM进程的预热期

通过本页的一些优化后,应该能为你减少编译过程的大多数时间

你可能感兴趣的:(Android Studio 优化构建速度解决方案)