一、Gradle简介

1、Gradle是什么?

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

2、对比其他构建工具

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

3、Gradle的安装与配置

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

二、Gradle项目目录结构

1、基本gradle项目

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

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

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

2、android studio中的gradle目录结构

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

三、构建配置文件解释

1、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')
复制代码

2、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。

3、根目录build.gradle

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

/*** 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
}复制代码

4、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 26buildToolsVersion "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 trueproguardFiles 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 settingsdensity {// Enable or disable the density split mechanismenable false// Exclude these densities from splitsexclude "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'])
}
复制代码

四、对于提高编译速度的建议

1、使用最新的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…

    - compile 'com.android.support:appcompat-v7:27.1.1'+ implementation 'com.android.support:appcompat-v7:27.1.1'复制代码

2、避免使用multidex

当minSdkVersion为21以下的时候的时候(不包含21),则编译时间会大大增加。我们可以通过定制开发版本编译minSdkVersion为21来提高开发效率,具体配置如下:

android {defaultConfig {...multiDexEnabled true}productFlavors {dev {minSdkVersion 21}prod {minSdkVersion your_minSDKVersion}}...
}复制代码

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

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

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

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

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

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

4、减少打包的资源文件

在我们进行开发调试的时候,没有必要对所有的资源文件进行编译,通常只选择一种可以减少编译时间,具体配置如下:

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

5、禁用PNG压缩

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

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

6、使用Instant run

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

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

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

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

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

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

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

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

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

  org.gradle.jvmargs=-Xmx1536m复制代码

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

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

10、使用Gradle缓存

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

   org.gradle.caching=true复制代码

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

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

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

   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即可看到具体的构建时间报告。

五、总结

通过上面的文章,我们就已经了解了如何配置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/…

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

Android中的Gradle之配置及构建优化相关推荐

  1. Android Studio之gradle的配置与介绍

    1.gradle的简单介绍 Gradle是可以用于Android开发的新一代的Build System,也是Android Studio默认的build工具.其实Gradle脚本是基于一种JVM语言- ...

  2. 使用gradle构建android项目,Android中使用Gradle来构建App项目的入门指南

    gradle是Android开发中引入的全新的构建系统,因为全新的构建系统主要是出于下面的目的: 1. 方便复用代码和资源 2. 构建多种版本的apk更见简单,不论是为多渠道构建不同的apk还是构建不 ...

  3. Android中清单文件引入配置参数,Android 使用gradle打包的各种配置

    原标题:Android 使用gradle打包的各种配置 在AS中利用gradle打包,可以高效并且自由地配置各种参数,发布不同的版本.关于配置gradle文件的一些做法,总结为如下. 一.替换Andr ...

  4. Android 中 build.gradle 文件详解

    一.简介 一般来说一个新创建的项目中,有两个 build.gradle 文件,一个是工程目录下的,一个是 app 目录下的,这两个 build.gradle 文件对 Android Studio 项目 ...

  5. 浅析Android中build.gradle的实用技巧

    1.替换符的使用 (1)在 app-android-defaultConfig (或者多渠道打包)下面可以这样使用 android {defaultConfig {manifestPlaceholde ...

  6. android中build.gradle详细说明

    apply plugin: 'com.android.application'//项目说明,application是应用程序,library就是类库 android {compileSdkVersio ...

  7. Android 中 JUnit 测试的配置

    第一步:首先在AndroidManifest.xml中加入下面代码: [html] view plaincopy <?xml version="1.0" encoding=& ...

  8. jenkins 安装android 插件, gradle 插件搭建linux构建机器

    android 插件安装: 那么在 "系统管理页面" 或多出 android sdk root 的配置: 可以以环境变量的形式配置,也可以直接配置:但是直接直接配置环境变量如上,不 ...

  9. Android中dex文件的加载与优化流程

    目录 1.dex文件分析...1 2.odex文件...2 2.1.odex文件结构...2 2.2.odex文件结构分析...3 3.dex文件的验证与优化...3 3.1 dex文件加载流程... ...

最新文章

  1. SAP EWM - 包装主数据 - 包装明细 -2
  2. 大物实验总结模板_高考化学实验题答题模板归类总结!
  3. Gym 101741 K(AC自动机)
  4. vmware14安装macos10.12完美可升级10.13
  5. 手机端展现table_百度信息流广告外包丨百度信息流广告的展现样式和收费方式?...
  6. 总结一些java编程题的思路
  7. STL 之find,find_if,find_end,find_first_of
  8. Debian 7.8 通过 apt-get 安装 nodejs
  9. 云计算教程学习入门视频:云计算的模型都有哪些
  10. 2010年3月再谈前端工程师的笔试题
  11. CSS中transform:skew属性理解
  12. mysql 什么是审核上线_自动审核及上线系统
  13. 使用lex与yacc词法语法工具进行简单的SQL语义检查
  14. ai俄罗斯方块java,C#实现俄罗斯方块AI
  15. Windows 相关镜像及补丁下载地址
  16. 硬笔行书字帖3500常用字_2018年【成年人实用硬笔行书】一对一直播培训简介
  17. Word文字怎么添加下划线
  18. 第十届山东理工大学ACM网络编程擂台赛 重现
  19. c语言1ms延时程序,请教老师,51微控制器在12M晶振,C语言程式设计时,延时函式120次=1ms(书本上是这样的,不懂),是怎样得来的?...
  20. 1335 工作计划的最低难度(动态规划)

热门文章

  1. python:利用DouYin的API爬取热门视频和音乐
  2. Perforce使用中文教程: p4 client
  3. 除了X站,程序员还喜欢上这些网站...
  4. 说几句得罪人的大实话
  5. Shift 键的一些技巧
  6. Android使用keytool-importkeypair生成一个系统签名,只要打包的时候使用该签名,便可以获得系统所有权限
  7. java url正则校验,Java正则验证
  8. 增益 Gain 分贝 dB
  9. 基于微信小程序的西餐外卖系统的设计与实现NodeJS-计算机毕业设计
  10. 【微信小程序】./miniprogram\ 未找到 [1.06.2210141][win32-x64]错误