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,一个永不停止学习的程序员

相关推荐
fangzhanpeng1683 天前
快速掌握C#语言基础知识点(1.基础数据类型)
开发语言·c#·1024程序员节
无己心5 天前
面向多平台 AI 搜索引擎的适配层架构设计
前端·人工智能·搜索引擎·ai·1024程序员节
u01030552711 天前
AI驱动的安卓UI自动生成功能实现
人工智能·1024程序员节
u01030552712 天前
长株潭智能体赋能腾讯元器链接共享
1024程序员节
云贝贝贝13 天前
OceanBase认证体系介绍与备考指南
运维·服务器·oceanbase·1024程序员节
u01030552713 天前
Java图像处理实战指南
人工智能·1024程序员节
u01030552714 天前
Java AWT鼠标事件全解析
人工智能·1024程序员节
u01030552716 天前
Java实用类应用精讲
人工智能·1024程序员节
u01030552716 天前
Java I/O核心操作实战
人工智能·1024程序员节
u01030552717 天前
ArrayList操作详解与实战应用
人工智能·1024程序员节