[TOC]
Groovy基础
1.1 def关键字
def value = 1;
value = “zhangsan”//def 也可以用来定义方法,当方法指明返回值的时候,def关键字可以被省略。
1.2 String
Groovy的string分两种 String)(java.lang.String)和GString (groovy.lang.GString):
1 | def value = '我是字符串' |
1.3 List
定义 def value = [“a”, “b”, “c”];
value[0] = 4;
查: value[0]
默认是ArrayList,可以通过强类型来声明
LinkedList value = [1,2,3]
1.4 Map
- 定义:def value = [“a”:a, “b”:2]
- 增, 改:value.a =100 或者 value[“a”] = 100
- 查:value.a 或 value[“a”]
1.5 Range
- 定义:def value = 1..10
- 使用:if(1 in value)
1.6 metaClass
在groovy中可以在运行期间使用metaClass添加方法和属性,以下代码可以被正确执行
1 | class A { |
1.7闭包
闭包是groovy中一个很重要的东西
- 闭包的定义:
1 | def value = { String name -> |
- 闭包的使用
1 | value.call("sfas") 或 value("sfas") |
- 闭包的委托策略:
- 闭包有三个相关的对象:
- this: 闭包定义出最近的对象(不含闭包)
- owner:闭包定出最近的对象或闭包
- delegate:闭包的代理对象,默认和owner一致,可以手动设置;
- 闭包的委托策略:
- Closure.OWNER_FIRST: 默认策略,首先从owner上寻找属性或方法,找不到
- 闭包有三个相关的对象:
…
2:Gradle执行流程
- 初始化界面:解析settings.gradle来获取模块信息
- 配置阶段:配置每个模块,构建task树
- 执行阶段:执行任务
3:Project
3.1: Project相关API
- getRootProject:获取根project
- getAllProjects:获取所有Project
- getSubprojects:获取所有字Project
- allprojects:遍历所有project
- subprojects:遍历所有子project
3.2:属性相关的API
hasProperty:检测属性是否存在
findProperty:查找属性
自定义property:
通过命令行参数定义property:gradle build -P a=1
通过project.ext定义参数:
1
2
3
4ext.a = 1
ext {
a = 1
}
3.3: Task相关的API
- getTasks:获取当前project所有task
- task:创建一个task
3.4: 文件相关API
- file:获取文件
- fileTree:获取文件夹
- getBuildDir:获取build文件夹
3.5 Gradle生命周期API
beforeEvaluate:配置阶段开始之前
afterEvaluate:配置阶段结束
这是一个比较重要的生命周期,当走到这里时,说明所有task’都已经配置完成了,我们可以进行操作加入我们的逻辑,也可以出入我们自定义的task
gradle.buildFinished:执行阶段结束
3.6:其它API
- exec:执行外部命令,我们后面会用到这个方法
4:Task
Task是gradle另外一个很重要的东西:
4.1:Task定义
- 我们可以通过我们的Project中的Task方法来进行定义一个Task
1 | task myTask{ |
- 我们也可以使用Project中的TaskContainer来定义一个Task
1 | project.tasks.create(name: "myTask") { |
4.2:Task基本信息配置
1 | task myTask ( |
4.3: Task依赖
Task可以通过调用dependsOn方法配置他依赖的Task,可以是一个也可以是多个。
1 | task A { |
我们执行Task B的时候会先执行Task A,应该Task b依赖Task A
4.4: Task执行
写在我们Task闭包内的代码是执行在Gradle的配置阶段的,执行每一个任务时都会执行一遍,如果想执行在执行阶段,需要将代码写在doFirst或doLast中。
1 | task myTask { |
实战 (自定义Plugin)
创建工程:
androidstudio创建一个工程
src/main下新建两个文件夹,groovy、resources,
这个这里的名字叫什么都可以
修改
app文件夹下的build.gradle文件1
2
3
4
5
6
7
8
9
10
11
12
13
14apply plugin: 'groovy' //使用groovy插件
dependencies {
implementation gradleApi() //引入gradleApi
}
sourceSets {
main {
groovy {
srcDir 'src/main/groovy' //指定groovy目录
}
resources {
srcDir 'src/main/resources' //指定resources目录
}
}
}在groovy目录新建PublishAppPlugin.groovy文件,实现Plugin接口
1
2
3
4
5class PublishAppPlugin implements Plugin<Project> {
void apply(Project project) { //入口
println "hello plugin"
}
}在resources/META-INF/gradle-plugins目录中新建com.wanzhi.plugin.publishApp.properties文件,这个文件名就是要是使用我们插件时要
apply的名字,这里叫com.wangzhi.plugin.publishApp,这个文件写入代码:1
implementation-class = com.wangzhi.plugin.publishAppPlugin
目录结构
接收必要的参数
根据我们的需求,我们需要以下参数。
- 360加固包的路径
- 签名文件的路径、密码信息
- 渠道文件的路径
- 文件输出路径
定义扩展形象,新建
PublishAppINfoExtension.groovy文件,根据上面的信息,定义相关参数1
2
3
4
5
6
7
8
9class PublishAppInfoExtension {
String qihuPath //360加固包(jiagu.jar)的文件路径
String keyStorePath
String keyStorePass
String keyStoreKeyAlias
String keyStoreKeyAliasPass
String channelPath
String outputPath
}为目标工程定义扩展:
1
2
3
4
5class PublishAppPlugin implements Plugin<Project> {
void apply(Project project) {
project.extensions.create("publishAppInfo", PublishAppInfoExtension.class)
}
}
功能实现:
自定义Task
- 新建
PublishAppTask继承DefaultTask
1
2
3
4
5
6
7
8
9
10
11class PublishAppTask extends DefaultTask {
PublisAppTask() {
group = "zhousaito"
dependOn "build"
}
void doAction() {
//打包已完成
}
}为目标工程定义我们的Task
1
2
3
4
5
6
7class PublishAppPlugin implements Plugin<Project> {
void apply(Project project) {
project.extensions.create("publishAppInfo", PublishAppInfoExtension)
project.tasks.create("publishApp", PublishAppTask.class)
}
}
- 新建
2. @TaskAction 是任务的执行的方法,会在执行阶段执行,因为我们的任务时依赖于build的,所以我们执行任务时,打包已经完成加固我们的应用
这里参考360加固的命令行加固相关文档即可。
webVIew优化