Gradle构建配置

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'

}

}

更多的配置相关内容待续...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容

  • 1.介绍 如果你正在查阅build.gradle文件的所有可选项,请点击这里进行查阅:DSL参考 1.1新构建系统...
    Chuckiefan阅读 12,011评论 8 72
  • 现在你已经知道了Gradle是如何工作的,如何创建你自己的任务和插件,如何运行测试,以及如何设置持续集成,你差不多...
    sollian阅读 1,002评论 0 5
  • 在 Android Studio 构建的项目中,基于 Gradle 进行项目的构建,同时使用 Android DS...
    Ant_way阅读 7,247评论 0 16
  • 转至:http://blog.csdn.net/heqiangflytosky/article/details/5...
    kkgo阅读 2,785评论 0 1
  • “一封信看似简单,却拥有足够的内在张力,能打开尘封的历史与丰富的人性之窗。我们不是在创新,我们只是在回归常识。” ...
    伶俐姑娘阅读 460评论 0 0