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.JsonSlurperext.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-datadef 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_keydef _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 lenwhile ((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().textdef resp = new JsonSlurper().parseText(text)println textprintln "*************** 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 contentdos.flush()dos.close()conn.connect()def result = conn.getContent().textprintln(result)
}
  1. 替换上面pgyer-upload.gradle文件中的_api_key和自己的机器人地址(如果还没有注册过蒲公英账号,需要注册一下,官网地址 https://www.pgyer.com/),下面分别对如果获取_api_key和机器人地址进行说明:
    _api_key:

    进入蒲公英官网,找到API 2.0-上传App-点击获取_api_key,点击复制即可,并将这个_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任务列表

Android使用Gradle一键打包上传到蒲公英相关推荐

  1. 自定义Gradle插件实现打包上传到蒲公英

    上一篇文章提到了关于如何写Gradle自定义插件Plugin,本篇文件介绍下如何写gradle插件实现打包上传到pgy. 要实现打包上传到蒲公英必须要弄清楚以下问题: 1.什么时候打包完成?监听到打包 ...

  2. 初窥 fastlane 一键打包上传蒲公英平台和App Store

    很久之前就听说自动化打包如何方便,只是自己一直没有去尝试过,最近因为项目需求,自己也尝试了一把.关于fastlane网上资料非常多,功能如何强大,自动化测试.证书管理.截屏等.但是我这里只使用自动化打 ...

  3. Android——Gradle自动打包上传蒲公英并进行钉钉群提醒

    开发测试阶段频繁打包未免太过枯燥,自动打包发布解放双手.上一节我们分析了fastlane打包发布的过程,嗯~总体来说有点繁琐,而且Android使用fast lane自动打包网上资料比较少,出错之后解 ...

  4. C++-Nuget包一键打包-上传工具开发分享

    前言 网上找了写打包工具,感觉都不太好用,于是决定自己开发一个Nuget包工具. 使用说明 为了实现方便起见,使用软件前有部分约定需要遵守,否则无法正确使用该工具: 应配置好环境变量,使得能在命令行中 ...

  5. 后端代码一键打包上传服务器并重启服务

    前提条件:springboot项目.IDEA.服务使用docker启动 1.下载插件 在idea的设置-插件中搜索这个插件并安装: 2.配置信息 在右上角的工程信息里点编辑配置 点左上角的加号,新增一 ...

  6. Xcode自动编译、打包、上传到蒲公英应用分发平台

    xcode_autobuild 项目地址:https://github.com/SimonCY/xcode_autobuild 因为公司最近人员变动,只有我一个人懂iOS开发,有时不在公司又遇到需要给 ...

  7. android一键发布,Android apk项目如何一键打包并上传到蒲公英

    Android apk项目如何一键打包并上传到蒲公英 发布时间:2020-07-18 15:13:44 来源:亿速云 阅读:107 作者:小猪 这篇文章主要为大家展示了Android apk项目如何一 ...

  8. Android Studio如何配置CURL指令一键打包apk上传至蒲公英

    Android Studio如何配置CURL指令一键打包apk上传至蒲公英 第一步:在所需要打包的模块build.gradle文件中加入如下代码: android{buildTypes {//配置ap ...

  9. Android Jenkins + gradle 实现自动化打包流程并上传至蒲公英平台全过程

    最近在windows上尝试了jenkins持续集成环境搭建,把自己的写的app进行了自动化打包上传的一套流程,下面把我的经验分享给大家. 本文大纲: 说明:本文以windows为例 环境准备 jenk ...

最新文章

  1. CentOS iso镜像文件做本地源
  2. Java代码中常见技术债务处理之Exception
  3. matlab中显示ycbcr图像,rgb到matlab中的ycbcr转换
  4. 真得好好细讲文件上传,否则漏洞百出
  5. jzoj4224-食物【多重背包】
  6. 多态(继承父类的非静态重写方法)
  7. cuda8 cuda9 cudnn 安装与卸载
  8. 旅游网站进行邮件订阅的七大步骤讲解
  9. 多文件上传组件FineUploader使用心得
  10. [译]JS闭包:For循环中的setTimeout
  11. 远程桌面与本计算机共享文件,win7系统开启远程桌面共享文件的方法
  12. RockWare RockWorks 17.0.0 1CD地表数据可视化软件
  13. 解决QFontDatabase: Cannot find font directory XXX/lib/fonts
  14. 小米路由器wifi显示无法连接服务器,小米路由器登录地址打不开怎么办?
  15. vlan端口隔离配置
  16. 五款好用的开源CRM系统推荐
  17. 纳税信用等级怎么划分 激励惩戒措施有哪些
  18. kafka连接mysql数据库,Kafka-connect-jdbc-source连接mysql数据库实战
  19. 中断机制及ZCU102 DMA中断实例
  20. 224、三维形体投影面积

热门文章

  1. 最少交换次数python_史上最简单!冒泡、选择排序的Python实现及算法优化详解
  2. python3 比较列表_Python3列表(list)比较操作教程
  3. 覆盖诊所全流程管理,适合中大型诊所门诊的门诊管理系统
  4. 阿里云IoT赵磊:ICA联盟,构建未来物联网生态圈 | 金山软件第三季度营收13.03亿元
  5. 超级计算机的两个主要特点,现代操作系统的两个基本特征是资源共享和
  6. 计算机光盘插哪里,光盘插到电脑后在哪找出光盘上的内容?
  7. java client是什么_“java-server”和“java-client”之间的真正区别?
  8. 光伏并网pscad_不对称故障下两级式光伏逆变器的LVRT策略
  9. Dnf史诗装备的爆率的程序模拟
  10. python用bs4爬取豆瓣电影排行榜 Top 250的电影信息和电影图片,分别保存到csv文件和文件夹中