build.gradle 文件的作用
一、Gradle 构建系统简介
Android Studio 使用 Gradle 来构建项目。Gradle 是一个非常先进的构建工具,它使用一种基于 Groovy 的领域特定语言(DSL)来声明项目设置,而不是传统的 XML。
一个 HelloWorld 项目中有两个
build.gradle文件:外层(项目级)和内层(模块级)。
二、外层 build.gradle(项目级)
路径:项目根目录/build.gradle
buildscript {
repositories {
jcenter()
maven {
url 'https://maven.google.com/'
name 'Google'
}
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.2'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
maven {
url 'https://maven.google.com/'
name 'Google'
}
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}Code language: JavaScript (javascript)
关键配置解析
| 配置项 | 说明 |
|---|---|
jcenter() | 声明使用 JCenter 代码托管仓库。很多开源 Android 项目都托管在 JCenter 上,声明后可以直接引用上面的开源库 |
google() | 声明使用 Google Maven 仓库,用于获取 Android Support Library、Constraint Layout 等 Google 官方库 |
classpath 'com.android.tools.build:gradle:3.1.2' | 声明 Gradle 的 Android 插件。Gradle 本身可用于构建 Java、C++ 等项目,构建 Android 项目需要这个插件 |
allprojects | 为所有模块(包括子模块)统一配置仓库地址 |
task clean | 定义了一个清理任务,执行时会删除整个项目的 build 目录 |
外层的
build.gradle基本不需要修改,除非你需要添加全局的仓库或升级 Gradle 插件版本。
三、内层 build.gradle(模块级 / app 目录)
路径:app/build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 27
buildToolsVersion "27.0.3"
defaultConfig {
applicationId "com.foxdevelop.www.myapplication"
minSdkVersion 14
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:27.+'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
}Code language: PHP (php)
下面逐一拆解每个部分。
四、apply plugin —— 插件声明
apply plugin: 'com.android.application'Code language: JavaScript (javascript)
| 值 | 含义 |
|---|---|
com.android.application | 应用程序模块,可以直接运行 |
com.android.library | 库模块,不能独立运行,供其他模块依赖调用 |
这是区分一个模块是”App”还是”Library”的关键配置。
五、android 闭包 —— 核心构建配置
1. 编译版本与构建工具
compileSdkVersion 27
buildToolsVersion "27.0.3"Code language: CSS (css)
| 配置 | 说明 |
|---|---|
compileSdkVersion | 指定用哪个 Android SDK 版本编译项目。27 对应 Android 8.1 |
buildToolsVersion | 构建工具的版本号,有新版本时 AS 会提示更新 |
2. defaultConfig —— 默认配置
defaultConfig {
applicationId "com.foxdevelop.www.myapplication"
minSdkVersion 14
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}Code language: JavaScript (javascript)
| 属性 | 说明 |
|---|---|
applicationId | 应用的唯一包名,对应应用的唯一标识(Google Play 上架用) |
minSdkVersion | 最低支持的 Android 版本,14 对应 Android 4.0 |
targetSdkVersion | 表示项目在该版本上进行了充分测试。系统会据此启用对应版本的新功能(如 7.0 多窗口模式) |
versionCode | 版本号,整数,用于应用商店判断升级 |
versionName | 版本名,字符串,用户可见 |
testInstrumentationRunner | 指定 Android 自动化测试的运行器 |
3. buildTypes —— 构建类型
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}Code language: JavaScript (javascript)
| 配置 | 说明 |
|---|---|
debug | 测试版配置(可省略,有默认值) |
release | 正式版配置 |
minifyEnabled | 是否开启代码混淆。false = 不混淆,true = 混淆 |
proguardFiles | 指定混淆规则文件: • 第一个:SDK 目录下的通用混淆规则 • 第二个: proguard-rules.pro,可编写项目特有规则 |
AS 默认运行的是 debug(测试)包,后面会讲解如何生成正式发布包。
六、dependencies —— 依赖管理
这是 最常修改 的部分,用于声明项目依赖的所有库。
三种依赖方式
| 类型 | 说明 | 示例 |
|---|---|---|
| 本地依赖 | 依赖本地的 jar 包或目录 | compile fileTree(dir: 'libs', include: ['*.jar']) |
| 库依赖 | 依赖项目中的库模块 | compile project(':library') |
| 远程依赖 | 依赖 JCenter / Google 仓库上的开源库 | compile 'com.android.support:appcompat-v7:27.+' |
逐行解析
// 本地依赖:将 libs 目录下所有 .jar 文件加入构建路径
compile fileTree(dir: 'libs', include: ['*.jar'])Code language: PHP (php)
// 远程依赖:AppCompat 兼容库
// 格式:域名:组名:版本号
compile 'com.android.support:appcompat-v7:27.+'Code language: JavaScript (javascript)
// 远程依赖:ConstraintLayout 布局库
compile 'com.android.support.constraint:constraint-layout:1.0.2'Code language: JavaScript (javascript)
// 测试依赖:JUnit 单元测试
testCompile 'junit:junit:4.12'Code language: JavaScript (javascript)
// Android 测试依赖:Espresso UI 测试
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})Code language: JavaScript (javascript)
远程依赖工作流程:Gradle 先检查本地是否缓存了该库 → 有则直接使用 → 没有则自动联网下载 → 下载后加入构建路径。
七、总结对比
| 文件 | 作用 | 修改频率 |
|---|---|---|
外层 build.gradle | 全局仓库配置、Gradle 插件版本 | 极少修改 |
内层 app/build.gradle | 模块构建配置、依赖管理 | 经常修改 |
| 核心配置 | 关键属性 | |
| ——— | ——— | |
apply plugin | 区分 application / library | |
compileSdkVersion | 编译 SDK 版本 | |
applicationId | 应用唯一标识 | |
minSdkVersion | 最低兼容版本 | |
targetSdkVersion | 目标测试版本 | |
buildTypes | debug / release 构建配置 | |
dependencies | 本地 / 远程 / 库依赖 |
Previous: 资源 res 文件和修改应用名字和图标
Next: 日志功能