Android Apk一键打包上传至蒲公英平台的gradle脚本

一、背景

项目中每次手动打包后,生成的测试包,都需要手动打开蒲公英平台的网址,登录账号,手动上传apk。之前写过一键上传至fir平台的脚本,想着这次可以搞一下一键打包上传至蒲公英的gradle脚本,提高下工作效率(关键每次都是我们开发自己手动打包,再手动上传蒲公英,太繁琐~)

在这里插入图片描述

二、gradle脚本安排

1、创建gradle脚本文件

因为脚本涉及到上传功能,所以需要网络请求,而蒲公英平台已经提供好了一套相关的Api接口:蒲公英接口2.0

而蒲公英官方提供了新版旧版上传两种方式,我自己曾先尝试了新版(快速上传)的上传方式,但是在尝试过程中,发现一直报一个错,后来由于时间的缘故,改为了旧版的上传方式,后面有时间了再研究下新版的上传。
在这里插入图片描述
新版上传
旧版上传接下来的gradle脚本主要以旧版上传为主,有哪位大佬,使用了新版上传,可以在评论区贴下脚本链接,向大佬学习下~

由于使用到了网络请求,这里使用到了OKhttp(当然也可以不使用Okttp请求使用其他网络请求库),所以需要引入下Okhttp库。
首先创建一个上传脚本gradle文件,我这里命名为pack-release.gradle
我把pack-release.gradle放到了项目工程的gradle文件夹下:

在这里插入图片描述

2、在pack-release.gradle中引入okhttp库
buildscript {repositories {mavenCentral()dependencies {classpath rootProject.ext.dependencies.okhttp//1.添加依赖}}
}

这里我使用的是okhttp版本是: 3.14.9
在这里插入图片描述在这里插入图片描述

3、定义task
task("uploadPgy") {group 'pack'dependsOn("app:assembleXXXRelease") doLast {uploadApk()}
}

在这里定义了一个名字叫:uploadPgy的task。注意到里面还有一行group ‘pack’,这个意思是这个task任务会在pack文件夹下出现

在这里插入图片描述

dependsOn(“app:assembleXXXRelease”) 这里是这个task依赖于"app:assembleXXXRelease"
这个task任务。而"app:assembleXXXRelease"
中的app即为,主module的名字,如果主module名字为app那么这里写app,如果主module名字为mmm,这里也写mmm。
而后面assembleXXXRelease即为,项目打包的任务命令

4、定义uploadApk方法
/*** 上传apk到蒲公英*/
def uploadApk() {def apkFilerootProject.subprojects {if (it.name == 'app') {//此处根据gradle project的名字查找到对应module下需要上传的apk//查找上传的apk文件def apkDir = new File(it.buildDir.path + "/outputs/apk/xxx", "release")if (!apkDir.exists()) {apkDir = new File(it.buildDir.path + "/intermediates/apk/iguopin", "release")}if (!apkDir.exists()) {throw new RuntimeException("apk output path not exists!")}def modified = 0def lastModifiedDir = apkDir//寻找当前路径下最新apk包所在路径apkDir.listFiles().each { dir ->def last = dir.lastModified()if (dir.isDirectory() && last > modified) {modified = lastlastModifiedDir = dir}}//println("lastModifiedDir=====$lastModifiedDir")//寻找当前路径下后缀为apk、名称包含release字样的文件def apkfiles = lastModifiedDir.listFiles(new FilenameFilter() {@Overrideboolean accept(File dir, String name) {//println("name=====$name")return (name.endsWith('.apk') && name.contains('XX_64_'))}})if (apkfiles == null || apkfiles.length == 0) {println("出错啦!没有找到apk文件")return}//由于我们的项目对每次打包的包名根据时间戳进行命名, 默认第一个为最新包,所以取firstapkFile = apkfiles.first()}}println "********************************************* start upload file *********************************************"println ""println ""println "正在上传的apk的本地路径:==================》   $apkFile"println ""println ""println "正在上传,请稍等。。。。。。。。。。。。。"println("")println("")def response = uploadToPgyer(apkFile)def uploadBean = new JsonSlurper().parseText(response)def buildVersion = uploadBean['data']['buildVersion']//版本名称def buildVersionNo = uploadBean['data']['buildVersionNo']//版本号def buildBuildVersion = uploadBean['data']['buildBuildVersion']//蒲公英平台apk的build版本def buildCreated = uploadBean['data']['buildCreated']//apk上传时间println("")println "********************************************* upload finish *********************************************"println ""println ""println "上传时间:==================》   $buildCreated"println "版本名称:==================》   $buildVersion"println "版本号:==================》   $buildVersionNo"println "蒲公英平台apk的build版本:==================》   $buildBuildVersion"if (uploadBean.code != 0) {throw new RuntimeException(uploadBean.message)}//浏览器中打开短连接def url = "https://www.pgyer.com/" + uploadBean.data.buildKeyprintln "最新下载地址:$url"exec {commandLine 'open', url}
}
5、定义uploadToPgyer方法
// 自定义上传方法
def uploadToPgyer(File apkFile) {// 蒲公英上传配置def pgyerUploadUrl = "https://www.pgyer.com/apiv2/app/upload"def pgyerApiKey = "蒲公英平台的apiKey"   //蒲公英平台需要实名认证才能拿到apiKeydef uploadUrl = pgyerUploadUrl + "?_api_key=" + pgyerApiKeyOkHttpClient client = new OkHttpClient.Builder().connectTimeout(15, TimeUnit.SECONDS).readTimeout(60, TimeUnit.SECONDS).writeTimeout(60, TimeUnit.SECONDS).build()RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("file", apkFile.name, RequestBody.create(MediaType.parse("application/octet-stream"), apkFile)).addFormDataPart("_api_key", pgyerApiKey).build()Request request = new Request.Builder().url(uploadUrl).post(requestBody).build()Response response = client.newCall(request).execute()return response.body().string()
}

脚本中:

		//浏览器中打开短连接def url = "https://www.pgyer.com/" + uploadBean.data.buildKeyprintln "最新下载地址:$url"exec {commandLine 'open', url}

在上传成功后,还会自动用浏览器打开最新的apk下载地址。

三、在项目工程中引入脚本

脚本写好了,需要在项目中引入一下:在项目工程的build.gradle中引入:

apply from:"$rootDir/gradle/pack-release.gradle"

在这里插入图片描述

四、结语

好了,以上便是一键打包apk并上传至蒲公英平台的gradle脚本了。有什么问题,大家可以在评论区留言,共同学习~。我是Shy,一个永不停止学习的程序员

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/169958.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UE4 中可全局获取的变量(例如游戏实例、玩家控制器等) 详解

目录 0 引言1 全局对象(全局变量)1.1 游戏实例 GameInstance1.1.1 介绍1.1.2 使用 GameInstance 1.2 玩家控制器 PlayerController1.3 游戏世界类 UWorld 🙋‍♂️ 作者:海码007📜 专栏:UE虚幻引擎专栏&…

[数据分析与可视化] 基于Python绘制简单动图

动画是一种高效的可视化工具,能够提升用户的吸引力和视觉体验,有助于以富有意义的方式呈现数据可视化。本文的主要介绍在Python中两种简单制作动图的方法。其中一种方法是使用matplotlib的Animations模块绘制动图,另一种方法是基于Pillow生成…

手搭手Ajax经典基础案例省市联动

环境介绍 技术栈 springbootmybatis-plusmysql 软件 版本 mysql 8 IDEA IntelliJ IDEA 2022.2.1 JDK 1.8 Spring Boot 2.7.13 mybatis-plus 3.5.3.2 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http:/…

在pycharm中创建python模板文件

File——>Setting——>File and Code Templates——>Python Scripts 在文本框中输入模板内容

javaEE -7(网络原理初识 --- 7000字)

一&#xff1a;网络初识 计算机的独立模式是指多台计算机在网络中相互独立运行&#xff0c;彼此之间不共享资源或信息。在早期&#xff0c;计算机主要采用独立模式&#xff0c;每台计算机都拥有自己的操作系统、应用程序和数据&#xff0c;它们之间没有直接的连接或通信。 在…

【大数据】Hadoop

文章目录 概述Hadoop组成HDFSMapReduce写MapReduce程序&#xff08;Hadoop streaming&#xff09; YARNHadoop 启动 工作方式Hadoop的主从工作方式Hadoop的守护进程 运行模式本地运行模式伪分布式运行模式完全分布式运行模式 Hadoop高可用的解决方案ZooKeeper quorumZKFC 环境搭…

Elasticsearch聚合----aggregations的简单使用

文章目录 Getting started1、搜索 address 中包含 mill 的所有人的年龄分布以及平均年龄&#xff0c;但不显示这些人的详情2、size0不展示命中记录&#xff0c;只展示聚合结果3、按照年龄聚合&#xff0c;并且请求这些年龄段的这些人的平均薪资4、查出所有年龄分布&#xff0c;…

hadoop伪分布式安装部署

首先jdk安装完毕 jdk安装文档参考&#xff1a; Linux 环境下安装JDK1.8并配置环境变量_linux安装jdk1.8并配置环境变量_Xi-Yuan的博客-CSDN博客 准备好hadoop的安装包 我的下载地址如下&#xff1a; We Transfer Gratuit. Envoi scuris de gros fichiers. 将hadoop包上传到随…

C++前缀和算法的应用:装包裹的最小浪费空间 原理源码测试用例

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 题目 给你 n 个包裹&#xff0c;你需要把它们装在箱子里&#xff0c;每个箱子装一个包裹。总共有 m 个供应商提供 不同尺寸 的箱子&#xff08;每个规格都有无数个箱…

golang小游戏:飞翔的小鸟

游戏开发总体思路 首先要选取一个合适的图形化界面进行开发。该项目选取的是 ebiten 一个用于创建2D游戏和图形应用程序的游戏引擎&#xff0c;提供了一些简单的GUI功能。 其次明确游戏设计思路。飞翔的小鸟共分为三个场景。 第一个场景就是游戏开始前的准备阶段&#xff0c…

【Javascript】不满意网上的Token无感知刷新方案,自己琢磨了个感觉还不错~

​前言 大家设想一下&#xff0c;如果有一个超级大的表单页面&#xff0c;用户好不容易填完了&#xff0c;然后点击提交&#xff0c;这个时候请求接口居然返回401&#xff0c;然后跳转到登录页。。。那用户心里肯定是一万个草泥马~~~ 所以项目里实现token无感知刷新是很有必要…

vscode Coder Runner 运行C++

1. 设置Code Runner 2. 防止输入读不到&#xff0c;把在终端运行勾上。 3. 设置minw/bin的环境变量 安装mingw教程&#xff1a;https://blog.csdn.net/fancy_male/article/details/133992000 4. 见图

ubuntu18.04双系统安装(2023最新最详细)以及解决重启后发现进不了Ubuntu问题

目录 一.简介 二.安装教程 1.首先确定了电脑的引导格式是UEFIGPT还是BIOSMBR 2. 使用Windows磁盘管理划分足够的磁盘空间 3. 开始安装 三.重启后发现自动进入WIN10系统了&#xff0c;进不了Ubuntu&#xff1f; 一.简介 Linux是一种自由和开放源代码的操作系统内核&#x…

Deno 的配置文件、框架,标准库

目录 1、配置文件 imports 和scopes tasks lint fmt lock nodeModulesDir npmRegistry compilerOptions 一个全的示例 2、Web框架 2.1 Deno 原生框架 Fresh Aleph Ultra Lume Oak 3、标准库 3.1 版本和稳定性 1、配置文件 Deno支持一个配置文件&#xff0c…

MR混合现实情景实训教学系统在旅游管理专业中的应用

在旅游管理专业中&#xff0c;MR混合现实情景实训教学系统的主要应用包括但不限于以下几个方面&#xff1a; 1. 实地考察的替代&#xff1a;对于一些无法实地考察的景点或设施&#xff0c;学生可以通过MR系统进行虚拟参观&#xff0c;从而了解其实际情况。这不仅可以减少时间和…

【C++】STL容器——【深浅拷贝】与【写时拷贝】对比详解(拷贝构造)(10)

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 目录 一.深浅拷贝浅拷贝&#xff1a;深拷贝&#xff1a; 二.写时拷贝 一.深浅拷贝 (默认拷贝构造运用 引用 防止死递归的后遗症&#…

读高性能MySQL(第4版)笔记19_云端和合规性

1. 如何构建数据库环境 1.1. 托管MySQL 1.2. VM上构建 1.3. 天下没有免费的午餐&#xff0c;每一个选择都伴随着一系列的权衡 2. 托管MySQL 2.1. 服务商提供了一个可访问的数据库设置程序&#xff0c;而不需要用户深入了解MySQL的具体细节 2.2. 使用托管MySQL将缺乏很多的…

小程序设计基本微信小程序的校园生活助手系统

项目介绍 通篇文章的撰写基础是实际的应用需要&#xff0c;然后在架构系统之前全面复习大学所修习的相关知识以及网络提供的技术应用教程&#xff0c;以校园生活助手系统的实际应用需要出发&#xff0c;架构系统来改善现校园生活助手系统工作流程繁琐等问题。不仅如此以操作者…

Python手搓C4.5决策树+Azure Adult数据集分析

前言 课上的实验 由于不想被抄袭&#xff0c;所以暂时不放完整代码 Adult数据集可以在Azure官网上找到 Azure 开放数据集中的数据集 - Azure Open Datasets | Microsoft Learn 数据集预处理 删除难以处理的权重属性fnlwgt与意义重复属性educationNum去除重复行与空行删除…

百度文心一言4.0——使用及API测试

登录百度智能云&#xff1a;百度智能云 文心一言4.0使用 开通付费&#xff1a; 创建应用&#xff1a; 自行创建应用名称&#xff1a; 对话测试&#xff1a; API测试 ERNIE-Bot-4 API&#xff1a;ERNIE-Bot-4 打开链接查看自己的API Key&#xff0c;Secret Key。 可参…