AndroidStudio Gradle自定义Task实例

news/2024/5/20 5:08:19 标签: android, gradle, task

文章目录

实现每次重新构建项目后,自动将版本号等信息写入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文件中


http://www.niftyadmin.cn/n/1838294.html

相关文章

HK-7710系列DTU 多中心.doc

HK-7710系列DTU 多中心说明文档北京环控科技有限公司2006年2月目 录1 名词解释. 42 进入配置菜单方法. 53 配置菜单总列表. 64 移动服务中心设置. 74.1 服务代码. 74.2 PPP用户名. 74.3 PPP密码. 74.4 SIM/UIM PIN 74.5 接入点名称(APN) 75 终端单元设置.…

腾讯技术开放日 | 保障视频连线画质清晰且流畅,腾讯会议有这些优化实践

腾讯会议自去年12月底推出&#xff0c;在疫情期间极速扩容&#xff0c;日活跃用户超过1000万。面对数量庞大的用户&#xff0c;以及他们背后网络、设备的多样性&#xff0c;该如何针对各个场景进行优化以提升用户体验&#xff1f;在【腾讯技术开放日 云视频会议专场】中&#…

Gradle核心之Task详解

文章目录Task定义和配置定义配置Task源码Task执行详解doFirst计算build执行时长Task执行顺序Task依赖动态依赖Task解析xml并输出到文件Task输入输出输入输出示例挂接自定义Task到构建过程中挂接过程详解Task类型查看task ./gradlew tasksTask定义和配置 定义 //直接通过task…

ORB特征原理

假如有2张图片&#xff0c;我们需要确认这2张图片中是否是同一个人&#xff1b;相对于人眼视觉系统来说这太简单了&#xff0c;只需轻轻扫过2张图片就可以得出结论。但是&#xff0c;如果想让计算机来完成这个功能就困难重重了&#xff0c;再清楚分图像在计算机眼中也只是0-1组…

Gradle中的Settings和SourceSet

文章目录SettingsSourceSetSettings Settings 的核心作用就是决定我们项目的哪些工程是要被gradle处理的。 Settings.java部分源码&#xff1a; HasInternalProtocol public interface Settings extends PluginAware, ExtensionAware {/*** <p>The default name for t…

腾讯技术开放日 | 腾讯会议如何构建实时视频传输算法架构,来实现用户体验质量最优?

在实时视频通讯中&#xff0c;要达到终端用户的体验质量&#xff08;QoE&#xff09;最优&#xff0c;需要实现实时视频传输的信号质量和交互性最优&#xff0c;而时延和带宽是有限的&#xff0c;如何衡量取舍对有限资源进行分配&#xff0c;成为构建腾讯会议实时视频传输算法架…

腾讯宣布五年5000亿投入计划,发力新基建

5月26日&#xff0c;腾讯云与智慧产业事业群总裁汤道生对外宣布&#xff0c;腾讯未来五年将投入5000亿&#xff0c;用于新基建的进一步布局。 据介绍&#xff0c; 云计算、人工智能、区块链、服务器、大型数据中心、超算中心、物联网操作系统、5G网络、音视频通讯、网络安全、量…

asp.net表格的弹出页imagebutton按钮修改数据后的表格刷新

在模板页的imagebutton控件添加单击事件&#xff1a; 因为单击事件滞后与ONClienClick事件&#xff0c;所以重新提取数据源&#xff0c;单不改变表格的当前页索引。 注&#xff1a;1、imagebutton单击事件重新提取表格数据源 2、ONClienClick指向一个修改表格当前行数据的u…