1. 介绍
Gradle是Java世界里最受欢迎的构建工具之一,基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置,并且可以通过扩展来支持其他语言(例如c++)。Google的Adroid团队2013年宣布使用gradle为首选的构建工具,如今的Android开发已经离不开gradle的各种配置,虽然Android Studio等IDE会为我们自动生成一些默认的gradle配置,但是在项目规模扩大、内部或外部依赖变多之后,了解gradle配置的意义变得至关重要。
本文主要介绍Android项目中主要的gradle配置文件及常用的配置方法,配置的含义与用法在配置文件的注释中。
2. Android项目结构
使用Android Studio构建Android项目时,主要的gradle配置文件有settings.gradle, build.gradle(project), build.gradle(module)。
3. Gradle 设置文件
settings.gradle 文件位于项目根目录,用于指示 Gradle 在构建应用时应将哪些模块包括在内。对大多数项目而言,该文件很简单,只包括以下内容:
include ‘:app’
不过,多模块项目需要指定应包括在最终构建之中的每个模块。
4. 顶级构建文件
顶级 build.gradle 文件位于项目根目录,用于定义适用于项目中所有模块的构建配置。默认情况下,这个顶级构建文件使用 buildscript {} 代码块来定义项目中所有模块共用的 Gradle 存储区和依赖项。以下代码示例描述的默认设置和 DSL 元素可在新建项目后的顶级 build.gradle 文件中找到。
/**
* buildscript 块是用来配置仓库及gradle自身的依赖,这代表你不应该在这里引用你自身
* 项目的依赖。例如,这个配置块引用了Android的gradle插件来提供额外的gradle构建
* Android的功能
*/
buildscript {
/**
* repositories块配置了用来查找和下载依赖的Gradle仓库,gradle预支持的远程仓
* 库例如Jcenter、MavenCentral、和Ivy。你也可以使用自己的本地库或者定义你自
* 身的远程库。默认使用JCenter作为仓库
*/
repositories {
jcenter()
// 表示maven仓库中心
mavenCentral()
// 表示maven本地仓库
mavenLocal()
/**
* 指定了具体的maven远程仓库
*/
maven {
url"https://repo.example.com/maven2"
}
/**
* 指定了本地的maven仓库
*/
maven {
url "file://local/repo/"
}
}
/**
* dependencies块配置了构建项目时的依赖,下面的一行表示添加了gradle的
* Android插件作为一个classpath依赖
* 关于dependencies的具体类型参见模块级配置处的依赖
*/
dependencies {
classpath'com.android.tools.build:gradle:2.3.2'
}
}
/**
* allprojects块配置了你项目里所有模块用到的库和依赖,比如第三方插件或者库。不被所
* 有项目用到的插件或库应该在模块级下的build,gradle文件里。Android Studio 默认使用
* Jcenter作为默认库。
*/
allprojects {
repositories {
jcenter()
}
}
/**
* 配置在项目下的所有模块的公用的构建选项
*/
ext {
compileSdkVersion = 25
buildToolsVersion = "25.0.3"
supportLibVersion = "25.3.1"
/**
* 参见模块级build.gradle
*/
}
5. 模块级构建文件
模块级 build.gradle 文件位于每个 // 目录,用于配置适用于其所在模块的构建设置。您可以通过配置这些构建设置来提供自定义打包选项(例如附加构建类型和产品风味),以及替换 main/ 应用清单或顶级 build.gradle 文件中的设置。
以下这个示例 Android 应用模块 build.gradle 文件概述了应该了解的大部分基本 DSL 元素和设置。
/**
* 构建文件的第一行配置了gradle构建时使用的android插件并且使得android块可以配置
* 特定的构建选项
*/
apply plugin: 'com.android.application'
/**
* android块配置了特定的构建选项
*/
android {
/**
* compileSdkVersion 规定了编译时使用的API版本。这代表你的app可以使用这个版本或更低的api
*/
compileSdkVersion 25
/**
* buildToolsVersion 规定了gradle用来构建你的项目的构建工具、命令行工具、编译器的
* 版本。你应该使用SDKmanager工具下载对应的构建工具
*/
buildToolsVersion "25.0.3"
/**
* defaultConfig块封装了所有构建变体的默认设置和实体,并且可以由构建系统动态的覆盖
* main/AndroidManifest.xml清单文件里的一些属性。你可以配置项目特性来覆盖这些特性在不同版本中的值
*/
defaultConfig {
/**
* applicationId 是用来唯一识别你的发布的包,然而,这里应该参照在
* main/AndroidManifest.xml清单文件里定义的包名
*/
applicationId 'com.example.myapp'
// 定义了app运行需要的最低api版本
minSdkVersion 15
// 定义了app测试时的api版本
targetSdkVersion 25
// 版本数字
versionCode 1
//版本号
versionName "1.0"
//版本后缀
versionNameSuffix "-default"
//应用ID后缀
applicationIdSuffix '.dafault'
}
/**
* buildTypes 块配置了许多的构建类型。默认情况下,构建系统定义了两种类型:debug和release。
* debug构建类型不会显示的展示在默认的构建配置中,但是会被debugging工具所依赖并且附上debug签名。
* release构建类型使用了Proguard设置并且默认情况下没有签名
*/
buildTypes {
/**
* 默认情况下,Android Studio配置了代码压缩,并且指定了Proguard的设置文件
* 要尽可能减小 APK 文件,您应该启用压缩来移除发布构建中未使用的代码和资源
* 代码压缩通过 ProGuard 提供,ProGuard 会检测和移除封装应用中未使用的类、字段、方法和属性,
* 包括自带代码库中的未使用项ProGuard 还可优化字节码,移除未使用的代码指令,
* 以及用短名称混淆其余的类、字段和方法。
*/
release {
minifyEnabled true //为release版本启动代码压缩
/**
* getDefaultProguardFile()方法可从Android SDK tools/proguard/ 文件夹获取的ProGuard设置。
* proguard-rules.pro文件用于添加自定义ProGuard规则。默认情况下,该文件位于模块根目录(build.gradle 文件旁)。
* 具体的代码压缩参照 https://developer.android.com/studio/build/shrink-code.html
*/
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
/**
* 添加构建域,需要的3个字段依次为
* 为生成的BuildConfig类里添加一个字段
*/
buildConfigField "String", "DEMO-URL", "\"http://example.com/demo\""
}
customBuildType {
/**
* 表示复制某个buildTypes的所有参数,如这里复制了debug类型的所有参数
*/
initWith debug
}
}
/**
* productFlavors块配置了多个产品的flavor(应叫做口味,可以当做产品的功能特点),
* 这允许你可以覆盖defaultConfit配置来为你的app创建不同的版本。productFlavors是可选的,
* 并且构建系统不会自动的创建他们,这个例子创建了一个免费和一个付费的产品,
* 每个产品制定了其自身的应用ID,所以他们可以同时存在与Google Play Store或Android设备上。
*/
productFlavors {
free {
applicationId 'com.example.myapp.free'
}
paid {
applicationId 'com.example.myapp.paid'
}
}
/**
* dependencies块配置了模块级别的依赖,只在本模块内使用
* 依赖类型主要分为本地库模块依赖、本地二进制依赖、远程二进制依赖
* 使用compile添加依赖
*
*/
dependencies {
/**
* 本地库模块依赖
* 本地项目中需要有一个模块名为lib
*/
compile project(":lib")
/**
* 远程二进制依赖
* 根据配置好的仓库查找对应的依赖
*/
compile 'com.example.android:app-magic:12.3'
//以上也可以显示的指定为group name version
compile group: 'com.example.android', name: 'app-magic', version: '12.3'
/**
* 本地二进制依赖
* 因为gradle读取路径时是相对于build.gradle文件的,所以这个配置告诉构建系统需要添加位于
* moduleName/libs/下的jar文件为依赖
*/
compile fileTree(dir: 'libs', include: ['*.jar'])
//上一个也可以定义为这样
compile files('libs/foo.jar', 'libs/bar.jar')
/**
* 可以指定只在测试阶段添加的依赖
*/
testCompile 'junit:junit:4.12'
}
}
更多的配置相关内容待续...