当我们在讨论 Gradle 时,除了猜测,我们还能知道些什么。
前几天参加一个面试,被问到关于 Gradle 的问题,毫无准备当然让面试官失望,对 Gradle 处于会用的状态,但被问到一些细节的东西只能猜测,所以就有了这篇,除了 Gradle 这个名词,我们还知道什么。
官网说明
Gradle is an open-source build automation tool focused on flexibility and performance. Gradle build scripts are written using a Groovy or Kotlin DSL.
翻译过来,Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它能根据我们定义的脚本规则构建项目。
我们都知道,创建或者拷贝项目,大多数会去修改关于 gradle 的几个版本号,为什么要修改,下面了解一下我们到底改了什么。基本概念:
注:gradle-plugin 4.1+ 要在 google() 中下载
总结:gradle-wrapper.properties 是用于下载 Gradle 版本的,项目根目录的 build.gradle 是用于下载插件 gradle-plugin,目的都是简化项目的构建,而不同的 gradle-plugin 对应不同的 Gradle,所以我们在 clone 他人 Android 项目有时会为避免下载 gradle 而修改版本号为本地已有的 gradle 版本,对应的关系在下图,官网链接在最下面。
所以我们修改版本号,是改为我们已有的 gradle,当然不改也没什么问题,现在直接下载已经不再是什么问题(GFW)
我们知道,.gradle 文件有三个,项目根目录两个,模块目录下一个,大概意思是根目录是对整个项目的配置,模块下(如默认app)是针对模块的配置。
buildscript {
// gradle-plugin 下载的地址
repositories {
maven() { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
google()
}
//插件 gradle-plugin 版本
dependencies {
classpath 'com.android.tools.build:gradle:3.1.4'
}
}
//所有模块配置,如远程仓库地址
allprojects {
repositories {
jcenter()
}
}
这三个基本都熟悉,强行复习
想一下,假设项目中 compileSdkVersion 设置为 19,targetSdkVersion 设置为 26,打包后应用有可能出现什么问题?
除了默认配置,还能直接定义一些常量到 strings.xml 文件,全局变量 BuildConfig,多渠道打包,添加依赖,自定义 task 等,下面仅仅是一些常规设置,更多特性可以访问官方链接(文末)
//插件,声明为应用/库(com.android.library)
apply plugin: 'com.android.application'
android { //项目配置
compileSdkVersion 27 //编译版本
defaultConfig {//默认配置
applicationId "com.xxx.xxx" //应用包名
minSdkVersion 19 //适配最小版本
targetSdkVersion 27 //适配目标版本,支持最高特性版本
versionCode 1 //应用版本号
versionName "1.0" //版本名
resValue "string", "version", versionName //添加 version 字段到 strings 文件
}
sourceSets {//修改资源位置
main {
jniLibs.srcDir 'libs' //动态库位置指定 libs,这时我们可以将 so 文件放在 libs 中
//还可以指定其他,如源码目录位置 srcDirs
java.srcDirs = ['other/java'] //默认在 src/main/java
//res 资源位置
res.srcDirs = ['other/res1', 'other/res2'] //默认 src/main/res
//替换文件 srcFile
manifest.srcFile 'other/AndroidManifest.xml' //默认 src/main/
}
}
compileOptions { //指定编译 jdk 为 1.8
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
buildTypes {//构建配置
release { //正式版本
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
buildConfigField "boolean","Debug","false" //生成 BuildConfig.Debug
buildConfigField "String","server","\"https://server/release/\"" //正式服务器地址
}
debug { //调试版本
applicationIdSuffix ".debug" //在 applicationId 后加 .debug
minifyEnabled false //是否混淆代码
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
buildConfigField "boolean","Debug","true"
buildConfigField "String","server","\"https://server/debug/\"" //测试服务器地址
}
dev { //其他
//...
}
}
productFlavors { //构建不同版本,如多渠道打包
flavors_tencent { //不同版本的设置,如版本号
versionNameSuffix "-tencent"
}
flavors_360 {
versionNameSuffix "-360"
}
flavors_xxx{
//xxx
}
}
signingConfigs { //签名配置
release {
storeFile file('keys/release.keystore')
}
debug {
storeFile file('keys/debug.keystore')
}
}
}
repositories {
//这个是把依赖的 aar 包添加在 libs 中,加该指令后能识别出本地 aar
flatDir {
dirs 'libs'
}
}
//依赖库/模块
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support:design:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
}
几个常用链接:
Android Plugin DSL Reference 插件支持的扩展类型(extension type)
http://google.github.io/android-gradle-dsl/current/index.html
模块 build.gradle 更多配置官方说明
https://developer.android.google.cn/studio/build/gradle-tips?hl=zh_cn
gradle-plugin 和 Gradle 版本对应信息
https://developer.android.google.cn/studio/releases/gradle-plugin.html?hl=zh_cn