【Android Gradle 插件】自定义 Gradle 插件模块 ⑤ ( 完整总结 ) ★★★

Android Plugin DSL Reference 参考文档 :





一、创建自定义插件类型模块 ( Java or Kotlin Library )



选择 " 菜单栏 / New / New Module… " 选项 ,

在这里插入图片描述

在 " Create New Module " 对话框中 , 选择 创建 " Java or Kotlin Library " 类型的依赖库 ;

在这里插入图片描述





二、手动导入相关依赖 ( Java | Groovy | Gradle )



buildSrc 目录 下 , 会自动引入 Java / Groovy / Gradle 的依赖 , 但是在自己创建的 Java Library 类型的依赖库 中 , 需要将其 手动引入 , 在 该 Module 模块的 build.gradle 构建脚本中引入上述依赖 ;

plugins {
    id 'java-library'
    id 'kotlin'
    id 'groovy'
}

java {
    sourceCompatibility = JavaVersion.VERSION_1_7
    targetCompatibility = JavaVersion.VERSION_1_7
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation gradleApi()
    implementation localGroovy()
    implementation fileTree(dir: 'libs', includes: ['*.jar'])
}

在这里插入图片描述





三、在 Java or Kotlin Library 模块中定义插件



在插件模块中的 src/main 目录 下创建 groovy 目录 , 用于存放 Groovy 代码 , 在其中定义包名以及包名下的源码 :

在这里插入图片描述

代码示例如下 :

package kim.hsl.plugin

import org.gradle.api.Plugin
import org.gradle.api.Project

class Plugin4 implements Plugin<Project> {

    @Override
    void apply(Project project) {
        println 'Plugin4'
    }
}

注意 : 此时的 自定义 Gradle 插件是无法在其它 Module 中引入的 ;





四、配置自定义 Gradle 插件发布选项



如果想要将 插件上传到 远程仓库 或者 本地仓库 中 , 需要引入一个 maven-publish 插件 ;

// 用于将 插件上传到 远程仓库 或者 本地仓库 中
apply plugin: 'maven-publish'

然后 , 创建 publishing 扩展 , 在该扩展中 , 可以在其中的 publications 脚本块 中为插件传入参数 ;
注意 : publications 中的 plugin 函数是任意命名的 ;

// 发布到 远程/本地仓库 相关配置
publishing {
    publications {
        // plugin 函数是随意命名的函数
        plugin(MavenPublication) {
            // 配置上传内容
            // components.java 是打包的 jar 包
            from components.java
        }
    }
}

在 Android Studio 工程根目录中的 build.gradle 构建脚本中 , 引入插件代码如下 :

buildscript {
    dependencies {
        classpath "com.android.tools.build:gradle:4.2.1"
    }
}




五、配置 Group 分组、插件名称、插件版本号



引入自定义 Gradle 插件的 “com.android.tools.build:gradle:4.2.1” 代码中

  • " com.android.tools.build " Group 分组
  • " gradle "插件名称
  • " 4.2.1 "插件的版本号

上述 3 3 3 个元素使用 " : " 英文冒号 隔开 ;


因此 , 在自定义 Gradle 插件模块中 , 也可以指定

  • Group 分组
  • 插件名称
  • 插件版本号

3 3 3 个信息 ;


通过 Project#setGroup 方法 , 指定 Gradle 插件分组 ;

// 指定自定义 Gradle 插件的分组
group 'kim.hsl.plugin'

通过 Project#setVersion 方法 , 指定 Gradle 插件的版本号

// 指定自定义 Gradle 插件的版本号
version '0.1'

自定义 Gradle 插件的名称 , 默认为工程名 , 也可以在 publishing / publications / xxx / artifactId 配置中 自己指定 插件名称 ;

// 用于将 插件上传到 远程仓库 或者 本地仓库 中
apply plugin: 'maven-publish'

// 发布到 远程/本地仓库 相关配置
publishing {
    publications {
        // plugin 函数是随意命名的函数
        plugin(MavenPublication) {
            // 配置上传内容
            // components.java 是打包的 jar 包
            from components.java

            // 指定自定义 Gradle 插件名称
            artifactId 'plugin'
        }
    }
}

相关代码如下 :

// 指定自定义 Gradle 插件的分组
group 'kim.hsl.plugin'

// 指定自定义 Gradle 插件的版本号
version '0.1'

// 自定义 Gradle 插件的名称 , 默认为工程名
// 也可以在 publishing / publications 脚本块中 自己指定


// 用于将 插件上传到 远程仓库 或者 本地仓库 中
apply plugin: 'maven-publish'

// 发布到 远程/本地仓库 相关配置
publishing {
    publications {
        // plugin 函数是随意命名的函数
        plugin(MavenPublication) {
            // 配置上传内容
            // components.java 是打包的 jar 包
            from components.java

            // 指定自定义 Gradle 插件名称
            artifactId 'plugin'
        }
    }
}




六、自定义 Gradle 插件发布配置



在上一篇博客 【Android Gradle 插件】自定义 Gradle 插件模块 ② ( 在模块中定义插件 | 引入自定义 Gradle 插件模块 | 配置 Gradle 插件上传选项 | 配置分组名称版本号 ) 中 , 定义完插件后 , 在 自定义 Gradle 插件模块 的 build.gradle 构建脚本中 , 添加了 插件上传仓库的 配置 , 为插件指定了 分组 , 版本号 , 名称 配置 ;

// 指定自定义 Gradle 插件的分组
group 'kim.hsl.plugin'

// 指定自定义 Gradle 插件的版本号
version '0.1'

// 自定义 Gradle 插件的名称 , 默认为工程名
// 也可以在 publishing / publications 脚本块中 自己指定


// 用于将 插件上传到 远程仓库 或者 本地仓库 中
apply plugin: 'maven-publish'

// 发布到 远程/本地仓库 相关配置
publishing {
    publications {
        // plugin 函数是随意命名的函数
        plugin(MavenPublication) {
            // 配置上传内容
            // components.java 是打包的 jar 包
            from components.java

            // 指定自定义 Gradle 插件名称
            artifactId 'plugin'
        }
    }
}

首次编译执行 , 可以在 自定义 Gradle 插件的 Module 模块 下 , 看到 publishing 分组的 Gradle 任务 , 如下图红色矩形框中的内容 ;

  • generatePomFileForPluginPublication 任务的作用是 生成 Pom 文件 , 该文件是 Maven 仓库的描述文件 ;

  • publishPluginPublicationToMavenLocal 任务的作用是将 Gradle 插件 上传到本地 Maven 仓库中 ;

在这里插入图片描述





七、META-INF 中声明自定义插件的核心类



参考 Android Gradle 插件内容 , 将 Android Studio 的 Project 面板中的 External Libraries 展开 ,

在这里插入图片描述

在 Android Gradle 插件中 , 需要在 META-INF/gradle-plugins/插件组名.插件名.properties 文件中 ,
在这里插入图片描述

声明该 自定义插件的

implementation-class=org.gradle.api.plugins.antlr.AntlrPlugin

在自己的自定义插件中 , 也需要进行上述配置 ;

在 " src/main " 目录下 , 创建 " resources\META-INF\gradle-plugins " 目录 , 在该目录下创建 " kim.hsl.plugin.properties " 配置文件 , 内容为 :

implementation-class=kim.hsl.plugin.Plugin4

在这里插入图片描述

上述配置完毕后 , 重新执行 publishPluginPublicationToMavenLocal 任务 ;

在这里插入图片描述





八、将插件上传到本地 Maven 仓库



执行 Gradle 面板中的 publishPluginPublicationToMavenLocal 任务 , 即可将该 Module 生成的 jar 包上传到本地 Maven 仓库中 ;

在这里插入图片描述
然后再查看本地 Maven 仓库中的内容 , 发现 " C:\Users\octop.m2\repository " 目录中 多了一个 kim 目录 :

在这里插入图片描述

进入到 " C:\Users\octop.m2\repository\kim\hsl\plugin\plugin " 目录中 , 内容如下 :
在这里插入图片描述
进入到 " C:\Users\octop.m2\repository\kim\hsl\plugin\plugin\0.1 " 目录中 , 内容如下 :

在这里插入图片描述





九、在应用中依赖本地 Maven 仓库中的自定义 Gradle 插件



依赖本地 Maven 仓库 , 并导入 自定义 Gradle 插件 依赖 ;

buildscript {
    repositories {
        mavenLocal()    // 依赖本地 Maven 仓库
    }
    dependencies {
        classpath "kim.hsl.plugin:plugin:0.1" // 依赖本地 Maven 仓库下的自定义 Gradle 插件
    }
}

引入 自定义 Gradle 插件 ;

apply plugin: 'kim.hsl.plugin'




十、完整代码示例



自定义 Gradle 插件 - GitHub 地址 : https://github.com/han1202012/Android_UI


自定义插件代码

package kim.hsl.plugin

import org.gradle.api.Plugin
import org.gradle.api.Project

class Plugin4 implements Plugin<Project> {

    @Override
    void apply(Project project) {
        println 'Plugin4'
    }
}

自定义插件 Gradle 构建脚本

plugins {
    id 'java-library'
    id 'kotlin'
    id 'groovy'
}

java {
    sourceCompatibility = JavaVersion.VERSION_1_7
    targetCompatibility = JavaVersion.VERSION_1_7
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation gradleApi()
    implementation localGroovy()
    implementation fileTree(dir: 'libs', includes: ['*.jar'])
}

// 指定自定义 Gradle 插件的分组
group 'kim.hsl.plugin'

// 指定自定义 Gradle 插件的版本号
version '0.1'

// 自定义 Gradle 插件的名称 , 默认为工程名
// 也可以在 publishing / publications 脚本块中 自己指定


// 用于将 插件上传到 远程仓库 或者 本地仓库 中
apply plugin: 'maven-publish'

// 发布到 远程/本地仓库 相关配置
publishing {
    publications {
        // plugin 函数是随意命名的函数
        plugin(MavenPublication) {
            // 配置上传内容
            // components.java 是打包的 jar 包
            from components.java

            // 指定自定义 Gradle 插件名称
            artifactId 'plugin'
        }
    }
}

自定义插件插件类配置

implementation-class=kim.hsl.plugin.Plugin4

根目录 build.gradle 构建脚本

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    ext.kotlin_version = "1.5.0"
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:4.2.1"
        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
    }
}

allprojects {
    repositories {
        google()
        mavenCentral()
        jcenter() // Warning: this repository is going to shut down soon
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

// 定义扩展属性 , 其中的变量对所有子项目可见
ext {
    hello1 = 'Hello World1!'
    hello2 = 'Hello World2!'
}


gradle.addBuildListener(new BuildListener() {
    @Override
    void buildStarted(Gradle gradle) {
        // 构建开始时回调该函数
    }

    @Override
    void settingsEvaluated(Settings settings) {
        // 分析 settings.gradle 函数完成后回调该函数
    }

    @Override
    void projectsLoaded(Gradle gradle) {

    }

    @Override
    void projectsEvaluated(Gradle gradle) {

    }

    @Override
    void buildFinished(BuildResult buildResult) {
        // 构建完成时回调的函数
    }
})

app 模块目录下 build.gradle 构建脚本

核心代码 :

buildscript {
    repositories {
        mavenLocal()    // 依赖本地 Maven 仓库
    }
    dependencies {
        classpath "kim.hsl.plugin:plugin:0.1" // 依赖本地 Maven 仓库下的插件
    }
}

apply plugin: 'kim.hsl.plugin'

完整代码 :

buildscript {
    repositories {
        mavenLocal()    // 依赖本地 Maven 仓库
    }
    dependencies {
        classpath "kim.hsl.plugin:plugin:0.1" // 依赖本地 Maven 仓库下的插件
    }
}

plugins {
    id 'com.android.application'
    id 'kotlin-android'
}

apply plugin: 'kim.hsl.plugin'


android {
    compileSdkVersion 31
    buildToolsVersion "30.0.3"

    defaultConfig {
        applicationId "kim.hsl.android_ui"
        minSdkVersion 18
        targetSdkVersion 31
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
    // 定义扩展属性 , 其中的变量对所有子项目可见
    /*ext {
        hello3 = 'Hello World1!3'
    }*/
}

dependencies {

    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation 'androidx.core:core-ktx:1.6.0'
    implementation 'androidx.appcompat:appcompat:1.4.1'
    implementation 'com.google.android.material:material:1.5.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

apply plugin: MyPlugin

myplugin {
    name 'Tom'
    age 18

    // 调用在扩展中定义的方法
    // 打印 'MyPluginExtensions extensionFun'
    extensionFun()

    // 调用 扩展中 带参数的方法
    extensionFun 'Hello'

    mypluginextension {
        name 'Jerry'
        age 19
    }
}

// 在 build.gradle 中定义 Gradle 插件
class MyPlugin2 implements Plugin<Project> {

    @Override
    void apply(Project project) {
        println 'MyPlugin2'
    }
}

// 引入在本文件中定义的 Gradle 插件
apply plugin: MyPlugin2

// 该操作相当于将 plugin.gradle 文件拷贝到此处
apply from: 'plugin.gradle'





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值