用Gradle上传apk到蒲公英

为了方便打包给测试部的同学测试,我们会把测试包上传到蒲公英平台,蒲公英平台又提供了上传apk的api,所以,可以直接在Android Studio里面上传,写个Gradle Task运行一下就行。

需要传包的时候,点一下命令就好:


上传完,可以看到返回信息,和一个apk安装地址。

先看看蒲公英上传api
POST http://www.pgyer.com/apiv2/app/upload

POST参数

参数 类型 说明
_api_key String (必填) API Key [点击获取_api_key](javascript:void(0))
file File (必填) 需要上传的ipa或者apk文件
buildInstallType Integer (选填)应用安装方式,值为(1,2,3,4)。1:公开,2:密码安装,3:邀请安装,4:回答问题安装。默认为1公开
buildPassword String (选填) 设置App安装密码,如果不想设置密码,请传空字符串,或不传。
buildUpdateDescription String (选填) 版本更新描述,请传空字符串,或不传。
buildName String (选填) 应用名称
buildInstallQuestoin String (选填)如果安装方式为回答问题安装,填写安装问题。
buildInstallAnswer String (选填)如果安装方式为回答问题安装,填写安装问题的答案。
buildInstallDate Interger (选填)是否设置安装有效期,值为:1 设置有效时间, 2 长期有效,如果不填写不修改上一次的设置
buildInstallStartDate String (选填)安装有效期开始时间,字符串型,如:2018-01-01
buildInstallEndDate String (选填)安装有效期结束时间,字符串型,如:2018-12-31
buildChannelShortcut String (选填)所需更新的指定渠道的下载短链接,只可指定一个渠道,字符串型,如:abcd

接下来,新建一个Gradle文件

import groovy.json.JsonSlurper

/**
 * 上传apk到蒲公英
 */
def uploadApk() {
    //查找上传的apk文件
    def apkDir = new File("build/outputs/apk/debug")
    if (!apkDir.exists()) {
        throw new RuntimeException("apk output path not exists!")
    }

    def apk = null
    for (int i = apkDir.listFiles().length - 1; i >= 0; i--) {
        File file = apkDir.listFiles()[i]
        if (file.name.endsWith(".apk")) {
            apk = file
            break
        }
    }
    if (apk == null) {
        throw new RuntimeException("apk file not exists!")
    }

    println "*************** start upload file ***************"

    def twoHyphens = "--"
    def boundary = "*********"
    def end = "\r\n"

    //模拟表单上传 multipart/form-data
    def conn = new URL("https://www.pgyer.com/apiv2/app/upload").openConnection()
    conn.setRequestMethod('POST')
    conn.setRequestProperty("Connection", "Keep-Alive")
    conn.setRequestProperty("Charset", "UTF-8")
    conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary)
    conn.setDoInput(true)
    conn.setDoOutput(true)

    //添加参数:_api_key
    def sb = new StringBuilder()
    sb.append(twoHyphens).append(boundary).append(end)
    sb.append("Content-Disposition: form-data; name=_api_key")
    sb.append(end).append(end)
    sb.append("填自己的apikey").append(end)

    //添加参数:buildUpdateDescription 更新日志,取值git
    sb.append(twoHyphens).append(boundary).append(end)
    sb.append("Content-Disposition: form-data; name=buildUpdateDescription")
    sb.append(end).append(end)
    sb.append(getGitVersionInfo()).append(end)

    //添加参数:buildInstallType 设置密码安装
    sb.append(twoHyphens).append(boundary).append(end)
    sb.append("Content-Disposition: form-data; name=buildInstallType")
    sb.append(end).append(end)
    sb.append(2).append(end)

    //添加参数:buildPassword 设置密码
    sb.append(twoHyphens).append(boundary).append(end)
    sb.append("Content-Disposition: form-data; name=buildPassword")
    sb.append(end).append(end)
    sb.append("1024").append(end)

    //添加参数file: 需要上传的apk文件
    sb.append(twoHyphens).append(boundary).append(end)
    sb.append("Content-Disposition: form-data; name=file;filename=").append(apk.getName())
    sb.append(end).append(end)

    def dos = new DataOutputStream(conn.getOutputStream())
    dos.writeBytes(sb.toString())
    dos.flush()
    sb.delete(0, sb.length())

    def fis = new FileInputStream(apk)
    byte[] bf = new byte[8192]
    int len
    while ((len = fis.read(bf)) != -1) {
        dos.write(bf, 0, len)
    }
    sb.append(end)
    sb.append(twoHyphens).append(boundary).append(end)
    dos.writeBytes(sb.toString())

    dos.flush()
    fis.close()
    dos.close()
    conn.connect()

    def text = conn.getContent().text
    def resp = new JsonSlurper().parseText(text)

    println text
    println "*************** upload finish ***************"

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

    //浏览器中打开短连接
    def url = "https://www.pgyer.com/" + resp.data.buildShortcutUrl
    print("上传成功,应用链接:" + url)

}


def getGitVersionInfo() {
    return 'git log -n 1'.execute().text.trim()
}

//打包测试环境apk 上传蒲公英 发送邮件功能使用蒲公英自带的邮件功能
task uploadApk(group: "upload") {
    dependsOn("assembleDebug")

    doLast {
        uploadApk()
    }
}

然后,把这个文件丢到根目录,再在app的build里面引用一下就行。

apply plugin: 'com.android.application'

apply from: "../uploadApk.gradle"

注意地方:
1、上传目录需要根据自己的情况来修改
2、得填上自己的key
3、可以按需根据api文档传不同的值来设置上传参数(密码安装等)

你可能感兴趣的:(用Gradle上传apk到蒲公英)