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

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于Android Gradle 插件Gradle 自定义 Plugin 插件 ⑤ ( 自定义插件中获定义方法 | 在插件中创建 Gradle 任务 | 代码示例 )的主要内容,如果未能解决你的问题,请参考以下文章

Android Gradle 插件Gradle 自定义 Plugin 插件 ⑦ ( 自定义 Gradle 插件导入方式 | buildSrc 插件导入 | 构建脚本中自定义插件 | 独立文件 )

Android Gradle 插件Gradle 自定义 Plugin 插件 ⑦ ( 自定义 Gradle 插件导入方式 | buildSrc 插件导入 | 构建脚本中自定义插件 | 独立文件 )

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

Android Gradle 插件Gradle 自定义 Plugin 插件 ④ ( 为自定义 Gradle 插件的扩展配置扩展 | 在自定义插件中获取扩展属性 )

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

Android Gradle 插件自定义 Gradle 插件模块 ① ( 在 Module 模块中自定义 Gradle 插件 | 创建自定义插件类型模块 | 手动导入相关依赖 )