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 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,686评论 25 708
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,026评论 19 139
  • 这一章主要针对项目中可以用到的一些实用功能来介绍Android Gradle,比如如何隐藏我们的证书文件,降低风险...
    acc8226阅读 7,701评论 3 25
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,974评论 6 342
  • 宝贝们,你们好: 现在妈妈刚刚睡醒,没有你们在身边妈妈一直失眠,睡前只有喝红酒,靠着酒精的麻醉才能睡着。妈妈昨天晚...
    梦城妙儿阅读 234评论 5 1