在我们编写Android代码的时候,引入第三方库,配置Android插件,打包apk命名,配置仓库地址,都需要在build.gradle中编写相应代码,我们可能对dependencies中做第三方依赖,发版本更改versionCode与versionName知道如何处理,但是具体详细使用该如何呢?那就让我们一起来探究吧。
背景
gradle语法是基于Groovy语言,Groovy是一种敏捷的动态语言,既可以面向对象编程,又可以用作纯粹的脚本语言,其运行在JVM上,能够与java代码很好的结合,也能扩展现有代码。
Gradle wrapper
当我们打开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
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主要设置。
- defaultConfig 默认配置
- signingConfig 签名相关
- buildTypes 构建变体
- productFlavors 产品风格
- sourceSets 源集配置
接下来我们来查看这些属性使用方式:
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']
}
}
gradle.properties
这个是一个本地文件,存储一些个人配置,例如gradle运行是否并行,gradle的jvmargs大小、是否开启daemon
local.properties
本地文件,存储个人信息,sdk,ndk路径等。
setting.gradle
通过include相应module名称。
Android自带Task命令
打开Android studio右侧面板,查看gradle命令,让我们来查看具体命令使用场景。
- AndroidDependencies 查看app module下所依赖得第三方库,以及库中依赖得子库
siningReport 显示渠道包得签名信息
sourceSets 查看项目java ,res ,jni所在得资源位置
assembleDebug 打包所有应用程序debug包
assembleRelease 打包所有应用程序release包
build 打包所有,包括测试项内容
clean 删除构建build目录
cleanBuildCache 删除构建的缓存目录
buildEnvironment app module中声明的所有buildscript依赖项。
installDebug 安装Debug版本
uninstallDebug - 卸载Debug版本
Android gradle插件与gradle版本关系
当我们在根build.gradle引入gradle任务执行得插件时,插件对应gradle最低版本,以下是具体对应关系:
参考文献:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Why-Gradle-