android自定义plugin案例

  • 创建一个plugin lib库

    详细请看:

    androidStudio5.0 自定义Plugin

  • 创建一个与build.gradle交互的类

package com.hxg.gradle.study

/**
 * 与自定义plugin进行参数传递
 */
class ReleaseInfoExtension {
    String versionCode
    String versionName
    String versionInfo
    String fileName

    ReleaseInfoExtension() {
    }

    @Override
     String toString() {
        """|versionCode= ${versionCode}
           |versionName= ${versionName}
           |versionInfo= ${versionInfo}
           |fileName= ${fileName}
        """.stripMargin()
    }
}

  • 自定义Task
package com.hxg.gradle.study

import groovy.xml.MarkupBuilder
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction

/**
 * 自定义Task,实现维护版本信息功能
 */
class HxgReleaseTask extends DefaultTask {
    HxgReleaseTask() {
        group = 'huang'
        description = 'update the release info'
    }

    /**
     * 执行于gradle执行阶段的代码
     */
    @TaskAction
    void doAction() {
        updateinfo()
    }
    /**
     * 真正的将Extension类中的信息,写入指定的文件中
     */
    private void updateinfo() {
        //获取将要写入的信息
        String versionCodeMsg = project.extensions.HxgReleaseInfo.versionCode
        String versionNameMsg = project.extensions.HxgReleaseInfo.versionName
        String versionInfoMsg = project.extensions.HxgReleaseInfo.versionInfo
        String fileName = project.extensions.HxgReleaseInfo.fileName
        def file = project.file(fileName)
        //将实体对象转换为xml
        def sw = new StringWriter()
        def xmlBuilder = new MarkupBuilder(sw)
        if (file.text != null && file.text.size() <= 0) {
            //文件中没有内容
            xmlBuilder.releases {
                release {
                    versionCode(versionCodeMsg)
                    versionName(versionNameMsg)
                    versionInfo(versionInfoMsg)
                }
            }
            file.withWriter { writer -> writer.append(sw.toString()) }
        } else {
            def text = file.readLines().get(file.readLines().size() - 5)
            def startIndex = text.indexOf('>')
            def stopIndex = text.indexOf('</')
            if (text.substring(startIndex + 1, stopIndex).toInteger() >= versionCodeMsg.toInteger()) {
                return
            }
            //已有版本信息
            xmlBuilder.release {
                versionCode(versionCodeMsg)
                versionName(versionNameMsg)
                versionInfo(versionInfoMsg)
            }
            //将生成的xml数据插到根结点之前
            def lines = file.readLines()
            def lengths = lines.size() - 1
            file.withWriter { writer ->
                lines.eachWithIndex { String line, int index ->
                    if (index != lengths) {
                        writer.append(line + "\r\n")
                    } else if (index == lengths) {
                        writer.append('\r\n' + sw.toString() + '\r\n')
                        writer.append(lines.get(lengths))
                    }
                }
            }
        }
    }
}

  • 在plugin中执行这个task任务
/**
 * 这里的包名千万不能丢(你可以先建个class,然后修改后缀名为groovy),否者会出现
 * Unable to load class ‘......Plugin’
 * 血的教训
 */
package com.hxg.gradle.study

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

/**
 * 自定义插件
 */
class GradleOnePlugin implements Plugin<Project> {
    /**
     * 插件被引入是需要执行的方法
     * @param project 引入当前插件的project
     */
    @Override
    void apply(Project project) {
        //创建扩展属性
        project.extensions.create('HxgReleaseInfo',ReleaseInfoExtension)
        //创建Task
        project.tasks.create('HxgReleaseTask',HxgReleaseTask)
    }
}
  • 在引入插件的module中进行传值
/**
 * task输入输出讲解
 */
ext {
    versionName = '1.0.8'
    versionCode = '108'
    versionInfo = 'App的第8个版本,上线基本架构核心功能'
    destFile = file('releases.xml')
    if (destFile != null && !destFile.exists()) {
        destFile.createNewFile()
    }
}
/**
 * 为自定义插件传递参数
 *
 */

HxgReleaseInfo{
    versionCode=this.versionCode
    versionName=this.versionName
    versionInfo=this.versionInfo
    fileName='releases.xml'
}


重新编译我们的插件(uploadArchives)——>执行任务(HxgReleaseTask )

在这里插入图片描述

在这里插入图片描述

  • 结果呈现
<releases>
  <release>
    <versionCode>106</versionCode>
    <versionName>1.0.6</versionName>
    <versionInfo>App的第6个版本,上线基本架构核心功能</versionInfo>
  </release>

  <release>
    <versionCode>108</versionCode>
    <versionName>1.0.8</versionName>
    <versionInfo>App的第8个版本,上线基本架构核心功能</versionInfo>
  </release>
</releases>
发布了316 篇原创文章 · 获赞 660 · 访问量 122万+

猜你喜欢

转载自blog.csdn.net/huangxiaoguo1/article/details/103633033
今日推荐