Android每次打包送测时都要发送.apk文件,特别麻烦,有没有像ios端那样可以一键打包并上传到第三方平台呢?自己网上查找了一圈,最后选择用Gradle的Task方式一键打包并上传到蒲公英平台。
步骤如下:
apply from: "${rootProject.rootDir}/pgyer-upload.gradle"
引用,并在android{…}里面添加: android.applicationVariants.all { variant ->
String taskSuffix = variant.name.capitalize()
if (taskSuffix.contains("Release")) {
task("pgyerBuild${taskSuffix}") {
dependsOn ":app:assemble${taskSuffix}"
group 'build'
description 'Custom task for gradle'
doLast {
variant.outputs.all { output ->
uploadApk(output.outputFile)
}
}
}
}
}
pgyer-upload.gradle
文件,pgyer-upload.gradle
代码如下:import groovy.json.JsonSlurper
ext.uploadApk = this.&uploadApk
// 需要@人的手机号码
static def getMobileList() {
return ["12345698789"]
}
// 机器人的地址
static def weChatUrl() {
return "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=b021a495-5cce-4b0b-b479-9bc0c68511d1"
}
// 是否需要开启机器人通知
static def isOpenWeChatNotify() {
return true
}
// 打包蒲公英的描述
static def pgyerUpdateDescription() {
return "App introduce"
}
/**
* 上传 apk 到蒲公英
*/
def uploadApk(File apk) {
if (apk == null) {
throw new RuntimeException("apk file not exists!")
}
//加载资源
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;charset=UTF-8; boundary=" + boundary)
conn.setDoInput(true)
conn.setDoOutput(true)
// 添加参数:_api_key
def _api_key="替换成你自己的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(_api_key).append(end)
sb.append(twoHyphens).append(boundary).append(end)
sb.append("Content-Disposition: form-data; name=buildUpdateDescription")
sb.append(end).append(end)
sb.append(pgyerUpdateDescription()).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.write(sb.toString().getBytes("UTF-8"))
dos.flush()
println sb.toString()
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 ${apk.size()} ${resp.code} ***************"
println "*************** qrCodeUrl ${resp.data.buildQRCodeURL} build ${resp.data.buildBuildVersion} ***************"
if (resp.code != 0) {
throw new RuntimeException(resp.message)
}
if (isOpenWeChatNotify()) {
sendMsgToWeChat("android App\nbuildCode ${resp.data.buildBuildVersion}\nqrCodeUrl ${resp.data.buildQRCodeURL}")
}
}
def sendMsgToWeChat(def data) {
def conn = new URL(weChatUrl()).openConnection()
conn.setRequestMethod('POST')
conn.setRequestProperty("Connection", "Keep-Alive")
conn.setRequestProperty("Content-type", "application/json;charset=UTF-8")
conn.setConnectTimeout(30000)
conn.setReadTimeout(30000)
conn.setDoInput(true)
conn.setDoOutput(true)
def content = "{\n" +
" \"msgtype\": \"text\",\n" +
" \"text\": {\n" +
" \"content\": \"$data\"" +
" ,\"mentioned_mobile_list\":${getMobileList().toString()}" +
" }\n" +
"}"
conn.setRequestProperty("Content-Length", String.valueOf(content.length()));
def dos = new DataOutputStream(conn.getOutputStream())
dos.write(content.toString().getBytes("UTF-8"))
println content
dos.flush()
dos.close()
conn.connect()
def result = conn.getContent().text
println(result)
}
pgyer-upload.gradle
文件中的_api_key
和自己的机器人地址(如果还没有注册过蒲公英账号,需要注册一下,官网地址 https://www.pgyer.com/),下面分别对如果获取_api_key和机器人地址进行说明:pgyer-upload.gradle
文件中对应的地方。机器人地址获取与设置:
机器人是钉钉群或者企业微信群里的机器人,这里拿电脑端钉钉群举例,点击一个群右上角”群设置“,然后再设置里面点击”智能群助手“添加机器人,添加的过程中,有两个参数需要注意,一个是设置的关键字,一个是创建完机器人后会自动生成一个url。
接下来在pgyer-upload.gradle
文件中替换为刚刚生成的url,然后打开蒲公英官网,进入”内侧分发“-”设置“-“Webhook设置”
在Webhook中输入刚刚钉钉群生成的url和关键字。
4. 然后在Android Studio中,点击Sync Project with Gradle Files,Sync Project完成后,点击Gradle
找到android-Tasks-pgyerBuildRelease,右键Run或者Debug打包完成。
如果发现Android Studio中没有找到Tasks面板,需要在Settings-Experimental中取消勾选”Do not build Gradle task list during Gradle sync“
参考:
Gradle一键上传蒲公英
Android Studio中的Gradle面板没有Task任务列表