今天在看这篇【Gradle模块化代码精炼:让你的gradle代码控制在100行以内】 文章时,发现之前一直想要做的事情——精简compile的行数。
具体的做法在文中都有说明,在这里我只是对这个方法的原理的一种说明:
首先描述一下精简的过程。
配置config.gradle
相信很多小伙伴都已经使用过这种配置对gradle进行统一管理,而且在上面这篇文章中,度config.gradle的配置以及使用都已经讲解的很详细了。所以我直接贴上我的config.gradle配置代码。
ext {
android = [
compileSdkVersion: 25,
buildToolsVersion: '26.0.2',
minSdkVersion : 18,
targetSdkVersion : 25,
versionCode : 1,
versionName : "1.0.1"
]
dependencies = [
"support-design" : "com.android.support:design:25.1.0",
"greendao" : "org.greenrobot:greendao:3.2.2",
"rxandroid1" : "io.reactivex:rxandroid:1.2.1",
"okhttp3-logging" : "com.squareup.okhttp3:logging-interceptor:3.7.0",
"okhttp3-urlconnection": "com.squareup.okhttp3:okhttp-urlconnection:3.7.0",
"retrofit2-retrofit" : "com.squareup.retrofit2:retrofit:2.3.0",
"retrofit2-gson" : "com.squareup.retrofit2:converter-gson:2.3.0",
"retrofit2-scalars" : "com.squareup.retrofit2:converter-scalars:2.3.0",
"retrofit2-rxjava" : "com.squareup.retrofit2:adapter-rxjava:2.2.0",
"constraint-layout" : "com.android.support.constraint:constraint-layout:1.0.0-beta4",
"bugly" : "com.tencent.bugly:crashreport:2.6.5",
"SmartRefreshLayout" : "com.scwang.smartrefresh:SmartRefreshLayout:1.0.3",
"rxpermissions" : "com.tbruyelle.rxpermissions:rxpermissions:0.9.4@aar"
]
}
然后呢,是app module中gradle的dependicies代码(不再贴其他部分的代码,想了解的请看上文)。
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
// config.gradle中的dependencies其实是一个HashMap,所以使用groovy语法中的map取键值对,循环compile即可
libraries.each { k, v -> compile v } // k-key,v-value
//XML解析
compile('com.squareup.retrofit2:converter-simplexml:2.2.0') {
exclude group: 'xpp3', module: 'xpp3'
exclude group: 'stax', module: 'stax-api'
exclude group: 'stax', module: 'stax'
}
}
上面的代码中,我增加了一些注释,这就是本文的主要意图。所以,接下来介绍一下groovy中关于迭代的一些内容。
Groovy 中的迭代
Groovy 列表迭代
def list = ["Java", "Groovy", "JavaScript"]
list.each{language->
println language
}
第一行是 Groovy 用于构建 java.util.ArrayList 的便捷语法。可以将 println list.class 添加到此脚本来验证这一点。
接下来,只需对列表调用 each(),并在闭包体内输出 language 变量。在闭包的开始处使用 language-> 语句命名 language 变量。如果没有提供变量名,Groovy 提供了一个默认名称 it。
// shorter, using the default it variable
def list = ["Java", "Groovy", "JavaScript"]
list.each{ println it }
// shorter still, using an anonymous list
["Java", "Groovy", "JavaScript"].each{ println it }
Map 迭代
def map = ["Java":"server", "Groovy":"server", "JavaScript":"web"]
map.each{ println it }
上面使用默认的it参数,输出该map的value值。
def map = ["Java":"server", "Groovy":"server", "JavaScript":"web"]
map.each{
println it.key
println it.value
}
map.each{k,v->
println k
println v
}
可以使用上面的方式,分别获取map对应的键值对值。
注:这里就是gradle中使用libraries.each { k, v -> compile v } // k-key,v-value的原理。
String迭代
groovy可以使用each对一个字符串中的字符,进行逐一迭代输出。
def name = "Jane Smith"
name.each{letter->
println letter
}
这种使用方法可以对字符串中间的某一个字符进行替换,后续这种方式可以考虑融合到android gradle中。
def name = "Jane Smith"
println "replace spaces"
name.each{
if(it == " "){
print "_"
}else{
print it
}
}
// output
Jane_Smith
Range 迭代
Groovy 提供了原生的 Range 类型,可以直接迭代。使用两个点分隔的所有内容(比如 1..10)都是一个 Range
def range = 5..10
range.each{
println it
}
//output:
5
6
7
8
9
10
其实Range不局限与整形,其他类型也可以,如Date类型,但这些对android 的gradle配置好像用处就不是很大了,所以在这就不做介绍了。