一、 gradle 作用
Gradle 是一个基于 Apache Ant 和 Apache Maven 概念的自动化构建工具【打包 apk 的工具(也可称为构建工具)】。Android 构建系统的作用:编译应用资源和源代码,并将它们打包成 apk。
在Android Studio中它就是个打包apk的工具,可以把你写的Java代码、C++代码和源文件经过编译、连接等操作,最终打包成一个apk,这个过程叫做构建build,故,Gradle就是一个构建项目的工具。
过去 Java 工作者使用 Maven 和 Ant 结合实现部署的自动化,但这两个工具各有优缺点。当项目依赖库的版本变化频繁时,Ant 操作起来较麻烦;当琐碎工作多时,Maven 不能胜任。并且 Maven 和 Ant 都是基于 XML进行配置,无法直观地表达 if、switch 等语法,即使写出来了可读性也不高。而 Gradle 改良了过去 Maven 和 Ant 带给开发者的问题,至今也成为 AS 内置的封装部署工具。
二、相关概念
1.gradle 和 maven、ant 的关系
Ant:eclipse 的 SDK 中一开始集成了一种工具名为 Ant,用于构建 apk。
maven:原来开发过程中,如果想要引用某些 jar 包的话需要自己下载,然后放到 libs 下。maven 简化了开发者的工具,将需要的依赖库配置在文件中,它帮助我们自动下载。
gradle:是基于 Apache Ant 概念和 Apache Maven 概念的项目自动化构建工具。它使用基于 Groovy 的领域特定语言来声明项目设置,而不是 xml。即可通过配置自动下载依赖库也可构建 apk,可视为上述二者的功能集合体。 它使用一种基于 Groovy 的领域特定语言来声明项目设置,而不是传统的 xml。想用什么jar包,直接填写在gradle配置文件中,jar包就会自动帮我们下载到工程中,还能通过配置使jar包时刻保持最新版本。
其实Gradle就是融合了Ant和maven的功能,既能构建项目,又能从网上的maven网站中自动帮我们下载jar包。
- 根据配置文件管理项目依赖:取自 Maven Repos 的概念
- 自动处理部署问题:取自 Ant 概念
- 条件判断写法直觉:取自 Groovy 语言
AS 使用 Gradle 这一高级构建工具包来自动化执行和管理构建流程也对所有应用版本共有的部分加以重复利用。Android Plugin for Gradle 与这个构建工具包协作,共同提供专用于构建和测试 Android 应用的流程和可配置设置。
Gradle 和 Gradle Plugin 独立于 AS 运行。这意味着,可以在 Android Studio 内、使用计算机上的命令行工具或在未安装 Android Studio 的计算机(例如持续性集成服务器)上构建 Android 应用。
二、AS 中和 gradle 相关的文件
setting.gradle
配置工程下的模块。例如工程下有4个模块,那么按下文所示进行配置。
include ':app', ':myapplication2'
模块名前加:
,并且用单引号括起来。
所有需要被构建的模块都需要在
setting.gradle
中注册,它的作用是描述当前构建所参与的模块。
gradle-wrapper.properties
#Wed Jul 03 17:24:15 CST 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
用于告诉开发工具,当我们的电脑上没有 gradle 工具时,它去哪里下载,该下载哪个版本。
工程下的 build.gradle
进行各个模块的一些通用配置。
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.4.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
a)gradle 相关配置
配置 gradle plugin 版本
b)各个模块通用的配置
如:从哪个库下载 jar 包
c)ext 参数配置
d)buildscript结点
表明Gradle工具本身要怎么配置,Gradle工具本身要从哪个maven仓库下载,我们这里默认使用的是一个叫做jcenter的maven仓库(所谓maven仓库其实就是个网站,jcenter的网址是http://jcenter.bintray.com,用浏览器打开可看见里边按照目录存放了很多jar包和其他的库文件,除了jcenter之外,常用的maven仓库还有mavenCentral等)
e)allprojects结点
我们工程里边所有模块的通用配置,上图中的配置表示,这里规定所有模块中要用到的jar包也都从jcenter这个maven仓库中获取。在allprojects标签下配置的好处是你不需要再在每个模块下的build.gradle中单独配置了,如果你想在每个模块下单独指定用哪个maven仓库,那么你在这个全局的build.gradle中也可以不写。
模块下的 build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 29
buildToolsVersion "29.0.0"
defaultConfig {
applicationId "com.example.myapplication"
minSdkVersion 15
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.2.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
a)基本参数配置
包名 appId、sdk版本号
b)buildTypes
可配置发布版、调试版的相关信息
c)dependencies
compile fileTree(include: ['*.jar'], dir: 'libs')
:告诉编译器工程中用到的jar包存放在libs目录中
compile 'com.android.support:appcompat-v7:23.4.0'
:表明到maven库中找v7支持包。com.android.support是支持包在maven库中的存放路径,appcompat-v7是包名,23.4.0是包的版本号
compile project(':library')
,compile project(':baidulib')
:配置该模块引用了哪些Library模块
d)apply plugin
这是Gradle工具规定的写法,意思是我们要使用什么插件来构建项目,后边跟的是插件名称
e)android节点
1)指定要用的android API版本
2)buildToolsVersion:构建工具的版本号,这与我们在代码中调用的api没有关系,是打包用的,建议用比较新的版本
3.Gradle Wrapper是什么
摘抄自:鸿洋-Gradle 7连问,你应该知道这些~
我们一直在使用Gradle,但在我们项目中其实没有用
gradle
命令,而一般是使用gradlew
命令。
gradle处于快速迭代阶段,经常发布新版本,如果我们的项目直接去引用,那么更改版本等会变得务必麻烦。而且每个项目又有可能用不一样的gradle版本,这样去手动配置每一个项目对应的gradle版本会变得麻烦,gradle的引用本来就是想让大家构建项目变得轻松,如果这样的话岂不是又增添了新麻烦?====> 注:是说项目上为了追逐gradle更新的步伐,需要不断修改引用的gradle版本,所以麻烦吗?
所以android想到了包装,引入
gradlw-wrapper
,通过读取配置文件中gradle版本,为每个项目自动的下载和配置gradle。我们便不用关心如何去下载gradle,如何配置到项目中。
gradlew 也是一样的道理,他公有两个文件,
gradlew
是在linux、mac下使用的,gradlew.bat
是在window下使用的,提供在命令行下执行gradle命令的功能。
像gradle一样,gradle命令也是善变的,所以wrapper对命令也进行了一层封装,使用统一的gradlew命令,wrapper会自动去执行具体版本对应的gradle命令。
4.AGP到底是什么
AGP即Android Gradle Plugin,是Android官方开发的Gradle插件,例如
Gradle 本身是一个通用的构建系统,它并不知道你要编译的是Java还是C。如果是在Java中需要调用
javac
将.java
文件编译为.class
文件,而C
则需要调用gcc
将.c
文件编译为.o
文件。那么这些构建流程如果让每个开发者自己去管理就太麻烦了。所谓插件,就是将某种类型的编译的模板。
5.gradle.properties
是什么
我们经常会在这个里面定义一些统一的版本号,minSdkVersion
、targetSdkVersion
等,然后再在各个module中通过rootProject.minSdkVersion
获取以实现复用。
Gradle启动时会默认读取gradle.properties
,并加载其中的参数。这跟我们在运行Gradle的时候通过命令行向其传递参数,效果是一样的。
6.build.gradle
是什么
每个模块都会有一个
build.gradle
来配置当前模块的构建信息,根目录模块的build.gradle
叫做root build script
,其他子模块的叫做module build script
。
一般来说root build script
不是一个实际的模块,而是用于对子模块进行统一的配置,所以root build script
一般不会有太多内容。
三、具体使用
1.依赖传递
2.依赖排除
Q问题:
Duplicate zip entry
A:
exclude-group的配置
compile ('com.squareup.okhttp3:logging-interceptor:3.8.1',{
exclude module: "okhttp" //如果是jar包就这样
//exclude group: 'com.squareup.okhttp3' //三方引用这样,将包名放这 排除
})
3.打包时重命名输出apk并修改路径
参考文献
关于Android Gradle你需要知道这些(1)
从Eclipse到AndroidStudio(四)Gradle基本配置
https://blog.csdn.net/hd243608836/article/details/80696406
https://www.cnblogs.com/steffen/p/9212765.html
repositories配置参考
导入support依赖
compileOnly几个配置的含义
compileOnly仅支持jar
compileOnly仅支持jar
compileOnly仅支持jar-官方issue-track
鸿洋-Gradle 7连问,你应该知道这些~