一、背景
项目中每次手动打包后,生成的测试包,都需要手动打开蒲公英平台的网址,登录账号,手动上传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,一个永不停止学习的程序员。