Gradle
1.定义:
2.应用开发流程
3.APK构建流程
Gradle执行
gradlew + 任务名称+选项
Groovy
基本语法
//单行注释
/*
多行注释
*/
//基本数据类型 byte,short,int ,long ,float,double,char
//变量声明
int a =10
def b =10
print("a=$a \n")
//字符串声明
String str = "hello,world"
String str2 = str.toUpperCase()
print("$str2 \n")
//集合
def array = [1,2,3,4]
array.add(5)
array.each {
print("$it")
}
print("${array} \n")
//映射表
def map = ["name":"ls","age":"100"]
print("${map} \n")
//循环
for (int i = 0; i < 10; i++) {
println($i)
}
//方法
def hello(int arg) {
}
hello(1)
进阶语法
DSL(Domain Specific Language)
领域专用语言
闭包
//闭包
def c= {
println("hello def c")
}
c()
def c1= { it->
println("hello $it")
}
c1("hahah")
def c2 = {//只有一个参数时可以省略
println("hello $it")
}
c2("hah")
def c3 = { arg1,arg2->
println("hello $arg1,$arg2")
}
c3("hah,la")
** DSL**
//自定义DSL
class DefaultConfig {
private String versionName;
def versionName(String versionName) {
this.versionName = versionName
}
@Override
String toString() {
return "DefaultCofig {versionName = $versionName}"
}
}
class Android {
private int compileSdkVersion
private DefaultConfig defaultConfig
Android() {
this.defaultConfig = new DefaultConfig()
}
def compileSdkVersion(int compileSdkVersion) {
this.compileSdkVersion = compileSdkVersion
}
def defaultConfig(Closure closure) {
//闭包与具体对象关联
closure.setDelegate(defaultConfig)
closure.call()
}
}
def mAndroid = {
compileSdkVersion 27
defaultConfig {
versionName "1.0"
}
}
Android android = new Android()
mAndroid.delegate=android
mAndroid.call()
println("mAndroid = $android")
构建
声明周期
- 初始化
- 配置阶段(执行各个目录的build.gradlew脚本)
- 执行阶段 (配置阶段的任务执行)
在setting.gradle中设置监听回调:
def lifeTag ="Life Log----:"
gradle.addBuildListener(new BuildAdapter(){
@Override
void settingsEvaluated(Settings settings) {
super.settingsEvaluated(settings)
println("$lifeTag 初始化阶段完成")
}
@Override
void projectsEvaluated(Gradle gradle) {
super.projectsEvaluated(gradle)
println("$lifeTag 配置化阶段完成")
}
@Override
void buildFinished(BuildResult result) {
super.buildFinished(result)
println("$lifeTag 构建结束")
}
})
在app目录下的build.gradle中添加测试任务
task testTask(){
doLast {
println("[life Log----:] 任务代码")
}
}
执行 _**gradlew :app:testTask -q **_命令:
Gradle插件
- 提供具体的构建功能 Task
- 提高代码的复用性
分类
- 二进制插件
- 脚本插件
尝试开发一个插件
1.建立buildSrc子工程
在新建的项目中添加buildSrc目录,并创建一个build.gradle文件
build.gradle 配置:
//引用groovy 插件,编译插件工程中的代码
apply plugin: 'groovy'
repositories{
jcenter()
}
dependencies {
implementation gradleApi()
implementation localGroovy()
}
2.创建插件的运行入口
创建src目录,新建RouterPlugin.groovy文件
创建RouterPlugin:
package com.plugin.gradle
import org.gradle.api.Plugin
import org.gradle.api.Project
class RouterPlugin implements Plugin<Project> {
//注入插件的逻辑
@Override
void apply(Project project) {
println("RouterPlugin , apply from")
}
}
3.创建properties文件供外部使用、
创建resources\META-INF\gradle-pluginsm目录,
新建com.plugin.router.properties文件
implementation-class = com.plugin.gradle.RouterPlugin
4.在主项目模块中使用插件
app目录下的build.gradle中:
执行gradlew clean -q
可以看到插件的apply中的日志已经输出了,这里的app就是project的名称。
5.参数配置
比如现在要配置一个动态的保存路径的参数,供外部定义
1.定义extension,新建文件
package com.plugin.gradle
class RouterExtension{
String saveDir
}
2.注册Extension到插件
在apply中添加
class RouterPlugin implements Plugin<Project> {
//注入插件的逻辑
@Override
void apply(Project project) {
println("RouterPlugin , apply from ${project.name}")
//注册参数
project.getExtensions().create("router",RouterExtension)
}
}
3.外部配置参数
在App目录下的build.gradle中添加:
router {
saveDir getRootDir().absolutePath
}
4.获取配置的extension
在构建的配置阶段完成后即可获取配置参数了:
class RouterPlugin implements Plugin<Project> {
//注入插件的逻辑
@Override
void apply(Project project) {
println("RouterPlugin , apply from ${project.name}")
project.getExtensions().create("router",RouterExtension)
//配置阶段结束了 就可以获取配置的参数
project.afterEvaluate {
RouterExtension extension = project["router"]
println("外部配置路径为:${extension.saveDir}")
}
}
}
再执行 gradlew clean -q命令,可以看到控制台的打印日志:
6.发布与使用
发布
在插件目录的build.gradle文件中添加:
apply plugin: 'maven'
// 配置maven插件中的uploadArchives任务
uploadArchives {
repositories {
mavenDeployer {
// 设置发布路径为 工程根目录下面的 repo 文件夹
//这里可以配置远程仓库
repository(url: uri('../repo')) {
// 设置groupId,通常为包名
pom.groupId = 'com.plugin.router'
// 设置artifactId,为当前插件的名称
pom.artifactId = 'router-gradle-plugin'
// 设置 插件的版本号
pom.version = '1.0.0'
}
}
}
}
//也可以配置远程仓库
repository(url: '私服仓库地址') {
authentication(userName: '账号', password: '密码')
}
snapshotRepository(url: '私服快照地址') {
authentication(userName: '账号', password: '密码')
}
执行命令,将buildSrc目录拷贝到新的router-gradle-plugin目录下才可以发布,buildSrc是一个预保留的项目名所以构建不了。
在根项目的build.gradle中添加:
include ':app',':router-gradle-plugin'
同步项目成功后,执行 gradlew :router-gradle-plugin:uploadArchives
可以看到在项目根目录中新生成的repo目录:
将版本插件改为1.0.1,通过idea的gradle面板点击uploadArchive即可发布插件了
可以看到成功之后的目录:
这个就是生成的二进制jar包
在别的项目中如何使用呢?
1.在新建的项目根目录的build.gradle文件中添加仓库地址
repositories {
//maven仓库地址路径,相对绝对路径都可以
maven {
url uri("E:\\Demo\\PluginTest\\repo")
}
google()
jcenter()
}
allprojects {
repositories {
//maven仓库地址路径,相对绝对路径都可以
maven {
url uri("E:\\Demo\\PluginTest\\repo")
}
google()
jcenter()
}
}
2.在dependencies中声明依赖的插件:
dependencies {
classpath 'com.android.tools.build:gradle:4.1.3'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
/**
* 声明依赖插件
* groupId :artifactId :version
*/
classpath 'com.plugin.router:router-gradle-plugin:1.0.1'
}
3.在app目录下的build.gradle中使用插件并配置extension字段传递参数:
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-android-extensions'
id 'com.plugin.router'
}
router {
saveDir getRootDir().absolutePath
}
4.同步项目成功之后,执行 gradlew clean -q 命令
可以看到插件中的日志输出了。
至此,一个简单的插件就开发完成,通常使用的插件内部会有很多额外的功能逻辑。