构建工具就是把元代码生成可执行应用程序的自动化程序。Android studio中的gradle就是这么一种构建工具,其实用于Android构建工具之前还有Ant和Maven,这个在eclipse中用的比较多。
Groovy语言是gradle的基础。Groovy是一种动态语言,基于Java,跟Java一样运行于Java虚拟机,因此呢它就是一门运行在Java平台上的语言特性比较灵活的动态语言。本文主要介绍gradle在Android studio中的配置,因此不对这门语言语法做讲解,而且说实话如果只是Android开发个人并不建议完整学习Groovy语言,毕竟gradle在Android中的应用只是那几百行代码,虽然这几百行代码非常重要,但也没必要深入学习,了解个大概差不多了,我也就是了解了基本语法。当然如果你说你精力旺盛,就有能力把Android学习好的同时,还可以学习多门其他的语言,那我也没话说,毕竟多多益善对有能力的人总是有好处的。
gradle主要有key配置,线上测试环境配置,版本号配置,apk输出路径等功能
1.下载依赖
2.源代码转化成二进制代码
3.打包生成二进制代码
4.单元测试
5.部署到生产系统
一个Android项目中至少有两个build.gradle文件,一个是整个项目目录中的,一个是主module目录中的。项目目录中还有setting.build文件,其中的代码比较简单:
include ':app', ':library', ':pulltorefreshlibrary'
这个文件是用来管理整个项目中有module的。创建一个module,在该setting.build文件中后面自动加上去。一般不需要做手工改动。当然如果需要把module从项目中删除,要先在这里把对应的module名删了,再去删module,否则module无法删除。
在看一个完整版项目目录中的build.gradle文件:
buildscript { //设置脚本运行环境
repositories {
jcenter()//jcenter中央仓库。
mavenCentral()//maven仓库。
}
dependencies {//远程依赖
classpath 'com.android.tools.build:gradle:2.2.0'//这是gradle插件版本。跟gradle版本有区别。
//classpath
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {//远程仓库。这里有两个远程仓库
jcenter()
mavenCentral()
}
}
既然这属于项目目录,因此它所管理的范围也是整个项目,比如gradle插件版本和依赖的远程仓库。gradle插件版本一般需要跟gradle版本号保持对应关系,否则打开项目就会出错。依赖的远程仓库原来用maven仓库比较多,现在Android把它转到jcenter仓库了。好多我们依赖的包是在jcenter仓库中,当然也有没有的时候。没有的话gradle会去maven仓库中去找。
接下来是完整版主module的build.gradle文件:
apply plugin: 'com.android.application'//这句话说明这是一个应用的module。如果是library,则应该是‘com.android.library’
apply plugin: 'android-apt'//不是必填,应用apt注解插件,现在一般不用apt了,
//因为维护它的作者表示不再维护。注解类工具可以使用annotationprocessor
def releaseTime() {
return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"));
}
android {
compileSdkVersion 24//SDK版本号,
buildToolsVersion "24.0.3"//SDK版本号对应的构建工具版本号。
defaultConfig {
applicationId "com.cc.chendroid"//应用包名
minSdkVersion 16//最小支持的SDK版本号
targetSdkVersion 24//目标版本号
versionCode 1//软件版本号,自己设定,可以采用自增的方式
versionName "1.0"//软件版本名称,是给用户看的
multiDexEnabled true//支持多个dex文件的编译
ndk {
// 选择要添加的对应cpu类型的.so库
abiFilters "armeabi", "armeabi-v7a", 'armeabi-v8a', "x86"
}
manifestPlaceholders = [
]
}
// 忽略 lint 错误
lintOptions {
abortOnError false
}
signingConfigs {//签名时会自动生成的签名配置
releaseConfig {
storeFile file("Chendroid.jks")
storePassword "cc"
keyAlias "chendroid"
keyPassword "cc123"
}
}
buildTypes {
release { // 正式版本配置
minifyEnabled false//不进行混淆
signingConfig signingConfigs.releaseConfig//签名时自动生成
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
buildConfigField("String", "API_HOST", "\"http://101.200.222.73/\"")//配置好一些参数,比如API的host部分。
//生成APK的存放路径
applicationVariants.all { variant ->
variant.outputs.each { output ->
output.outputFile = new File(
output.outputFile.parent,
"${defaultConfig.applicationId}-${variant.buildType.name}-${defaultConfig.versionName}-${releaseTime()}.apk".toLowerCase())
}
}
}
debug { // 测试版本配置
debuggable true
minifyEnabled false
if (true) { // true 开发服,false 正式服,配置debug的服务器地址。注意,测试的时候应该有测试服和正式服的链接区别
buildConfigField("String", "API_HOST", "\"http://101.200.222.73/\"")
} else{
buildConfigField("String", "API_HOST", "\"http://101.200.222.74/\"")
}
}
}
sourceSets {//源码设置,一般指很多从Eclipse中迁移过来的代码,在来设置
main {
jniLibs.srcDirs = ['libs']
}
}
productFlavors {//多渠道打包
huawei {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "huawei"]
}
qh360 {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "qh360"]
}
}
packagingOptions {
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/NOTICE'
}
compileOptions {//依赖的Java环境,现在一般都是Java8了
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
repositories {
flatDir {
dirs 'libs' // 存放aar的目录地址
}
jcenter()
mavenCentral()
maven { url "http://dl.bintray.com/piasy/maven" }
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')//依赖libs目录中的jar包
compile project(':library')
compile project(':pulltorefreshlibaray')//刷新框架,是一个module,因此用compile project()
compile(name: 'alisdk-feedback-release', ext: 'aar')
compile 'com.squareup.retrofit2:retrofit:2.2.0'//网络加载框架
compile 'com.github.bumptech.glide:glide:3.7.0'//Glide,一款优秀的图片加载框架
}
上面是module中的build.gradle配置,当然可能不太全面,不过基本上项目中改用到的都已经写上了。