Android使用Gradle一键打包上传到蒲公英

Android每次打包送测时都要发送.apk文件,特别麻烦,有没有像ios端那样可以一键打包并上传到第三方平台呢?自己网上查找了一圈,最后选择用Gradle的Task方式一键打包并上传到蒲公英平台。
步骤如下:

  1. 在项目中的android app目录下的build.gradle文件中添加的最外层添加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)
                    }
                }
            }
        }
    }
  1. 在android根目录下创建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)
}

  1. 替换上面pgyer-upload.gradle文件中的_api_key和自己的机器人地址(如果还没有注册过蒲公英账号,需要注册一下,官网地址 https://www.pgyer.com/),下面分别对如果获取_api_key和机器人地址进行说明:
    _api_key:
    Android使用Gradle一键打包上传到蒲公英_第1张图片
    进入蒲公英官网,找到API 2.0-上传App-点击获取_api_key,点击复制即可,并将这个_api_key添加到pgyer-upload.gradle文件中对应的地方。

机器人地址获取与设置:
机器人是钉钉群或者企业微信群里的机器人,这里拿电脑端钉钉群举例,点击一个群右上角”群设置“,然后再设置里面点击”智能群助手“添加机器人,添加的过程中,有两个参数需要注意,一个是设置的关键字,一个是创建完机器人后会自动生成一个url。
接下来在pgyer-upload.gradle文件中替换为刚刚生成的url,然后打开蒲公英官网,进入”内侧分发“-”设置“-“Webhook设置”
Android使用Gradle一键打包上传到蒲公英_第2张图片
在Webhook中输入刚刚钉钉群生成的url和关键字。
4. 然后在Android Studio中,点击Sync Project with Gradle Files,Sync Project完成后,点击Gradle
Android使用Gradle一键打包上传到蒲公英_第3张图片
找到android-Tasks-pgyerBuildRelease,右键Run或者Debug打包完成。
如果发现Android Studio中没有找到Tasks面板,需要在Settings-Experimental中取消勾选”Do not build Gradle task list during Gradle sync“
Android使用Gradle一键打包上传到蒲公英_第4张图片
参考:
Gradle一键上传蒲公英
Android Studio中的Gradle面板没有Task任务列表

你可能感兴趣的:(Android,android,gradle,android,studio)