Android中的Gradle之配置及构建优化

1、Gradle简介

一、Gradle是什么?

Gradle是一种项目自动化构建工具,基于Groovy语言来声明项目设置,同时支持kotlin文件xxx.gradle.kts做为DSL(Domain Specified Language)。
html

二、对比其余构建工具

对与最直接的比较就是Gradle和Maven的比较,还有Ant,不过目前基本没有什么基于Ant构建的项目这里就不提了。
首先Gradle的简易性比Maven要好的多。Groovy语法的书写和可读性要比Maven中的Xml方便不少。
其次,Gradle中自定义功能要比Maven中方便不少。在Gradle中自定义Task便可,在Maven要写插件来实现。
java

三、Gradle的安装与配置

安装、配置环境变量、测试安装结果。具体参考Gradle官网gradle.org/install/android

2、Gradle项目目录结构

一、基本gradle项目

新建build.gradle文件,进入该目录命令行执行gradle build即可生成.gradle隐藏文件。这就是基本的gradle项目。
git

gradle项目结构1

命令行执行 gradle wrapper生成以下结构,该命令是同统一不一样开发者使用相同的Gradle构建版本进行构建。
gradle项目结构2

如使用多项目构建还需使用setting.gradle等构建脚本,具体在android中的gradle进行介绍。

二、android studio中的gradle目录结构

这里须要一点。在android studio中,Gradle和Android独立运行,这意味着Android的构建并不依赖与IDE,能够配合Gradle单独完成项目的构建。android studio只不过是帮助咱们生成了一个目录结构并界面化的处理Gradle中的任务。
咱们先看一下新建andorid项目的目录结构
api

android项目结构

3、构建配置文件解释

一、settings.gradle

该文件为gradle设置文件,位于项目根目录,配置项目的多模块构建,include ':app', ':example_module'表示使用同级目录中的app模块、example_module模块。也能够具体制定模块路径。以下使用
浏览器

include ':app'
include ':example_module'
project(':example_module').projectDir = new File(rootDir,'example/example_module')
复制代码

使用自定义module路径

二、gradle.properties,local.properties

该文件为项目属性文件,可用于保存key-value资源供项目使用。
gradle.properties中android studio会自动帮咱们建立org.gradle.jvmargs=-Xmx1536m 该属性为Gradle后台进程的最大堆大小,最小为1536m,咱们也能够自定义修改该值org.gradle.jvmargs = -Xmx2048m
咱们也能够配置其余属性,如org.gradle.caching=true让gralde配置使用缓存,减小少编译时间。
其实还有不少属性能够配置具体能够看Gradle官网中的Build Environmentdocs.gradle.org/current/use…
local.properties中会填写本地的SDK、NDK路径,多人开发通常要加入.gitignore。
缓存

三、根目录build.gradle

项目级build.gradle 文件位于项目根目录,用于定义适用于项目中全部模块的构建配置。
bash

/**
 * buildscript{}声明工程所须要的依赖,如在module中须要引用的插件 
 * 好比要在module中引用 apply :'com.android.application',
 * 须要在这里加入依赖 classpath 'com.android.tools.build:gradle:3.1.4'
 */

buildscript {
    /**
     * repositories{}声明了工程所须要的依赖库,供下面dependencies下载
     * 低版本gradle须要将google()改成
     * maven { url 'https://maven.google.com/' }
     */
    repositories {
        google()
        jcenter()
    }
     /**
      * dependencies{}声明了具体的依赖,使用[group]:[name]:[version]形式
      */
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.4'
    }
}

/**
 * allprojects{}定义了项目中全部module的配置
 * 此处全部module的远程仓库都添加了google()和jcenter()
 */
allprojects {
    repositories {
        google()
        jcenter()
    }
}

/**
 * 此处就是gradle中的一个task,名称为clean,
 * 使用Groovy语言实现,彻底兼容java,
 * 能够跟进delete方法,内部就是一个用java实现的递归删除方法
 */
task clean(type: Delete) {
    delete rootProject.buildDir
}

复制代码

四、module中build.gradle

模块级build.gradle文件位于每一个module文件夹中,用于配置适用于其所在模块的构建设置,如自定义打包设置、引入模块内的依赖等。
微信

/**
 * 引入所需插件 此处使用‘com.android.application’
 * 提供了android {} 配置的可用性,用户构建android项目
 */
apply plugin: 'com.android.application'

/**
 * android{}部分是根据com.android.application来配置的属性,
 * 包含了android项目配置的必要信息
 */
android {

  /**
   * compileSdkVersion 是gradle中用于构建使用的版本,
   * 可使用该版本及如下的API特性
   *
   * buildToolsVersion 使用android SDK build tools的版本
   */
  compileSdkVersion 26
  buildToolsVersion "28.0.3"

  /**
   * 基本配置,某些配置会覆盖manifest中的配置
   */

  defaultConfig {

    /**
     * applicationId ,编译打包时会将该处配置覆盖到manifest中
     */

    applicationId 'com.example.myapp'

    // 定义最小运行的android版本
    minSdkVersion 15

    // 指定应用程序的API级别用来测试。
    targetSdkVersion 26

    // app的版本号,某些手机上安装应用会进行校验,不能降级安装
    versionCode 1

    // app的版本名称,通常使用三位数控制“1.1.0”
    versionName "1.0"
  }

  /**
   * buildTypes {} 声明了构建类型,默认包含了debug,release
   * 也能够增长自定义的构建类型
   */

  buildTypes {

    /**
     * 配置当构建类型为release时的选项,如是否开启混淆,及混淆规则文件
     * 也能够增长构建配置,如增长签名文件的相关配置
     */

    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
  }

  /**
   * productFlavors {}声明了不一样的特点版本。
   * 这里的配置能够覆盖defaultConfig {}中的配置
   * 好比说这里的例子配置了一个付费的版本和一个免费的版本
   * 使用了不一样的applicationId使两个项目能够同时运行在一个手机上
   */

  productFlavors {
    free {
      applicationId 'com.example.myapp.free'
    }

    paid {
      applicationId 'com.example.myapp.paid'
    }
  }

  /**
   * 多APK构建,根据屏幕的dpi或者系统的ABI来进行生成不一样的apk
   * 使用很少,这里不作重点介绍
   */

  splits {
    // Screen density split settings
    density {

      // Enable or disable the density split mechanism
      enable false

      // Exclude these densities from splits
      exclude "ldpi", "tvdpi", "xxxhdpi", "400dpi", "560dpi"
    }
  }
}

/**
 * dependencies {} 声明的module级别的依赖来实现对其余项目的调用
 */

dependencies {
    implementation project(":lib")
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation fileTree(dir: 'libs', include: ['*.jar'])
}
复制代码

4、对于提升编译速度的建议

一、使用最新的Android gradle插件

Google tools team一直致力于提升android studio的编译速度,使用最新的gradle插件能够搞编译速度 在Android Gradle Plugin 3.0.0后,google推出了新的依赖方式,并强制要求废弃老的依赖方式,将原有的compile闭包方法,拆分红implementation,api以明确项目的依赖关系。
其中implementation仅对当前module依赖有效,api同compile,存在依赖的传递性。错误的使用则会致使依赖被加载两次,增长编译时间。
更多3.0.0以后的特性能够参考官方文档中的Dependency configurations部分developer.android.com/studio/buil…markdown

- compile 'com.android.support:appcompat-v7:27.1.1'
    + implementation 'com.android.support:appcompat-v7:27.1.1'

复制代码

二、避免使用multidex

当minSdkVersion为21如下的时候的时候(不包含21),则编译时间会大大增长。咱们能够经过定制开发版本编译minSdkVersion为21来提升开发效率,具体配置以下:

android {
    defaultConfig {
        ...
        multiDexEnabled true
    }
    productFlavors {
        dev {
            minSdkVersion 21
        }
        prod {
            minSdkVersion your_minSDKVersion
        }
    }
	...
}

复制代码

三、避免使用multi-APK(不常使用)

当须要针对不一样的ABI或dpi作支持,使用spilts{}对工程生成不一样apk时可使用该方法。
在开发调试的时候,关闭splits功能,具体配置以下:

android {
	...
   if (project.hasProperty(‘devBuild’)){
      splits.abi.enable = false
      splits.density.enable = false
   }
   ...
}
复制代码

使用命令行构建时使用这个命令:

./gradlew assembleDevelopmentDebug -PdevBuild
	// gradlew assembleDevelopmentDebug -PdevBuild
复制代码

当使用Android Studio构建可作如下配置:
打开Preferences -> Build, Execution, Deployment -> Compiler,再Command-line选项后填写-PdevBuild,以下图所示:

multiAPK使用android studio构建

四、减小打包的资源文件

在咱们进行开发调试的时候,没有必要对全部的资源文件进行编译,一般只选择一种能够减小编译时间,具体配置以下:

android{
	...
	productFlavors {
  		development {
    		minSdkVersion 21
    		//only package english translations, and xxhdpi resources   
    		resConfigs (“en”, “xxhdpi”)
  		}
	}
	...
}

复制代码

五、禁用PNG压缩

android构建的时候默认开启了PNG压缩,在开发调试时,能够将PNG压缩关闭,具体配置以下:

android {
	...
	if (project.hasProperty(‘devBuild’)){
		aaptOptions.cruncherEnabled = false
	}
	...
}

复制代码

六、使用Instant run

andorid studio 3.0以后对instant run进行了很大的优化,以前的版本出现过更新的代码没有运行到手机上,因此一直关闭着。如今能够尝试使用。

七、不在gradle中定义动态变量

在开发调试的状况下,不要使用动态定义

// def buildDateTime = new Date().format(‘yyMMddHHmm’).toInteger()
def buildDateTime = project.hasProperty(‘devBuild’) ? 100 : new Date().format(‘yyMMddHHmm’).toInteger()
android {
  defaultConfig {
    versionCode buildDateTime
 }
}
复制代码

八、不要使用动态依赖版本

项目在构建的过程当中具备不肯定性,可能由于网络问题致使编译时间过长或编译失败。而且Gradle会每24小时检查一次新的依赖版本从而增长依赖解析时间。
不要使用下面的依赖方式

// 错误的示范
	implementation 'com.appadhoc:abtest:latest'
	implementation 'com.android.support:appcompat-v7:27+'

复制代码

九、对Gradle后台进程的最大堆大小的分配

分配更大的内存可能会对大的项目的构建有时间上的减小,具体还要看电脑的配置等其余因素,具体能够参考gradle官网 Configuring JVM memory:docs.gradle.org/current/use…
新版本配置时在gradle.properties中配置

org.gradle.jvmargs=-Xmx1536m

复制代码

不要在使用老版本的在build.gradle中配置

dexOptions {
		javaMaxHeapSize = ‘4g’
	}
复制代码

十、使用Gradle缓存

Gradle缓存是Gradle 3.5的新特性,当缓存开启时,Gradle将缓存并重用以前构建的结果。具体在gradle.properties中增长以下配置:

org.gradle.caching=true

复制代码

以上几点出自google 2017 I/O大会,具体可参看会议视频 www.youtube.com/watch?v=7ll…

十一、针对项目构建时间具体进行优化

针对每一个项目的构建呢,具体的优化也不会相同,咱们能够将咱们项目的具体构建时间输出成文档,具体分析哪块的构建时间过长,来针对性的优化。具体命令以下:

gradlew --profile --recompile-scripts --offline --rerun-tasks assembleFlavorDebug
复制代码
  • --profile:启用分析
  • --recompile-scripts:在绕过缓存时强制从新编译脚本。
  • --offline:禁止 Gradle 提取在线依赖项。这样能够确保 Gradle 在尝试更新依赖项时引发的任何延迟都不会干扰您的分析数据。您应当已将项目构建一次,以便确保 Gradle 已经下载和缓存您的依赖项。
  • --rerun-tasks:强制 Gradle 从新运行全部任务并忽略任何任务优化。 构建完成后,在_project-root_/build/reports/profile/ 目录下使用浏览器打开生成的profile-timestamp.html便可看到具体的构建时间报告。

5、总结

经过上面的文章,咱们就已经了解了如何配置gradle来对android项目进行构建,以及对项目构建进行部分优化,可是咱们对于原理部分还所知甚少,好比为何能够在build.gradle中定义android{}这部分代码,为何这里就能够实现对项目的配置,本着知其然,知其因此然的态度,咱们要继续对gradle进行探索,了解groovy语法,了解gradle中的task,及使用自定义构建功能。
相关链接
Android中的Gradle之玩转自定义功能

参考文档: andorid官方文档——配置构建 developer.android.com/studio/buil…
gradle官方文档——Building Android Apps guides.gradle.org/building-an…
Google I/O中提到的提升Android studio的编译速度的几个建议 blog.csdn.net/sd19871122/…

关注微信公众号,最新技术干货实时推送

相关文章
相关标签/搜索