【Android Gradle 插件】Gradle 自定义 Plugin 插件 ⑤ ( 自定义插件中获定义方法 | 在插件中创建 Gradle 任务 | 代码示例 )

Android Plugin DSL Reference 参考文档 :





一、自定义插件中定义普通方法



自定义 Gradle 插件Extension 扩展 中 , 可以定义方法 , 定义的方法可以带参数 , 也可以不带参数 ;

代码示例如下 :

class MyPluginExtensions {
    
    
    def name
    def age

    // 在扩展中定义方法
    def extensionFun() {
    
    
        println 'MyPluginExtensions extensionFun'
    }

    // 在扩展中定义 带参数的方法
    def extensionFun(String str) {
    
    
        println 'MyPluginExtensions extensionFun : ' + str
    }
}

在自定义插件中 , 关联该扩展 :

        // 创建一个扩展
        // 类似于 Android Gradle 插件中的 android
        // 引入了 MyPlugin 插件后
        // 就可以使用 myplugin 配置块
        def myplugin = project.extensions.create("myplugin", MyPluginExtensions)

在 build.gradle 中引入插件 , 并调用该扩展中的方法 :

apply plugin: MyPlugin

myplugin {
    
    
    name 'Tom'
    age 18

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

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

    mypluginextension {
    
    
        name 'Jerry'
        age 19
    }
}

最终的执行结果如下 :

  • 调用无参 extensionFun 函数 , 打印 MyPluginExtensions extensionFun ;
  • 调用 extensionFun 'Hello' 函数 , 传入 'Hello' 字符串作为参数 , 打印 MyPluginExtensions extensionFun : Hello ;

在这里插入图片描述





二、自定义插件中定义 Gradle 任务 Task



在 Android Studio 的 Gradle 面板中的 Task 任务 , 都是在 Android Gradle 插件中定义的 , 在自定义插件中 , 也可以自定义 Gradle 任务 ;

在这里插入图片描述

首先 , 先自定义 Task 任务 , 继承 DefaultTask 类 , 实现一个任务执行方法 , 参考 【Android Gradle 插件】自定义 Gradle 任务 ⑩ ( 自定义任务类继承 DefaultTask 类 | TaskContainer#create 函数创建任务 | 生成自定义任务) 博客 ;

import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction

/**
 * 自定义 Gradle 任务
 */
class MyTask extends org.gradle.api.DefaultTask {
    
    

    @TaskAction
    void run() {
    
    
        println 'MyTask TaskAction'
    }
}

然后 , 在自定义插件中 , 创建 Task 任务 , 并为其制定依赖 ;

  • 这里将 MyTask 任务命名为 HelloMyTask ,
  • 并为其指定 依赖任务 preBuild , 执行 HelloMyTask 自定义任务之前 , 需要先执行 preBuild 任务 ,
  • 设置 preDebugBuild 任务 依赖于 HelloMyTask 自定义任务 , 执行 preDebugBuild 任务之前 , 必须先执行 HelloMyTask 任务 ;
import org.gradle.api.Plugin
import org.gradle.api.Project

class MyPlugin implements Plugin<Project> {
    
    
    @Override
    void apply(Project project) {
    
    
        println 'MyPlugin'

        // 创建一个扩展
        // 类似于 Android Gradle 插件中的 android
        // 引入了 MyPlugin 插件后
        // 就可以使用 myplugin 配置块
        def myplugin = project.extensions.create("myplugin", MyPluginExtensions)

        // 为 MyPlugin 自定义插件的 myplugin 扩展定义 扩展 mypluginextension
        myplugin.extensions.create("mypluginextension", MyPluginExtensionsExtensions)

        // 获取 自定义 Gradle 插件的扩展属性 , 必须在 Gradle 分析完成之后才能进行 , 否则获取不到
        project.afterEvaluate {
    
    
            println project.myplugin.name
            println project.myplugin.age
            println project.myplugin.mypluginextension.name
            println project.myplugin.mypluginextension.age

            // 创建自定义任务 , 并且设置该任务依赖于其它任务
            MyTask myTask = project.tasks.create('HelloMyTask', MyTask)
            // 设置自定义任务依赖于 preBuild 任务
            // 执行 HelloMyTask 自定义任务之前 , 需要先执行 preBuild 任务
            myTask.dependsOn project.tasks.getByName('preBuild')

            // 设置某个任务 依赖于 自定义任务
            // 执行 preDebugBuild 任务之前 , 必须先执行 HelloMyTask 任务
            project.tasks.getByName('preDebugBuild').dependsOn myTask

            // 按照上述配置 , HelloMyTask 任务的执行 需要在 preBuild 与 preDebugBuild 任务之间
        }
    }
}

最后 , 在 build.gradle 构建脚本中引入插件 ;

apply plugin: MyPlugin

编译应用 , 可以看到 HelloMyTask 任务在 preBuild 之后 , 在 preDebugBuild 之前执行 ;

在这里插入图片描述





三、代码示例



代码结构

在这里插入图片描述

自定义插件

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

class MyPlugin implements Plugin<Project> {
    
    
    @Override
    void apply(Project project) {
    
    
        println 'MyPlugin'

        // 创建一个扩展
        // 类似于 Android Gradle 插件中的 android
        // 引入了 MyPlugin 插件后
        // 就可以使用 myplugin 配置块
        def myplugin = project.extensions.create("myplugin", MyPluginExtensions)

        // 为 MyPlugin 自定义插件的 myplugin 扩展定义 扩展 mypluginextension
        myplugin.extensions.create("mypluginextension", MyPluginExtensionsExtensions)

        // 获取 自定义 Gradle 插件的扩展属性 , 必须在 Gradle 分析完成之后才能进行 , 否则获取不到
        project.afterEvaluate {
    
    
            println project.myplugin.name
            println project.myplugin.age
            println project.myplugin.mypluginextension.name
            println project.myplugin.mypluginextension.age

            // 创建自定义任务 , 并且设置该任务依赖于其它任务
            MyTask myTask = project.tasks.create('HelloMyTask', MyTask)
            // 设置自定义任务依赖于 preBuild 任务
            // 执行 HelloMyTask 自定义任务之前 , 需要先执行 preBuild 任务
            myTask.dependsOn project.tasks.getByName('preBuild')

            // 设置 preDebugBuild 任务 依赖于 HelloMyTask 自定义任务
            // 执行 preDebugBuild 任务之前 , 必须先执行 HelloMyTask 任务
            project.tasks.getByName('preDebugBuild').dependsOn myTask

            // 按照上述配置 , HelloMyTask 任务的执行 需要在 preBuild 与 preDebugBuild 任务之间
        }


    }
}

自定义扩展

class MyPluginExtensions {
    
    
    def name
    def age

    // 在扩展中定义方法
    def extensionFun() {
    
    
        println 'MyPluginExtensions extensionFun'
    }

    // 在扩展中定义 带参数的方法
    def extensionFun(String str) {
    
    
        println 'MyPluginExtensions extensionFun : ' + str
    }
}

自定义扩展的扩展

class MyPluginExtensionsExtensions {
    
    
    def name
    def age
}

自定义 Gradle 任务

import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction

/**
 * 自定义 Gradle 任务
 */
class MyTask extends org.gradle.api.DefaultTask {
    
    

    @TaskAction
    void run() {
    
    
        println 'MyTask TaskAction'
    }
}

build.gradle 构建脚本

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

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
    }
}

编译执行结果

Executing tasks: [:app:assembleDebug] in project D:\002_Project\002_Android_Learn\Android_UI

> Task :buildSrc:compileJava NO-SOURCE
> Task :buildSrc:compileGroovy
> Task :buildSrc:processResources NO-SOURCE
> Task :buildSrc:classes
> Task :buildSrc:jar
> Task :buildSrc:assemble
> Task :buildSrc:compileTestJava NO-SOURCE
> Task :buildSrc:compileTestGroovy NO-SOURCE
> Task :buildSrc:processTestResources NO-SOURCE
> Task :buildSrc:testClasses UP-TO-DATE
> Task :buildSrc:test NO-SOURCE
> Task :buildSrc:check UP-TO-DATE
> Task :buildSrc:build

> Configure project :app
MyPlugin
MyPluginExtensions extensionFun
MyPluginExtensions extensionFun : Hello
Tom
18
Jerry
19
AGPBI: {
    
    "kind":"warning","text":"Please remove usages of `jcenter()` Maven repository from your build scripts and migrate your build to other Maven repositories.\nThis repository is deprecated and it will be shut down in the future.\nSee http://developer.android.com/r/tools/jcenter-end-of-service for more information.\nCurrently detected usages in: root project 'Android_UI', project ':app'","sources":[{
    
    }]}

> Task :app:preBuild UP-TO-DATE
> Task :app:HelloMyTask UP-TO-DATE
> Task :app:preDebugBuild UP-TO-DATE
> Task :app:compileDebugAidl NO-SOURCE
> Task :app:compileDebugRenderscript NO-SOURCE
> Task :app:generateDebugBuildConfig
> Task :app:generateDebugResValues
> Task :app:generateDebugResources
> Task :app:checkDebugAarMetadata
> Task :app:createDebugCompatibleScreenManifests
> Task :app:extractDeepLinksDebug
> Task :app:mergeDebugResources
> Task :app:processDebugMainManifest
> Task :app:processDebugManifest
> Task :app:mergeDebugNativeDebugMetadata NO-SOURCE
> Task :app:javaPreCompileDebug
> Task :app:mergeDebugShaders
> Task :app:compileDebugShaders NO-SOURCE
> Task :app:generateDebugAssets UP-TO-DATE
> Task :app:mergeDebugAssets
> Task :app:compressDebugAssets
> Task :app:processDebugJavaRes NO-SOURCE
> Task :app:checkDebugDuplicateClasses
> Task :app:desugarDebugFileDependencies
> Task :app:mergeDebugJniLibFolders
> Task :app:validateSigningDebug
> Task :app:writeDebugAppMetadata
> Task :app:writeDebugSigningConfigVersions
> Task :app:processDebugManifestForPackage
> Task :app:mergeDebugNativeLibs
> Task :app:mergeExtDexDebug
> Task :app:stripDebugDebugSymbols NO-SOURCE
> Task :app:processDebugResources
> Task :app:compileDebugKotlin

> Task :app:compileDebugJavaWithJavac
注: D:\002_Project\002_Android_Learn\Android_UI\app\src\main\java\kim\hsl\ScreenAdaptLayout.java使用或覆盖了已过时的 API。
注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。

> Task :app:compileDebugSources
> Task :app:dexBuilderDebug
> Task :app:mergeDebugJavaResource
> Task :app:mergeDexDebug
> Task :app:packageDebug
> Task :app:assembleDebug

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.7.1/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 25s
28 actionable tasks: 28 executed

Build Analyzer results available

猜你喜欢

转载自blog.csdn.net/han1202012/article/details/127249205