AndroidStudio Gradle自定义Task实例

本文介绍了一种使用Gradle脚本自动更新项目版本信息至release.xml的方法,通过在根目录创建common.gradle和releaseinfo.gradle文件,实现了每次构建后自动将版本号、版本名和版本详情写入指定XML文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

实现每次重新构建项目后,自动将版本号等信息写入release.xml文件中


在根目录下 新建 common.gradle

//用来存放应用中的所有配置变量,统一管理,而不再是每个moudle里都自己写一份,修改起来更加的方便

ext {
    android = [compileSdkVersion: 29,
               buildToolsVersion: '29.0.0',
               applicationId    : 'com.hongx.gradle_project2',
               minSdkVersion    : 19,
               targetSdkVersion : 29,
               versionCode      : 3,
               versionName      : '2.0.0',
               versionInfo      : 'App的第1个版本,上线了一些最基础核心的功能.',
               multiDexEnabled  : true,
               manifestPlaceholders: [UMENG_CHANNEL_VALUE: 'yingyongbao']]

    signConfigs = ['storeFile'    : 'hongx.jks',
                   'storePassword': '123456',
                   'keyAlias'     : 'hongx',
                   'keyPassword'  : '123456']

    java = ['javaVersion': JavaVersion.VERSION_1_7]

    dependence = ['libAppcompat'      : 'androidx.appcompat:appcompat:1.1.0',
                  'libConstraintlayout'      : 'androidx.appcompat:appcompat:1.1.0']
}

在根目录下新建releaseinfo.gradle

import groovy.xml.MarkupBuilder

/**
 * 描述:版本发布文档自动维护脚本
 * 流程描述:  1、请求本次版本相关信息
 *           2、将版本相关信息解析出来
 *           3、将解析出的数据生成xml格式数据
 *           4、写入到已有的文档数据中
 **/
ext {
    versionName = rootProject.ext.android.versionName
    versionCode = rootProject.ext.android.versionCode
    versionInfo = rootProject.ext.android.versionInfo
    println("project cur versionName = ${versionName}")
    destFile = file('releases.xml')
    if (destFile != null && !destFile.exists()) {
        destFile.createNewFile()
    }
}



task writeTask {
    inputs.property('versionCode', this.versionCode)
    inputs.property('versionName', this.versionName)
    inputs.property('versionInfo', this.versionInfo)
    outputs.file this.destFile
    doLast {
        //将输入的内容写入到输出文件中去
        def data = inputs.getProperties()
        File file = outputs.getFiles().getSingleFile()
        def versionMsg = new VersionMsg(data)
        //将实体对象写入到xml文件中
        def sw = new StringWriter()
        def xmlBuilder = new MarkupBuilder(sw)
        if (file.text != null && file.text.size() <= 0) {
            //没有内容
            xmlBuilder.releases {
                release {
                    versionCode(versionMsg.versionCode)
                    versionName(versionMsg.versionName)
                    versionInfo(versionMsg.versionInfo)
                }
            }
            //直接写入
            file.withWriter { writer -> writer.append(sw.toString())
            }
        } else {
            //已有其它版本内容
            xmlBuilder.release {
                versionCode(versionMsg.versionCode)
                versionName(versionMsg.versionName)
                versionInfo(versionMsg.versionInfo)
            }
            //插入到最后一行前面
            def lines = file.readLines()
            def lengths = lines.size() - 1
            file.withWriter { writer ->
                lines.eachWithIndex { line, index ->
                    if (index != lengths) {
                        writer.append(line + '\r\n')
                    } else if (index == lengths) {
                        writer.append('\r\r\n' + sw.toString() + '\r\n')
                        writer.append(lines.get(lengths))
                    }
                }
            }
        }
    }
}

class VersionMsg {
    String versionCode
    String versionName
    String versionInfo
}

//task readTask {
//    //指定输入文件为上一个task的输出
//    inputs.file this.destFile
//    doLast {
//        //读取输入文件的内容并显示
//        def file = inputs.files.singleFile
//        println file.text
//    }
//}
//
//task taskZ {
//    dependsOn writeTask, readTask
//    doLast {
//        println '输入输出任务结束'
//    }
//}


this.project.afterEvaluate { project ->
    def buildTask = project.tasks.getByName('build')
    if (buildTask == null) {
        throw GradleException('the build task is not found')
    }
    buildTask.doLast {
        writeTask.execute()
    }

}

根目录下的build.gradle文件中引入common.gradle

apply from: this.file('common.gradle')

app的build.gradle文件中引入releaseinfo.gradle

apply plugin: 'com.android.application'
apply from: this.rootProject.file('releaseinfo.gradle')

android {
    compileSdkVersion rootProject.ext.android.compileSdkVersion
    buildToolsVersion rootProject.ext.android.buildToolsVersion

    defaultConfig {
        applicationId rootProject.ext.android.applicationId
        minSdkVersion rootProject.ext.android.minSdkVersion
        targetSdkVersion rootProject.ext.android.targetSdkVersion
        versionCode rootProject.ext.android.versionCode
        versionName rootProject.ext.android.versionName
        multiDexEnabled rootProject.ext.android.multiDexEnabled //突破应用方法数65535的一个限制
        manifestPlaceholders = rootProject.ext.android.manifestPlaceholders

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

//为应用程序添加第三方库依赖
dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation rootProject.ext.dependence.libAppcompat
    implementation rootProject.ext.dependence.libConstraintlayout

    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    
}


执行

./gradlew build 

命令

这样每次就自动将版本信息写入到release.xml文件中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值