主要用于小白扫盲和个人巩固学习使用
以下就是一个项目中build.gradle常用的配置参数
当中基本都已经注释包含的意义,现在我们来对他们一个个进行分解
//当前项目类型为library类型
apply plugin: 'com.android.library'
// 加载配置文件
final Properties properties = new Properties()
InputStream inputStream = project.rootProject.file('local.properties').newDataInputStream()
properties.load(inputStream)
android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode rootProject.ext.appVersionCode
versionName rootProject.ext.appVersionName
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
buildConfigField 'String', 'LOGIN_URL', 'API_BASE_URL + "/page/toLogin"'
buildConfigField 'String', 'API_BASE_URL', '"http://127.0.0.1:12206/"'
buildConfigField 'String', 'UMENT_CHANNEL', '"DEV"'
//从配置文件中加载key=chennelList的值
buildConfigField 'String', 'CHENNEL_LIST_JSON_STRING', '"' + properties.getProperty('chennelList', '') + '"'
//可支持的内核版本
ndk {
abiFilters "armeabi"
abiFilters "armeabi-v7a"
abiFilters "x86"
}
}
//渠道列表
buildTypes {
//生产渠道
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
buildConfigField 'String', 'API_BASE_URL', '"https://xxxx.com"'
buildConfigField 'String', 'UMENT_CHANNEL', '"release"'
}
//其他渠道
mem555 {
initWith debug
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
buildConfigField 'String', 'API_BASE_URL', '"https://xxxx.com"'
buildConfigField 'String', 'UMENT_CHANNEL', '"MEM"'
}
//更多渠道参考上方已有的渠道
<.....>
}
//不检查警告错误
lintOptions {
abortOnError false
}
}
//引用库
dependencies {
//资源文件的引用
implementation fileTree(dir: 'libs', include: ['*.jar'])
//引用测试支持,但是这个jar库的com.android.support例外
androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support'
})
//注解代理
annotationProcessor rootProject.ext.lombokProcess
//仅在当前项目中能使用aspectjrt:1.8.9这个类库的API
compile 'org.aspectj:aspectjrt:1.8.9'
//所有引用了当前项目的项目都能使用model项目中的类
api project(':model')
//所有引用了当前项目的项目都能使用fastjson:1.2.46的类
api 'com.alibaba:fastjson:1.2.46'
}
//加入一个task读写文件任务,用于把当前所有的环境配置到配置文件中
task initChennel() {
println '开始初始化环境'
StringBuffer sb = new StringBuffer()
def chennellist = android.buildTypes
chennellist.each { chennel ->
def paramMap = chennel.buildConfigFields
paramMap.each {
sb.append("${it.key},${it.value.value.replace("\"","")}|")
}
}
sb = new StringBuffer(sb.substring(0,sb.length() - 1))
File file = project.rootProject.file('local.properties')
Writer w = new FileWriter(file)
properties.put("chennelList", sb.toString())
println sb.toString()
properties.store(w, "conments")
println '环境初始化完成'
}
//包含UnitTest的task不要启动
tasks.whenTaskAdded { task ->
if (task.name.contains('UnitTest')) {
task.enabled = false
}
}
一切对一般来说,配置项都是在下面的闭包中进行配置,但是我们的例子里,可以见到有及部分并不是写在android{}内的,,为什么呢?有什么区别呢,,一般来说,写在Android闭包外的东西可以是grovvy中的一些task,或者其他代码片段。
例如,在这个配置文件里,我们就加载了一个参数文件,文件是以key-value方式进行存储的,那么在后面的android{}中我们就可以使用这个文件内的一些东西了,使用方式properties.getProperty('chennelList', '')
,第一个参数表示key,第二个表示默认值。
另外我们还可以写一些grovvy代码来执行一些编译时任务如:task initChennel() {}
在这里让gradle编译的时候加入一个我的task,从而获得当前所有的渠道,最后写入配置文件中,使我在对android{properties.getProperty('chennelList', '')}
配置的时候随能给到一个理想的值我。
//当前项目类型为library类型
apply plugin: 'com.android.library'
// 加载配置文件
final Properties properties = new Properties()
InputStream inputStream = project.rootProject.file('local.properties').newDataInputStream()
properties.load(inputStream)
android{
...
}
//加入一个task读写文件任务,用于把当前所有的环境配置到配置文件中
task initChennel() {
}
//包含UnitTest的task不要启动
tasks.whenTaskAdded { task ->
}
buildConfigField 'String', 'UMENT_CHANNEL', '"DEV"'
这个主要作用就是当项目在编译的时候是会默认生成一个BuildConfig文件,如果加入了这段代码,那么意味着,当BuildConfig生成的时候,他会在类内创建一个静态常量值,这里需要3个参数
1.数据类型
2.属性名称
3.属性值
public static final String UMENT_CHANNEL = "DEV";
在我们的项目比较大的时候,往往会分成多个模块进行工作,但是每一个模块工程都会有私有的build.gradle配置信息,这个时候想要统一构建版本的时候就显得很麻烦了,要一个接一个的改,十分不方便,那怎么办呢?其实你们可以见到,在这个build.gradle中我是这样写的
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
我这里的这些版本信息放在了一个公共的地方,所有子项目都可以访问他来统一管理,那么,怎么使用呢?
在项目的根路径下,会有一个build.gradle文件,其次子项目再有私有的build.gradle文件,只要在根目录的build.gradle中进行编写即可。看下面的,大家稍微想想就能理解了,这种方式还有更多的妙用,大家可以自己发掘
ext {
defaultPublishConfig = project.hasProperty('buildType') ? project.property('buildType') : 'debug'
buildToolsVersion = '27.0.1'
compileSdkVersion = 27
targetSdkVersion = 27
appVersionCode = 13
appVersionName = '1.0.13'
}