Android 应用构建 | Gradle基础 & 编写一个插件

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 命令
在这里插入图片描述

可以看到插件中的日志输出了。

至此,一个简单的插件就开发完成,通常使用的插件内部会有很多额外的功能逻辑。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值