• 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库
    buildscript {
        repositories {
            mavenCentral()
    
            dependencies {
                classpath rootProject.ext.dependencies.okhttp//1.添加依赖
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    这里我使用的是okhttp版本是: 3.14.9
    在这里插入图片描述在这里插入图片描述

    3、定义task
    task("uploadPgy") {
        group 'pack'
        dependsOn("app:assembleXXXRelease") 
    
        doLast {
            uploadApk()
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里定义了一个名字叫: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方法
    /**
     * 上传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
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    5、定义uploadToPgyer方法
    // 自定义上传方法
    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()
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    脚本中:

    		//浏览器中打开短连接
        def url = "https://www.pgyer.com/" + uploadBean.data.buildKey
        println "最新下载地址:$url"
        exec {
            commandLine 'open', url
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

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

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

    apply from:"$rootDir/gradle/pack-release.gradle"
    
    • 1

    在这里插入图片描述

    四、结语

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

  • 相关阅读:
    C++宏的用法
    面试算法33:变位词组
    golang 函数参数传递--指针,引用和值(二)
    【OpenWrt】N1刷机过程及旁路由设置(通用)
    怎么压缩word文档的大小?
    结构型设计模式——桥接模式
    Linux系统高并发socket最大连接数所受的各种限制解决
    基于有偏距离权值(Weighted cubic O-MOMS with warping)三次O-MOMS插值理论的图像超分辨重构研究-附Matlab程序
    【论文笔记】—低照度图像增强—Semi-Supervised—DRBN—2020-CVPR
    Qt中设置鼠标透明度的应用及示例
  • 原文地址:https://blog.csdn.net/u010257931/article/details/134011025