架构日记(六)新建Gradle Task实现打包后上传到蒲公英

前面的文章中提到了脚本自动执行打包和安装,其实将脚本重组也是可以做到一键发布的,只是每一篇文章都有自己需要解决的问题,所以没有完全串起来实现一键打包发布。

首先下面贴出蒲公英的官网地址

https://www.pgyer.com

蒲公英开放api地址

https://www.pgyer.com/doc/view/api

我们需要用到的蒲公英上传的post请求的地址

https://www.pgyer.com/apiv2/app/upload

剩下的细节可以自己去官网查看,接下来看代码吧

架构日记(六)新建Gradle Task实现打包后上传到蒲公英_第1张图片

粘贴一些常用命令方便查看,服务到位吧~~~

//构建
gradlew app:clean    //移除所有的编译输出文件,比如apk

gradlew app:build   //构建 app module ,构建任务,相当于同时执行了check任务和assemble任务

//检测
gradlew app:check   //执行lint检测编译。

//打包
gradlew app:assemble //可以编译出release包和debug包,可以使用gradlew assembleRelease或者gradlew assembleDebug来单独编译一种包

gradlew app:assembleRelease  //app module 打 release 包

gradlew app:assembleDebug  //app module 打 debug 包

//安装,卸载

gradlew app:installDebug  //安装 app 的 debug 包到手机上

gradlew app:uninstallDebug  //卸载手机上 app 的 debug 包

gradlew app:uninstallRelease  //卸载手机上 app 的 release 包

gradlew app:uninstallAll  //卸载手机上所有 app 的包

 多渠道的包加上渠道名也可以执行命令,尤其是安装,下载,和打包,以豌豆荚为例(Mac)

./gradlew app:installWandoujiaDebug  or  Release

./gradlew app:uninstallWandoujiaDebug  or Release

./gradlew app:assembleWandoujiaDebug  or Release

新建文件 uploadApk.gradle

存放在setting.gradle同级目录下

import groovy.json.JsonSlurper

//自动上传到蒲公英
def uploadApk(){
    //查找等待上传的apk文件
    //正常打包可以在debug和relase下找到,但是多渠道打包,需要选择正确的渠道路径
    def apkDir = new File("build/outputs/apk/wandoujia/debug")

    if(!apkDir.exists()){
        throw new RuntimeException("apk outputs 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"

    //蒲公英API上传接口   https://www.pgyer.com/doc/view/api#uploadApp  官方文档地址
    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)

    /**
     * 蒲公英为测试账号
     * xxxxxxxxx
     */

    //添加参数:_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("写自己的").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 设置密码  cfss1234  fgbp1234
    sb.append(twoHyphens).append(boundary).append(end)
    sb.append("Content-Disposition: form-data; name=buildPassword")
    sb.append(end).append(end)
    sb.append("自己的提取密码").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()
    }
}

 双击uploadApk任务,由于依赖了assembleDebug任务,所以会先执行编译打包的任务。wandoujia的路径,见上一篇多渠道打包。具体的地址根据自己的工程结构来构建

Android Gradle的总结,强烈推荐这篇文章

https://blog.csdn.net/zhaoyanjun6/article/details/77678577

最终效果

架构日记(六)新建Gradle Task实现打包后上传到蒲公英_第2张图片

网页的地址再AS的Run输出中打印了

 

你可能感兴趣的:(Android从零开始架构,模块化,android知识)