目的
当工程集成很多Modules时,每个Module都有一个build.gradle,并且带有如下重复的代码;对每个build.gradle修改很麻烦,因此统一管理build.gradle文件是必要的
1 | // 重复代码 |
- 优化代码
- 使用相同的编译配置
- 统一管理远程依赖
- 减少
sync project
次数
本地配置
在项目根目录下创建config.gradle文件,作为管理配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236import java.text.SimpleDateFormat
import java.util.regex.Matcher
import java.util.regex.Pattern
ext {
// 插件
plugins = [
application : "com.android.application",
library : "com.android.library",
maven : "com.github.dcendents.android-maven",
bintray : "com.jfrog.bintray",
novoda : "com.novoda.bintray-release",
greendao : "org.greenrobot.greendao",
"greendao-gradle" : "org.greenrobot:greendao-gradle-plugin:3.2.2"
]
// 配置
android = [
/*************************原生配置*************************/
compileSdkVersion : 25,
buildToolsVersion : "25.0.0",
minSdkVersion : 17,
targetSdkVersion : 23,
versionCode : getVersionCode(),
versionName : getVersionName(),
/*************************自定义配置*************************/
androidSupportSdkVersion: "23.0.0"
]
// 依赖
dependencies = [
/*************************原生依赖*************************/
"appcompat-v7" : "com.android.support:appcompat-v7:${android["androidSupportSdkVersion"]}",
"support-v4" : "com.android.support:support-v4:${android["androidSupportSdkVersion"]}",
"cardview-v7" : "com.android.support:cardview-v7:${android["androidSupportSdkVersion"]}",
"recyclerview-v7" : "com.android.support:recyclerview-v7:${android["androidSupportSdkVersion"]}",
"design" : "com.android.support:design:${android["androidSupportSdkVersion"]}",
"annotations" : "com.android.support:support-annotations:${android["androidSupportSdkVersion"]}",
"gridlayout-v7" : "com.android.support:gridlayout-v7:${android["androidSupportSdkVersion"]}",
"constraint-layout" : "com.android.support.constraint:constraint-layout:1.0.2",
/*************************第三方依赖*************************/
// https://github.com/square/retrofit
"retrofit2" : "com.squareup.retrofit2:retrofit:2.4.0",
"converter-scalars" : "com.squareup.retrofit2:converter-scalars:2.4.0",
"converter-gson" : "com.squareup.retrofit2:converter-gson:2.4.0",
"adapter-rxjava" : "com.squareup.retrofit2:adapter-rxjava:2.4.0",
"adapter-rxjava2" : "com.squareup.retrofit2:adapter-rxjava2:2.4.0",
// https://github.com/square/okhttp
"okhttp" : "com.squareup.okhttp3:okhttp:3.11.0",
// https://github.com/greenrobot/greenDAO
"greendao" : "org.greenrobot:greendao:3.2.2",
// https://github.com/yuweiguocn/GreenDaoUpgradeHelper
"greendao-helper" : "com.github.yuweiguocn:GreenDaoUpgradeHelper:v2.1.0",
// https://github.com/bumptech/glide
"glide" : "com.github.bumptech.glide:glide:4.8.0",
// https://github.com/square/picasso
"picasso" : "com.squareup.picasso:picasso:2.71828",
// https://github.com/facebook/fresco
"fresco" : "com.facebook.fresco:fresco:1.10.0",
// https://github.com/greenrobot/EventBus
"eventbus" : "org.greenrobot:eventbus:3.1.1",
// https://github.com/BuglyDevTeam/Bugly-Android
"bugly" : "com.tencent.bugly:crashreport:2.6.6.1",
"bugly-native" : "com.tencent.bugly:nativecrashreport:3.3.1",
// https://bintray.com/android/android-utils/com.android.volley.volley
"volley" : "com.android.volley:volley:1.1.1",
// https://github.com/ReactiveX/RxJava
"rxjava" : "io.reactivex:rxjava:1.3.8",
"rxjava2" : "io.reactivex.rxjava2:rxjava:2.2.2",
"rxandroid" : "io.reactivex:rxandroid:2.1.0",
"rxandroid2" : 'io.reactivex.rxjava2:rxandroid:2.0.2',
// https://github.com/JakeWharton/RxBinding
"rxbinding" : 'com.jakewharton.rxbinding2:rxbinding:2.2.0',
// https://github.com/google/gson
"gson" : "com.google.code.gson:gson:2.8.5",
// https://github.com/apache/commons-lang
"commons-lang3" : "org.apache.commons:commons-lang3:3.8",
// https://github.com/square/leakcanary
"leakcanary" : "com.squareup.leakcanary:leakcanary-android:1.6.2",
"leakcanary-release" : "com.squareup.leakcanary:leakcanary-android-no-op:1.6.2",
"leakcanary-fragment" : "com.squareup.leakcanary:leakcanary-support-fragment:1.6.2",
// https://github.com/YoKeyword/Fragmentation
"fragmentation" : "me.yokeyword:fragmentation:1.3.6",
/*************************个人依赖*************************/
// https://github.com/VeiZhang/BaseToolsLibrary
"basetools" : "com.excellence:basetools:1.2.6",
// https://github.com/VeiZhang/Permission
"permission" : "com.excellence:permission:1.0.1",
// https://github.com/VeiZhang/RetrofitClient
"retrofit-client" : "com.excellence:retrofit:1.0.5",
// https://github.com/VeiZhang/QSkinLoader
"skinloader" : "com.excellence:skinloader:1.2.2",
// https://github.com/VeiZhang/ToastKit
"toast" : "com.excellence:toast:1.1.0",
// https://github.com/VeiZhang/MailSender
"mailsender" : "com.excellence:mailsender:1.0.0",
// https://github.com/VeiZhang/Downloader
"downloader" : "com.excellence:downloader:1.2.0",
// https://github.com/VeiZhang/AppStatistics
"app-statistics" : "com.excellence:app-statistics:1.0.1",
// https://github.com/VeiZhang/AndroidExec
"exec" : "com.excellence:exec:1.1.0",
// https://github.com/VeiZhang/AndroidFFmpeg
"ffmpeg" : "com.excellence:ffmpeg:1.1.0",
// https://github.com/VeiZhang/ImageLoader
"imageloader" : "com.excellence:imageloader:1.0.0",
"imageloader-fresco" : "com.excellence:imageloader-fresco:1.0.0",
"imageloader-picasso" : "com.excellence:imageloader-picasso:1.0.0",
"imageloader-glide" : "com.excellence:imageloader-glide:1.0.0"
]
}
/***********************APP版本控制的通用方法***********************/
/**
* svn
* 直接读取svn版本号作为版本控制
*/
/**
* git
*
* git tag作为版本名称
* git 版本号有两种方法
* ①版本号作为我们内部开发的标识,一般它是+1递增的,每一次发版我们就会打一个tag,tag的数量也会增加1个,和我们版本号的递增逻辑是符合的,tag数量+1,版本号也会跟着+1
* ②还有一种是把提交次数作为versionCode,不推荐。相比较①,②比较难找,因为tag的数量不会很多
*/
/**
* 获取版本
* @return
*/
def getVersionName() {
def date = getDate()
def version = getSvnVersionCode()
if (version != 0) {
return "1.0.${version} [${date}]"
}
version = getGitTag()
if (version != 0) {
return "${version} [${date}]"
}
if (version == 0) {
version = 1
}
/**
* 错误的版本信息,请检查
*/
return "0.${version} [${date}]"
}
/**
* 获取版本号
* @return
*/
def getVersionCode() {
def versionCode = getSvnVersionCode()
if (versionCode == 0) {
versionCode = getGitVersionCode()
}
if (versionCode == 0) {
versionCode = 1
}
return versionCode
}
/***********************读取Git信息***********************/
/**
* 读取git tag
* @return tag
*/
def getGitTag() {
try {
def stdout = new ByteArrayOutputStream()
exec {
commandLine 'git', 'describe', '--abbrev=0', '--tags'
standardOutput = stdout
}
return stdout.toString().split("\n")
} catch (e) {
println e.getMessage()
}
return 0
}
/**
* 以git tag的数量作为其版本号
* @return tag的数量
*/
def getGitVersionCode() {
try {
def stdout = new ByteArrayOutputStream()
exec {
commandLine 'git', 'tag', '--list'
standardOutput = stdout
}
return stdout.toString().split("\n").size()
} catch (e) {
println e.getMessage()
}
return 0
}
/***********************读取SVN信息***********************/
/**
* 根据svn提交版本生成版本号
* @return
*/
def getSvnVersionCode() {
try {
def process = ("svnversion -c " + getBuildDir().parent).execute()
process.waitFor()
def version = process.in.text
Pattern pattern = Pattern.compile("(\\d+:)?(\\d+)\\D")
Matcher matcher = pattern.matcher(version)
if (matcher.find()) {
version = matcher.group(matcher.groupCount())
}
return Integer.parseInt(version)
} catch (e) {
println e.getMessage()
}
return 0
}
/**
* 获取日期
* @return
*/
def getDate() {
String date = new SimpleDateFormat("MMddyyyy").format(new Date())
return date
}在项目根目录的build.gradle中引用,供其他的Module使用
注意:
- 如果想使用ext的值,则只能在项目根目录的build.gradle中引用
想让单独的Module使用,则在该Module的build.gradle里引入,但是此时不能使用ext的值,否则会提示无法找到”Error:Cannot get property ‘xxx’ on extra properties extension as it does not exist”
1
apply from: "config.gradle"
在Module目录的build.gradle中使用变量
远程配置
远程配置配置其他步骤与本地配置是一样,不同的是引用的方式,导入的不是路径里的文件,而是一个文件链接
1 | apply from: "https://github.com/VeiZhang/build.gradle/blob/master/config.gradle?raw=true" |
继承方式
本地、远程的配置都只是保存了变量,但是如果想引用gradle文件里面的函数,其实很简单,与上面是相同的做法,必须注意的是,apply from: 放置的顺序很重要!
注意:引入位置在文件的开头、中间、结尾等处使用。因为gradle脚本编译是顺序执行的,如果父脚本与子脚本有相同的方法,此时父脚本引入的顺序就非常重要,不同的位置,执行先后不一样。