优化AndroidStudio的构建速度

4,414 阅读8分钟

想必大家在安卓开发过程中都会遇到同样一个问题,那就是项目编译花费的时间太久了,而浪费了许多开发时间.本文整理了一些优化AndroidStudio构建速度的一些方案,希望能够帮助到你.

一、更新你的电脑配置

将你的CPU升级到顶配(I7 XXK),内存32G,固态360G。

哈哈,开个玩笑。如果你是土豪,相信你也不会介意,也会认同我的。

二、更新你的工具到最新版本

  1. 更新高版本稳定的AndroidStudio版本和Gradle插件.谷歌之所以要更新版本,那一定是优化了许多东西,在选择的同时最好看下版本好,选择正式稳定版的工具.
  2. 在开发应用程序时,应尽可能将其部署到运行Android 7.0(API级别24)或更高级别的设备。较新版本的Android平台实现更好的机制,将更新推送到你的应用程序,例如Android运行时(ART)和本地支持多个DEX文件。

    注意:在第一次完成构建之后,你可能会注意到后续的构建(clean和incremental)执行得更快(即使没有使用此页面上描述的任何优化)。这是因为Gradle守护进程有一个性能提升的“热身期”,类似于其他的JVM进程。

三、使用新的依赖和配置

新的配置 弃用配置 行为
implementation compile 当你的模块配置一个implementation 依赖项时,让Gradle知道这个模块在编译的时候不需要把依赖项泄露给其他模块。也就是说,只有在运行时,依赖才可用于其他模块。使用这种依赖配置代替 api或compile可以导致显着的构建时间改进,因为它减少了构建系统需要重新编译的项目的数量。例如,如果一个 implementation依赖关系改变了它的API,Gradle只重新编译这个依赖项以及直接依赖它的模块。大多数应用程序和测试模块应使用此配置。
api compile 当一个模块包含api依赖关系时,让Gradle知道模块想要将该依赖关系可传递地导出到其他模块,以便在运行时和编译时使用它们。这个配置的行为就像compile(现在已经被弃用了),你通常应该只在库模块中使用它。这是因为,如果api依赖项更改了外部API,Gradle会在编译时重新编译所有有权访问该依赖项的模块。所以,拥有大量的api依赖会增加构建时间。除非你想将一个依赖的API暴露给一个单独的测试模块,否则使用implementation 依赖。

也就是说在AndroidStudio3.0以后,能使用implementation的就使用implementation,implementation可以提高编译速度

四、开启D8编译

相比之前的DX编译引擎,谷歌的下一代编译引擎D8 dex编译引擎不仅仅提高了编译效率(体现在编译时间减少上),同时也减少了生成的.dex文件的大小。目前D8 dex编译引擎已经在android studio 3.0 里有,而这一引擎将在android studio 3.1里成为默认的引擎。可以在gradle.properties 文件里的android.enableD8设置成true即可使用D8 dex编译引擎。

android.enableD8 = true

五、将图像转换为WebP

WebP是一种图像文件格式,提供有损压缩(如JPEG)以及透明度(如PNG),但可以提供比JPEG或PNG更好的压缩。减少图像文件的大小,而不必执行构建时压缩,可以加快你的构建,特别是如果你的应用程序使用大量的图像资源。但是,解压缩WebP映像时,你可能会注意到设备CPU使用率的小幅增加。使用Android Studio,你可以轻松地 将图像转换为WebP。

六、禁用PNG运算

如果你不能(或不想)将你的PNG图像转换为WebP,那么你仍然可以通过每次构建应用程序时禁用自动图像压缩来加速构建。如果你使用的是 Android插件3.0.0或更高版本,则默认情况下禁用Debug构建类型的PNG运算。要为其他构建类型禁用此优化,请将以下内容添加到你的build.gradle文件中:

android {
    buildTypes {
        release {
            // 为发布构建类型禁用PNG运算。
            crunchPngs false
        }
    }

    // 如果你使用的是旧版本的插件,请使用以下内容
    //  aaptOptions {
    //      cruncherEnabled false
    //  }
}

七、使用静态依赖版本

在build.gradle文件中声明依赖关系时,应该避免在最后使用带有加号的版本号,例如 'com.android.tools.build:gradle:2.+'。使用动态版本号可能会导致意外的版本更新,难以解决版本差异以及Gradle检查更新造成的较慢版本。你应该使用静态/硬编码的版本号。

八、启用离线模式

如果你的网络连接速度较慢,则当Gradle尝试使用网络资源来解决依赖关系时,你的构建时间可能会受到影响。你可以通过只使用已缓存在本地的工件来告诉Gradle避免使用网络资源。

在使用Android Studio构建时要离线使用Gradle,请按照下列步骤操作:

  1. 通过单击文File > Settings
  2. 在左侧窗格中,单击BuildExecution, Deployment > Gradle.
  3. 选中Offline work复选框。
  4. 点击Apply或者OK

九、配置守护进程

  1. 单击File > Settings.
  2. 在左侧窗格中,单击Build, Execution, Deployment > Compiler.
  3. 选中Configure on demand复选框。
  4. 点击Apply或者OK

十、启用Instant Run

Instant Run通过推送某些代码和资源更改而无需构建新的APK,并且在某些情况下甚至不重新启动当前活动,从而大大缩短了更新应用程序所需的时间。

十一、自定义你的VM选项

要提高Studio的性能,最常见的选项是调整最大堆大小,但也可以使用该studio.vmoptions文件覆盖其他默认设置,例如初始堆大小,缓存大小和Java垃圾收集开关。

要创建一个新studio.vmoptions文件或打开现有文件,请使用以下步骤:

  1. 单击Help > Edit Custom VM Options,如果你以前从未编辑过Android Studio的VM选项,则IDE会提示你创建一个新 studio.vmoptions文件。单击是以创建该文件。
  2. 打开studio.vmoptions文件,编辑文件以添加你自己的自定义VM选项。有关可定制JVM选项的完整列表,请参阅Oracle的Java HotSpot VM选项页面。 下面是我自己的配置,仅供参考.

     -Xms2048m
     -Xmx2048m
     -XX:MaxPermSize=2048m
     -XX:ReservedCodeCacheSize=1024m

十二、为开发创建一个构建variant

在开发应用程序 时,你准备开发应用程序所需的许多配置都不是必需的。启用不必要的构建过程会减慢增量构建和清理构建的速度,因此请配置构建变体,以便在开发应用程序时只保留构建配置。下面的示例创建一个“dev”风格和一个“prod”风格(用于你的发行版本配置):

android {
      ...
      defaultConfig {...}
      buildTypes {...}
      productFlavors {
      //当构建一个使用这种风格的variant时,以下配置将覆盖defaultConfig块中的配置。
      dev {
          //为了避免在从命令行构建时使用传统的multidex,将minSdkVersion设置为21或更高。
          //当使用Android Studio 2.3或更高版本时,构建部署到运行API级别21或更高级别
         //的设备时,会自动避免传统的multidex,无论你设置为minSdkVersion。 
          minSdkVersion 21
          versionNameSuffix "-dev"
          applicationIdSuffix '.dev'
     }

    prod {
      // 如果你已经为你的应用程序的发布版本配置了defaultConfig块,你可以把这个块留空,
      // 而Gradle使用defaultConfig块中的配置。你仍然需要创造这种flavor 
      // 否则,所有variants 都使用“dev”flavor 配置。
    }
  }
}

如果你的构建配置已经使用product flavors 来创建应用程序的不同版本,则可以使用flavors 将“dev”和“prod”配置与这些flavors相结合。例如,如果你已经配置了“demo”和“prod”的风格,则可以使用以下示例配置来创建组合flavors,如“devDemo”和“prodFull”:

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

  // 指定要使用的flavor dimensions。
  // 按从高到低列出每个dimensions的优先级
  //当Gradle合并variant的来源和配置。你必须将你配置的每个product flavors分配给其中一个flavor dimensions。

  flavorDimensions "stage", "mode"

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

    prod {
      dimension "stage"
      ...
    }

    demo {
      dimension "mode"
      ...
    }

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

避免编译和打包未测试的资源(例如屏幕密度资源)。你可以通过只指定一个屏幕密度资源并屏蔽你的“dev” flavors来做到这一点,如下面的例子所示:

android {
  ...
  productFlavors {
    dev {
      ...
      // 下面的配置限制了“dev”风格,以使用xxhdpi屏幕密度资源。
        resConfigs  "xxhdpi"
    }
    ...
  }
}

十三、Crashlytics报告设置

如果你不需要运行Crashlytics报告,请通过禁用插件来加快你的调试版本,如下所示:

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

你还需要在运行时禁用Crashlytics套件以进行调试构建,方法是更改​​你在应用程序中初始化Fabric支持的方式,如下所示:

// 初始化不使用调试构建类型的构建。
Crashlytics crashlyticsKit = new Crashlytics.Builder()
    .core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build())
    .build();

Fabric.with(this, crashlyticsKit);

如果你想在调试版本中使用Crashlytics,那么你仍然可以通过防止Crashlytics在每次构建期间使用自己的唯一构建ID更新应用程序资源来加速增量构建。要防止Crashlytics不断更新其构建ID,请将以下内容添加到你的 build.gradle文件中:

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