Android优化APP构建速度的17条建议

较长的构建时间将会减缓项目的开发进度,特别是对于大型的项目,app的构建时间长则十几分钟,短则几分钟,长的构建时间已经成了开发瓶颈,本篇文章根据Google官方文档,加上自己的一些理解提供一些提升app构建速度的优化建议。

创新互联"三网合一"的企业建站思路。企业可建设拥有电脑版、微信版、手机版的企业网站。实现跨屏营销,产品发布一步更新,电脑网络+移动网络一网打尽,满足企业的营销需求!创新互联具备承接各种类型的网站设计制作、网站建设项目的能力。经过10余年的努力的开拓,为不同行业的企事业单位提供了优质的服务,并获得了客户的一致好评。

1. 为开发环境创建一个变体

有许多配置是你在准备app的release 版本的时候需要,但是当你开发app的时候是不需要的,开启不必要的构建进程会使你的增量构建或者clean构建变得很慢,因此需要构建一个只保留开发时需要配置的变体,如下例子创建了一个dev和prod变体(prod 为release 版本的配置)。

 
 
 
 
  1. android {
  2.   ...
  3.   defaultConfig {...}
  4.   buildTypes {...}
  5.   productFlavors {
  6.     // When building a variant that uses this flavor, the following configurations
  7.     // override those in the defaultConfig block.
  8.     dev {
  9.       // To avoid using legacy multidex, set minSdkVersion to 21 or higher.
  10.       minSdkVersion 21
  11.       versionNameSuffix "-dev"
  12.       applicationIdSuffix '.dev'
  13.     }
  14.     prod {
  15.       // If you've configured the defaultConfig block for the release version of
  16.       // your app, you can leave this block empty and Gradle uses configurations in
  17.       // the defaultConfig block instead. You still need to create this flavor.
  18.       // Otherwise, all variants use the "dev" flavor configurations.
  19.     }
  20.   }

2 . 避免编译不必要的资源

避免编译和包含你没有测试的资源(比如添加的一个本地的语言和屏幕密度资源),你可以只在你的’dev’ flavor下指定一种语言和一个屏幕密度,如下:

 
 
 
 
  1. android {
  2.   ...
  3.   productFlavors {
  4.     dev {
  5.       ...
  6.       // The following configuration limits the "dev" flavor to using
  7.       // English stringresources and xxhdpi screen-density resources.
  8.       resConfigs "en", "xxhdpi"
  9.     }
  10.     ...
  11.   }

上面的配置将会限制dev 变体只使用 english string 资源和 xxhdpi 屏幕密度资源。

3 . 配置debug 构建的Crushlytics为不可用状态

在debug 构建状态下,如果你不需要运行崩溃上报,你可以将这个插件设置为不可用状态来提升你的构建速度,如下:

 
 
 
 
  1. android {
  2.   ...
  3.   buildTypes {
  4.     debug {
  5.       ext.enableCrashlytics = false
  6.     }

上面只是举个例子,Crushlytics 为崩溃上报分析工具,在开发的时候我们可能不需要,因此不需要打开,在我们实际开发中,像崩溃上报SDK,数据统计SDK等(如 友盟统计、GrowingIO、百度统计)在开发阶段都设置为不可用,来提升构建速度。

4 . 用静态的构建配置值来构建你的Debug版

一般地,在你的debug 构建时,为manifest文件或者资源文件配置使用静态/硬编码的值。如果你的manifest或者资源文件的值每次构建都需要动态更新,那么Instant Run 无法执行代码交换-它必须重新构建和安装新的APK。

例如,使用动态的version codes ,version names ,resources或者其他更改manifest文件的构建逻辑,每次你想执行一个修改都会构建全部APK,即使实际的修改可能仅仅只需要热交换。如果这些构建配置是需要动态配置的,那么将它们从你的release 构建变体中分离出来,并且在你的debug 构建中保留它们的静态值。像下面build.gradle 文件显示的这样:

 
 
 
 
  1. int MILLIS_IN_MINUTE = 1000 * 60
  2. int minutesSinceEpoch = System.currentTimeMillis() / MILLIS_IN_MINUTE
  3. android {
  4.     ...
  5.     defaultConfig {
  6.         // Making either of these two values dynamic in the defaultConfig will
  7.         // require a full APK build and reinstallation because the AndroidManifest.xml
  8.         // must be updated (which is not supported by Instant Run).
  9.         versionCode 1
  10.         versionName "1.0"
  11.         ...
  12.     }
  13.     // The defaultConfig values above are fixed, so your incremental builds don't
  14.     // need to rebuild the manifest (and therefore the whole APK, slowing build times).
  15.     // But for release builds, it's okay. So the following script iterates through
  16.     // all the known variants, finds those that are "release" build types, and
  17.     // changes those properties to something dynamic.
  18.     applicationVariants.all { variant ->
  19.         if (variant.buildType.name == "release") {
  20.             variant.mergedFlavor.versionCode = minutesSinceEpoch;
  21.             variant.mergedFlavor.versionName = minutesSinceEpoch + "-" + variant.flavorName;
  22.         }
  23.     }

5 . 用静态的版本依赖

当你在build.gradle文件中声明依赖的时候,你应该避免在版本号结束的地方使用+号,比如:com.android.tools.build:gradle:2.+ 因为Gradle的检查更新,用动态的版本号会导致未知的版本更新、使解决版本的差异变得困难和更慢的构建。你应该使用静态或者硬编码版本号来代替。如:com.android.tools.build:gradle:2.2.2 。

6 . 使 on demand 配置为enable 状态

为了让Gradle能够确切的知道该如何构建你的APP,在每次构建之前,构建系统配置工程的所有modules和其他依赖(即使你只想构建或者测试一个modules),这使得大型的多module 工程的构建速度变得很慢。告诉Gradle仅仅配置你想要构建的Modules,用如下步骤使 on demand 配置可用

(1) 在菜单栏上选择 File -> Settings(如果是Mac上 ,选择 Android Studio ->Preferences)

(2) 导航到 Build,Execution,Deployment -> Compiler

(3) check Configure on demand 复选框

(4) 点击 OK

如图:

on_demand.png

7 . 创建 library 模块

检查你app中的代码,将可模块化的代码抽取一个Android Library module,通过这种方式模块化你的代码将允许构建系统仅仅只编译那些有改动的模块,并将其构建结果缓存下来以被后面的构建使用。同样的配置了 on demand 和 parallel project execution (project 并行执行) 将更加高效(当你打开这些特性时)。

8 . 为自定义构建逻辑创建Tasks

在你创建了 build profile (build profile 后文会讲)之后,如果显示构建时间相对长的一部分时间花在“configure project(配置工程)阶段,那么请 review 你的build.gradle 脚本,并且查找可包含到自定义Gradle Task中的代码,通过将一些构建逻辑移动到一个task 中,当需要的时候才运行,结果能被缓存用于后续的构建,并且这个构建逻辑可以并行执行(如果你开启了 并行执行project),更多详细信息请阅读Gradle官方文档。 official Gradle documentation

小提示:

如果你的构建包含了大量的自定义任务tasks,你可能想清理你的build.gradle文件,通过自定义task classes (也就是自定义Gradle 插件啦),将你的classes 添加到 project-root/buildSrc/src/main/groovy/目录下,Gradle将自动包含它们到class path ,为项目的所有build.gradle文件。

9 . 配置 dexOptions 和 开启 library pre-dexing(dex预处理)

先补充一个知识点:Dex-in-process:新发布的Android Studio 2.1增加了一个新的特性:Dex In Process,可以极大的加快重新编译的速度,同样也能提高Instant Run的性能。(第10条优化建议会说到)

详情请看Faster Android Studio Builds with Dex In Process

Android 插件提供了 dexOptions script block ,因此你可以配置相应的 DEX 构建特性,它们可以提高构建速度:

(1)preDexLibraaies : 声明是否对依赖的库进行dex 预处理来使你的增量构建更快速,因为这个特性可能会使你的clean 构建变慢,因此在你的持续集成服务器上你可能想关闭这个特性。

(2) maxProcessCount : 设置最大的线程数量使用当运行 dex-in-process时,默认值是4。

(3)javaMaxHeapSize: 为DEX 编译器 设置最大的堆大小,相对于设置这个属性,你应该增加 Gradle的 堆大小(这个堆大小dex-in-process可用的时候对DEX 编译器有效)

例子:

 
 
 
 
  1. android {
  2.   ...
  3.   dexOptions {
  4.     preDexLibraries true
  5.     maxProcessCount 8
  6.     // Instead of setting the heap size for the DEX process, increase Gradle's
  7.     // heap size to enable dex-in-process. To learm more, read the next section.
  8.     // javaMaxHeapSize "2048m"
  9.   }

你应该增加它们的值来测试一下这些设置,然后通过profile观察效果,当你为这个进程分配太多资源的时候,可能会得到一个负面的影响。

10 . 增加Gradle的堆大小 和开启 dex-in-process

Dex-in-process 允许多个DEX 进程运行在一个单独的VM 中,这使得增量构建和清理构建变得更快。默认情况下,通过Android Studio2.1 或者更高版本创建的新项目分配了足够的内存来开启这个特性,如果你没有使用Android Studio 2.1 或者更高的版本创建项目,你需要给Gradle后台驻扎程序设置至少1536MB 的堆大小内存。默认如下图:

gradle_heap.png

下面的例子在gradle.properties中将Gradle 堆内存大小设置为 2048MB:

 
 
 
 
  1. org.gradle.jvmargs = -Xmx2048m //设置Gradle 堆大小 2G

在一些大型的项目上,为Gradle堆分配更多的内存当然更有利,然而,如果你用的是一个小内存的机器,你可能需要给IDE配置更少的内存,想知道如何改变分配给IDE资源的数量和Gradle 对构建表现的影响,请看profiling your build这一条。

如果在你的Module build.gradle 文件中为android.dexOptions.javaMaxHeapSize定义了%

本文题目:Android优化APP构建速度的17条建议
网页路径:http://www.mswzjz.cn/qtweb/news25/80375.html

攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能