Android Apk一键打包上传至蒲公英平台的gradle脚本

一、背景

项目中每次手动打包后,生成的测试包,都需要手动打开蒲公英平台的网址,登录账号,手动上传apk。之前写过一键上传至fir平台的脚本,想着这次可以搞一下一键打包上传至蒲公英的gradle脚本,提高下工作效率(关键每次都是我们开发自己手动打包,再手动上传蒲公英,太繁琐~)

二、gradle脚本安排

1、创建gradle脚本文件

因为脚本涉及到上传功能,所以需要网络请求,而蒲公英平台已经提供好了一套相关的Api接口:蒲公英接口2.0

而蒲公英官方提供了新版旧版 上传两种方式,我自己曾先尝试了新版(快速上传)的上传方式,但是在尝试过程中,发现一直报一个错,后来由于时间的缘故,改为了旧版 的上传方式,后面有时间了再研究下新版的上传。

在这里插入图片描述

接下来的gradle脚本主要以旧版上传为主,有哪位大佬,使用了新版上传,可以在评论区贴下脚本链接,向大佬学习下~

由于使用到了网络请求,这里使用到了OKhttp(当然也可以不使用Okttp请求使用其他网络请求库),所以需要引入下Okhttp库。

首先创建一个上传脚本gradle文件 ,我这里命名为pack-release.gradle

我把pack-release.gradle放到了项目工程的gradle文件夹下:

2、在pack-release.gradle中引入okhttp库
java 复制代码
buildscript {
    repositories {
        mavenCentral()

        dependencies {
            classpath rootProject.ext.dependencies.okhttp//1.添加依赖
        }
    }
}

这里我使用的是okhttp版本是: 3.14.9

3、定义task
java 复制代码
task("uploadPgy") {
    group 'pack'
    dependsOn("app:assembleXXXRelease") 

    doLast {
        uploadApk()
    }
}

在这里定义了一个名字叫:uploadPgy的task。注意到里面还有一行group 'pack',这个意思是这个task任务会在pack文件夹下出现

dependsOn("app:assembleXXXRelease") 这里是这个task依赖于"app:assembleXXXRelease"

这个task任务。而"app:assembleXXXRelease"

中的app即为,主module的名字,如果主module名字为app那么这里写app,如果主module名字为mmm,这里也写mmm。

而后面assembleXXXRelease即为,项目打包的任务命令

4、定义uploadApk方法
java 复制代码
/**
 * 上传apk到蒲公英
 */
def uploadApk() {

    def apkFile
    rootProject.subprojects {
        if (it.name == 'app') {//此处根据gradle project的名字查找到对应module下需要上传的apk
            //查找上传的apk文件
            def apkDir = new File(it.buildDir.path + "/outputs/apk/xxx", "release")
            if (!apkDir.exists()) {
                apkDir = new File(it.buildDir.path + "/intermediates/apk/iguopin", "release")
            }
            if (!apkDir.exists()) {
                throw new RuntimeException("apk output path not exists!")
            }


            def modified = 0
            def lastModifiedDir = apkDir
            //寻找当前路径下最新apk包所在路径
            apkDir.listFiles().each { dir ->
                def last = dir.lastModified()
                if (dir.isDirectory() && last > modified) {
                    modified = last
                    lastModifiedDir = dir
                }
            }

            //println("lastModifiedDir=====$lastModifiedDir")

            //寻找当前路径下后缀为apk、名称包含release字样的文件
            def apkfiles = lastModifiedDir.listFiles(new FilenameFilter() {
                @Override
                boolean accept(File dir, String name) {
                    //println("name=====$name")
                    return (name.endsWith('.apk') && name.contains('XX_64_'))
                }
            })
            if (apkfiles == null || apkfiles.length == 0) {
                println("出错啦!没有找到apk文件")
                return
            }
            //由于我们的项目对每次打包的包名根据时间戳进行命名, 默认第一个为最新包,所以取first
            apkFile = apkfiles.first()
        }
    }

    println "********************************************* start upload file *********************************************"
    println ""
    println ""
    println "正在上传的apk的本地路径:==================》   $apkFile"
    println ""
    println ""
    println "正在上传,请稍等。。。。。。。。。。。。。"
    println("")
    println("")

    def response = uploadToPgyer(apkFile)
    def uploadBean = new JsonSlurper().parseText(response)
    def buildVersion = uploadBean['data']['buildVersion']//版本名称
    def buildVersionNo = uploadBean['data']['buildVersionNo']//版本号
    def buildBuildVersion = uploadBean['data']['buildBuildVersion']//蒲公英平台apk的build版本
    def buildCreated = uploadBean['data']['buildCreated']//apk上传时间


    println("")
    println "********************************************* upload finish *********************************************"
    println ""
    println ""
    println "上传时间:==================》   $buildCreated"
    println "版本名称:==================》   $buildVersion"
    println "版本号:==================》   $buildVersionNo"
    println "蒲公英平台apk的build版本:==================》   $buildBuildVersion"

    if (uploadBean.code != 0) {
        throw new RuntimeException(uploadBean.message)
    }

    //浏览器中打开短连接
    def url = "https://www.pgyer.com/" + uploadBean.data.buildKey
    println "最新下载地址:$url"
    exec {
        commandLine 'open', url
    }
}
5、定义uploadToPgyer方法
java 复制代码
// 自定义上传方法
def uploadToPgyer(File apkFile) {

    // 蒲公英上传配置
    def pgyerUploadUrl = "https://www.pgyer.com/apiv2/app/upload"
    def pgyerApiKey = "蒲公英平台的apiKey"   //蒲公英平台需要实名认证才能拿到apiKey
    def uploadUrl = pgyerUploadUrl + "?_api_key=" + pgyerApiKey

    OkHttpClient client = new OkHttpClient.Builder()
            .connectTimeout(15, TimeUnit.SECONDS)
            .readTimeout(60, TimeUnit.SECONDS)
            .writeTimeout(60, TimeUnit.SECONDS)
            .build()


    RequestBody requestBody = new MultipartBody.Builder()
            .setType(MultipartBody.FORM)
            .addFormDataPart("file", apkFile.name, RequestBody.create(MediaType.parse("application/octet-stream"), apkFile))
            .addFormDataPart("_api_key", pgyerApiKey)
            .build()

    Request request = new Request.Builder()
            .url(uploadUrl)
            .post(requestBody)
            .build()

    Response response = client.newCall(request).execute()
    return response.body().string()
}

脚本中:

java 复制代码
		//浏览器中打开短连接
    def url = "https://www.pgyer.com/" + uploadBean.data.buildKey
    println "最新下载地址:$url"
    exec {
        commandLine 'open', url
    }

在上传成功后,还会自动用浏览器打开最新的apk下载地址。

三、在项目工程中引入脚本

脚本写好了,需要在项目中引入一下:在项目工程的build.gradle中引入:

java 复制代码
apply from:"$rootDir/gradle/pack-release.gradle"

四、结语

好了,以上便是一键打包apk并上传至蒲公英平台的gradle脚本了。有什么问题,大家可以在评论区留言,共同学习~。我是Shy,一个永不停止学习的程序员

相关推荐
yaosheng_VALVE27 分钟前
稀硫酸介质中 V 型球阀的材质选择与选型要点-耀圣
运维·spring cloud·自动化·intellij-idea·材质·1024程序员节
网安_秋刀鱼3 小时前
java组件安全
web安全·网络安全·1024程序员节
earthzhang20213 小时前
《深入浅出HTTPS》读书笔记(7):安全的密码学Hash算法
网络·网络协议·http·https·1024程序员节
程序员小海绵【vincewm】6 小时前
【设计模式】结合Tomcat源码,分析外观模式/门面模式的特性和应用场景
设计模式·tomcat·源码·外观模式·1024程序员节·门面模式
一个通信老学姐7 小时前
专业140+总分410+东北大学841考研经验东大电子信息与通信工程通信专业基础真题,大纲,参考书
考研·信息与通信·信号处理·1024程序员节
惜.己7 小时前
Jmeter中的监听器(一)
测试工具·jmeter·1024程序员节
纪伊路上盛名在8 小时前
AI制作ppt
1024程序员节
爱搞技术的猫猫9 小时前
实现API接口的自动化
大数据·运维·数据库·性能优化·自动化·产品经理·1024程序员节
FFDUST1 天前
C++ 优先算法 —— 四数之和(双指针)
c语言·开发语言·c++·算法·leetcode·1024程序员节
惜.己1 天前
Jmeter中的配置原件(三)
功能测试·测试工具·jmeter·1024程序员节