文章目录
- 前言
- 创建gradle项目
- gradle目录结构
- gradle常用命令
- 修改maven仓库地址
- 启用init.gradle的方法
- 关于gradle仓库
- gradle包装器
前言
Gradle是Android构建的基本工具,因此作为Android研发,有必要系统地学一学Gradle,环境windows就可以。
创建gradle项目
我们既可以通过Android Studio创建基于Android的gradle项目,也可以通过gradle命令行创建gradle项目,以命令行为例,在一个空的目录里,执行以下命令:
D:\develop\gradle_test\gradle_demo0>gradle init
而后会让我们选择配置项,如应用类型、项目语言、项目是否包含多个模块、构建脚本语言、测试框架,并且给定项目名和启动类的包名:
D:\develop\gradle_test\gradle_demo0>gradle init
Starting a Gradle Daemon (subsequent builds will be faster)
Select type of project to generate:
1: basic
2: application
3: library
4: Gradle plugin
Enter selection (default: basic) [1..4] 2
Select implementation language:
1: C++
2: Groovy
3: Java
4: Kotlin
5: Scala
6: Swift
Enter selection (default: Java) [1..6] 3
Split functionality across multiple subprojects?:
1: no - only one application project
2: yes - application and library projects
Enter selection (default: no - only one application project) [1..2] 1
Select build script DSL:
1: Groovy
2: Kotlin
Enter selection (default: Groovy) [1..2] 1
Select test framework:
1: JUnit 4
2: TestNG
3: Spock
4: JUnit Jupiter
Enter selection (default: JUnit Jupiter) [1..4] 1
Project name (default: gradle_demo0):
Source package (default: gradle_demo0): com.szc
> Task :init
Get more help with your project: https://docs.gradle.org/7.2/samples/sample_building_java_applications.html
BUILD SUCCESSFUL in 1m 15s
2 actionable tasks: 2 executed
gradle目录结构
得到的目录结构如下所示:
是不是很熟悉,跟用Android Studio创建新的安卓项目产生的目录结构基本是一样的。其中:
- app包括业务逻辑代码及资源、测试代码及资源和构建脚本;
- gradle则是包装器文件夹;
- gradlew和gradlew.bat是包装器的启动脚本(若要执行本地安装的全局gradle,则不应执行该脚本);
- settings.gradle是设置文件,定义项目及子项目名称信息。
app目录结构如下所示:
更眼熟了,src包括业务逻辑代码及资源和测试代码及资源,build.gradle则是模块(因为本项目仅有一个模块,所以也是也是项目的)的构建脚本。
gradle常用命令
gradle指令要在含有build.gradle的目录中执行:
修改maven仓库地址
在gradle安装目录的init.d目录下,新建以.gradle结尾的文件,如init.gradle,输入以下内容:
allprojects {
repositories { // 项目用到的依赖,从repositories指定的仓库中获取,获取时,遍历以下仓库,找到则立刻返回,全部找不到则报错
mavenLocal() // maven本地仓库,要配置M2_HOME环境变量
maven { name "Alibaba" ; url "https://maven.aliyun.com/repository/public" } // name属性非必须,url必须
maven { name "Bstek" ; url "https://nexus.bsdn.org/content/groups/public/" }
mavenCentral() // maven中心仓库
}
buildscript { // 构建脚本build.gradle需要的额外依赖,从buildscript.repositories中获取
repositories {
maven { name "Alibaba" ; url 'https://maven.aliyun.com/repository/public' }
maven { name "Bstek" ; url 'https://nexus.bsdn.org/content/groups/public/' }
maven { name "M2" ; url 'https://plugins.gradle.org/m2/' }
}
}
}
保存过后,以如下脚本为例,查看构建的速度:
/*
* This file was generated by the Gradle 'init' task.
*
* This generated file contains a sample Java application project to get you started.
* For more details take a look at the 'Building Java & JVM projects' chapter in the Gradle
* User Manual available at https://docs.gradle.org/7.2/userguide/building_java_projects.html
*/
plugins {
// Apply the application plugin to add support for building a CLI application in Java.
id 'application'
}
repositories {
// Use Maven Central for resolving dependencies.
mavenCentral()
}
dependencies {
// Use JUnit test framework.
testImplementation 'junit:junit:4.13.2'
// This dependency is used by the application.
implementation 'com.google.guava:guava:30.1.1-jre'
}
application {
// 定义应用的入口类
mainClass = 'com.szc.App'
}
命令的执行效果如下:
D:\develop\gradle_test\gradle_demo0\app>gradle build
BUILD SUCCESSFUL in 16s
7 actionable tasks: 7 executed
启用init.gradle的方法
有以下四种方法,优先级依次降低:
- 在命令行中指定文件:
gradle --init-script somedir/init.gradle -q taskeName
可以通过多次输入该命令来指定多个init文件
2. 将.gradle文件放到USER_HOME/.gradle目录下
3. 将.gradle文件放到USER_HOME/.gradle/init.d目录下
4. 将gradle文件放到GRADLE_HOME/init.d目录下
若存在上述方法的多种方法,则会按优先级依次执行对应目录下的所有gradle文件,某个目录下的gradle文件执行顺序,由文件名的字母序决定。
关于gradle仓库
mavenLocal()本地仓库的位置:决定优先级如下依次降低:
- USER_HOME/.m2/settings.xml;
- M2_HOME/conf/settings.xml;
- USER_HOME/.m2/respository;
- maven本地仓库的默认路径
jcenter()仓库在gradle老版本中支持,但现在已经被废弃了,替换成了mavenCentral()
依赖下载后的保存路径:
- 若依赖在本地仓库中已经存在,则直接复用;
- 否则,将其下载到GRADLE_USER_HOME/caches/modules-2/files-2.1/目录中;
- 若GRADLE_USER_HOME未指定,则保存到USER_HOME/.gradle/caches/modules-2/files-2.1/目录中
上述方式均会存放所有依赖的特定版本的pom文件、源码jar和二进制jar。
gradle包装器
gradle wrapper(gradle包装器)是对gradle的封装,用于解决开发中不同项目用的gradle版本不一的问题,核心是在gradlew或gradlew.bat脚本中指定CLASSPATH:
默认就是gradlew或gradlew.bat脚本所在项目中,gradle/wrapper目录里的gradle-wrapper.jar,因此gradle和gradlew所指定的gradle版本可能不一样(但命令用法是一样的),gradlew指定的gradle版本,可通过gradle/wrapper/gradle-wrapper.properties文件里的distributionUrl查看或修改:
文件中的字段含义如下表所示:
gradle包装器下载gradle时,下载得到的压缩包存放路径为:distributionBase/distributionPath;压缩包解压后的存放路径为:zipStoreBase/zipStorePath
我们可以在项目根目录下执行gradle wrapper --gradle-version=xx来修改gradle-wrapper.properties中的包装器版本号:
D:\develop\gradle_test\gradle_demo0>gradle wrapper --gradle-version=7.1
BUILD SUCCESSFUL in 3s
1 actionable task: 1 executed
而后,通过gradlew.bat build或gradlew build命令进行构建,此时若指定版本的gradle不存在,则会进行下载到gradle-wrapper.properties中的指定目录:
D:\develop\gradle_test\gradle_demo0>gradlew.bat build
Downloading https://services.gradle.org/distributions/gradle-7.1-bin.zip
..........10%...........20%...........30%..........40%...........50%...........60%..........70%...........80%...........90%...........100%
Welcome to Gradle 7.1!
Here are the highlights of this release:
- Faster incremental Java compilation
- Easier source set configuration in the Kotlin DSL
For more details see https://docs.gradle.org/7.1/release-notes.html
Starting a Gradle Daemon (subsequent builds will be faster)
BUILD SUCCESSFUL in 43s
7 actionable tasks: 7 executed
得到的指定版本的gradle存放目录及结构如下所示(我的GRADLE_USER_HOME为D:\develop\Android\gradle):
同时,gradlew还会在GRADLE_USER_HOME/caches中构建该版本gradle的缓存,如下所示:
再使用相同版本的gradle包装器构建项目时,就不会重新下载了。