build.gradle

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目标测试版本
buildTypesdebug / release 构建配置
dependencies本地 / 远程 / 库依赖

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注