在我们编写Android代码的时候,引入第三方库,配置Android插件,打包apk命名,配置仓库地址,都需要在build.gradle中编写相应代码,我们可能对dependencies中做第三方依赖,发版本更改versionCode与versionName知道如何处理,但是具体详细使用该如何呢?那就让我们一起来探究吧。
gradle语法是基于Groovy语言,Groovy是一种敏捷的动态语言,既可以面向对象编程,又可以用作纯粹的脚本语言,其运行在JVM上,能够与java代码很好的结合,也能扩展现有代码。
当我们打开gradle-wrapper.properties文件,查看配置信息:
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
通过配置项我们可以发现,当前项目使用的gradle版本,配置目录,它会根据以上配置目录下载到user/.gradle/wrapper/dists
目录下,
Gradle Wrapper作用是允许你在没有安装 Gradle 的机器上执行 Gradle 构建,对客户端计算机零配置,减少兼容性问题。
build.gradle文件分别在项目目录下和对应module目录都存在,它们的存在承担不同的功能。
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.0'
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
在project目录下的文件主要是配置仓库地址,配置插件,当我们新建项目时,可能我们会疑惑为什么会有两个repositories配置项,它们有什么区别吗?下面我们来解惑。
首先,buildscript{}
闭包声明是gradle脚本自身需要使用的资源,包含插件所在的仓库地址,插件依赖。例如:
classpath 'com.android.tools.build:gradle:3.2.0
这是我们Android执行task任务所必需的插件地址。
打开现有应用模块的 build.gradle 文件
apply plugin: 'com.android.application
以上代码作为Android应用程序入口,我们需要plugin
提供的编译、测试、打包所有tasks。
打开libray中的build.gradle文件
apply plugin: 'com.android.library'
这个是将当前module打包成aar文件的任务,不是打包成一个apk文件,当我们打开Android studio右侧面板的gradle,可以清晰的看见,每个module的task任务,作为入口module和library,在执行gradle assembleRelaese 时,入口modlue会打包成apk文件,而library会打包成aar文件。
allprojects
在这个节点下定义的属性会被运用到所有的module中,包含依赖的仓库,依赖地址。
当我们出现重复的support包,我们可以在此强制依赖,例如:
allprojects {
repositories {
google()
jcenter()
}
configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
def requested = details.requested
if (requested.group == 'com.android.support') {
if (!requested.name.startsWith("multidex")) {
details.useVersion rootProject.ext.supportVersion
}
}
}
resolutionStrategy{
force 'com.google.code.gson:gson:2.8.5'
}
}
}
当我们看完project下的build.gradle文件,那我们再来看看项目入口module下的build.gradle文件。
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig{
applicationId "com.bestpay.android.myapplication"
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled true
zipAlignEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug{
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
signingConfigs {
keyAlias '******'
keyPassword '******'
storeFile file('Key.jks')
keyPassword '******'
}
productFlavors{
}
}
dependencies{
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
}
通过以上代码,我们查看Android主要设置。
接下来我们来查看这些属性使用方式:
sourceSets
Android studio默认创建(app/src/main)作为代码,资源配置目录,也可以制定给其他目录为配置项
sourceSets{
main{
res.srcDirs = ['src/custom/res','src/main/res']
java.srcDirs = ['src/main/java']
manifest.srcFile 'src/main/AndroidManifest.xml'
assets.srcDirs=['src/custom/assets']
jniLibs.srcDirs = ['libs']//指定lib库目录
}
}
配置 jniLibs.srcDirs = ['libs']
,可以在Android studio的Android视图下生成jniLibs文件夹,可以方便我们存放jar包和库文件,其中Android视图下的jniLibs和project视图下的libs指向同一文件夹app->libs
packagingOptions
packagingOptions{
//pickFirsts做用是 当有重复文件时 打包会报错 这样配置会使用第一个匹配的文件打包进入apk
// 表示当apk中有重复的META-INF目录下有重复的LICENSE文件时 只用第一个 这样打包就不会报错
pickFirsts = ['META-INF/LICENSE']
//merges何必 当出现重复文件时 合并重复的文件 然后打包入apk
//这个是有默认值得 merges = [] 这样会把默默认值去掉 所以我们用下面这种方式 在默认值后添加
merge 'META-INF/LICENSE'
//这个是在同时使用butterknife、dagger2做的一个处理。同理,遇到类似的问题,只要根据gradle的提示,做类似处理即可。
exclude 'META-INF/services/javax.annotation.processing.Processor'
}
productFlavors
配置多渠道,设置不同包名和应用名
android {
productFlavors {
wandoujia {
//豌豆荚渠道包配置
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
//manifestPlaceholders的使用在后续章节(AndroidManifest里的占位符)中介绍
}
xiaomi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
applicationId "com.wiky.gradle.xiaomi" //配置包名
}
_360 {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "_360"]
}
//...
}
}
lintOptions
代码扫描分析,Lint 是Android Studio 提供的 代码扫描分析工具,它可以帮助我们发现代码结构/质量问题,同时提供一些解决方案。通常会配置以下方式
lintOptions {
abortOnError false //即使报错也不会停止打包
checkReleaseBuilds false //打包release版本的时候进行检测
}
这个是一个本地文件,存储一些个人配置,例如gradle运行是否并行,gradle的jvmargs大小、是否开启daemon
本地文件,存储个人信息,sdk,ndk路径等。
通过include相应module名称。
打开Android studio右侧面板,查看gradle命令,让我们来查看具体命令使用场景。
当我们在根build.gradle引入gradle任务执行得插件时,插件对应gradle最低版本,以下是具体对应关系:
参考文献:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Why-Gradle-