用Gradle上传apk到蒲公英
2019-08-15 本文已影响106人
在寻找雪见的景天
为了方便打包给测试部的同学测试,我们会把测试包上传到蒲公英平台,蒲公英平台又提供了上传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文档传不同的值来设置上传参数(密码安装等)