最近发现挺多人对Gradle没有一个清晰的概念和理解,对于Gradle的使用也仅限于一些简单的操作,于是便简单整理了一份关于Gradle的基本概念,可以让对Gradle不熟悉的朋友对它的整体有一个初步的了解
Gradle 是一高级构建工具包来自动执行和管理构建流程,同时也允许开发者定义灵活的自定义构建配置。 每个构建配置均可自行定义一组代码和资源,同时对所有应用版本共有的部分加以重复利用。 Android Studio 使用它构建系统编译应用资源和源代码、管理依赖,然后将它们打包成可供测试、部署、签署和分发的 APK。
在AS中使用Gradle需要同时配置Gradle工具包和Gradle插件,AS在安装时就默认配置了。可能有些人会认为Gradle工具包和Gradle插件是一个东西,因为在AS项目中的配置里也没有明显的标识Gradle工具包和Gradle插件的区别。Gradle工具包就是一款自动化构建工具的集合,它使用一种基于Groovy的特定领域语言来声明项目设置。Gradle插件的全称是Android Plugin for Gradle,Gradle不是专属于Android的构建工具,Gradle插件的出现是为了更方便的让我们在AS中构建Android项目。其中Gradle工具包可以脱离AS单独使用,但是AS要想使用Gradle就必须配置Gradle插件。
Gradle工具包在AS工程目录下的gradle/wrapper/gradle-wrapper.properties中配置
Gradle插件在工程根目录中的build.gradle中的dependencies中配置
当然,Gradle插件版本和Gradle工具包的版本是需要对应的,为获得最佳性能,谷歌推荐应该使用Gradle和插件的最新版本。
新建项目时,Android Studio 会自动创建其中的部分文件(下图所示),并为其填充合理的默认值。
Android 应用模块的默认项目结构其中后缀带gradle的都是 Android 应用标准项目结构的组成部分,后面的自定义配置构建都是基于这几个文件进行操作。我们必须了解其中每个文件的范围和用途及其应定义的基本 DSL 元素,才能着手配置构建。
Gradle设置文件
Gradle设置文件对应项目根目录的settings.gradle文件,用于指示 Gradle 在构建应用时应将哪些模块包括在内。 对大多数项目而言,该文件很简单,针对上面的默认项目,它包括以下内容:
include ‘:app’顶级构建文件
顶级构建文件build.gradle同样位于项目根目录中,用于定义适用项目中所有模块的构建配置。我们可以在它的buildscript块中为Gradle本身配置存储库和依赖项,在allprojects块配置所有模块通用的存储库和依赖性。例如,buildscript块包含Gradle的Android插件作为依赖项,因为它提供了Gradle构建Android应用程序模块所需的其他指令。
buildscript { repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.4.1' } } allprojects { repositories { google() jcenter() } }模块级构建文件
模块级build.gradle文件在各module目录下,用于定义适用于其所在模块所需构建配置,可以通过这些构建配置来提供自定义打包选项(例如附加构建类型和产品风格),以及替换 main/ 应用清单或顶级 build.gradle 文件中的设置。
下面是一个官方的模块级构建文件示例。包括了基本的DSL元素和设置。
apply plugin: 'com.android.application' android { compileSdkVersion 28 buildToolsVersion "28.0.3" defaultConfig { applicationId 'com.example.myapp' minSdkVersion 15 targetSdkVersion 28 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled true // Enables code shrinking for the release build type. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } flavorDimensions "tier" productFlavors { free { dimension "tier" applicationId 'com.example.myapp.free' } paid { dimension "tier" applicationId 'com.example.myapp.paid' } } } dependencies { implementation project(":lib") implementation 'com.android.support:appcompat-v7:28.0.0' implementation fileTree(dir: 'libs', include: ['*.jar']) }Gradle属性文件
Gradle 还包括两个属性文件,均位于项目根目录中,可用于指定适用于 Gradle 构建工具包本身的设置:
gradle.properties
可以在其中配置项目范围 Gradle 设置,例如 Gradle 后台进程的最大堆大小。
local.properties
为构建系统配置本地环境属性,例如 SDK 安装路径。 这个文件由AS自动生成并用于本地开发环境,因此我们不应该去手动修改它。
自定义构建配置一般只是针对模块的构建文件,那为什么还介绍上面一堆其他内容呢?局部源于整体,了解了上面的内容可以加强对Gradle的整体概念,不光知道怎么用,还要知其所以然。
那么Gradle可以帮我们自定义那些配置呢?
默认设置
defaultConfig块,可以设置应用Id,最小支持sdk版本、目标sdk版本、版本名称、版本码等等一些基础配置
构建类型
buildTypes块定义 Gradle 在构建和打包应用时使用的某些属性,通常针对开发生命周期的不同阶段进行配置。例如调试构建类型支持调试选项、使用调试秘钥签署应用,发布构建类型支持代码混淆、资源压缩、优化png大小、使用发布秘钥签署应用。 Android Studio 默认情况下会创建调试和发布构建类型。当然我们也可以添加自己的构建类型,比如development 构建类型,并在里面添加我们需要的配置。
产品风味
productFlavors可以向用户发布的不同版本的应用,比如免费版和付费版,我们可以为不同的产品风格定义使用不同的代码和资源,同时对所有应用版本共有的部分加以共享和重复利用。 比较常见的使用就有用来进行多渠道打包。
构建变体
构建类型 + 产品风味 = 构建变体。构建类型的数量乘以产品风味的数量就是构建变体的数量。那多渠道打包为例,构建类型有debug和release,产品风味有_360、xiaomi,那么构建变体就有_360Debug、_360Release、xiaomiDebug、xiaomiRelease。
动态属性
这里的动态属性是指通过build.gradle动态设置的java属性。通过buildConfigField(type, name, value)向生成的BuildConfig类添加一个新字段,如果类型是String,则该值应包含引号。然后在java代码中通过BuildConfig.xxx引用。
清单条目
除了指定java中的动态属性值,还可以在构建文件中配置一些值,这些值可以替换清单文件中现有的值。通过manifestPlaceholders = [name : value]指定。
ProGuard
代码混淆的配置规则文件,构建系统可在构建过程中运行 ProGuard 对类进行压缩和混淆处理。并且可以为不同的构建变体指定不同的 ProGuard 规则文件
签署
signingConfigs块,配置签署信息,并可在构建过程中自动签署您的 APK,可以指定秘钥文件、签署密码、签署别名等等。签署信息可以放在gradle.properties中保存。
依赖
dependencies块,这个应该都知道,可以说是我们能感受到gradle方便的最直接的一项了。以往我们用第三方库的时候都需要下载jar包,再导入到项目中。有了gradle后就不必手动搜索、下载依赖项的jar包并将它们复制到项目目录内。