架构日记(六)新建Gradle Task实现打包后上传到蒲公英
提示:列表可左右滑动查看。
<p>前面的文章中提到了脚本自动执行打包和安装,其实将脚本重组也是可以做到一键发布的,只是每一篇文章都有自己需要解决的问题,所以没有完全串起来实现一键打包发布。<br><br>首先下面贴出蒲公英的官网地址<br><br>https://www.pgyer.com<br><br>蒲公英开放api地址<br><br>https://www.pgyer.com/doc/view/api<br><br>我们需要用到的蒲公英上传的post请求的地址<br><br>https://www.pgyer.com/apiv2/app/upload<br><br>剩下的细节可以自己去官网查看,接下来看代码吧</p><p><img src="https://51techud.yykj.com:9002/forumpic/20210722160345_2d.png" style="max-width:100%;"><br></p><p><span style="color: rgb(77, 77, 77); font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif, SimHei, SimSun; font-size: 16px;">粘贴一些常用命令方便查看,服务到位吧~~~</span><br></p><pre><code>//构建<br>gradlew app:clean //移除所有的编译输出文件,比如apk<br> <br>gradlew app:build //构建 app module ,构建任务,相当于同时执行了check任务和assemble任务<br> <br>//检测<br>gradlew app:check //执行lint检测编译。<br> <br>//打包<br>gradlew app:assemble //可以编译出release包和debug包,可以使用gradlew assembleRelease或者gradlew assembleDebug来单独编译一种包<br> <br>gradlew app:assembleRelease //app module 打 release 包<br> <br>gradlew app:assembleDebug //app module 打 debug 包<br> <br>//安装,卸载<br> <br>gradlew app:installDebug //安装 app 的 debug 包到手机上<br> <br>gradlew app:uninstallDebug //卸载手机上 app 的 debug 包<br> <br>gradlew app:uninstallRelease //卸载手机上 app 的 release 包<br> <br>gradlew app:uninstallAll //卸载手机上所有 app 的包</code></pre><p>多渠道的包加上渠道名也可以执行命令,尤其是安装,下载,和打包,以豌豆荚为例(Mac)<br><br>./gradlew app:installWandoujiaDebug or Release<br><br>./gradlew app:uninstallWandoujiaDebug or Release<br><br>./gradlew app:assembleWandoujiaDebug or Release<br><br>新建文件 uploadApk.gradle<br><br>存放在setting.gradle同级目录下</p><pre><code>import groovy.json.JsonSlurper<br> <br>//自动上传到蒲公英<br>def uploadApk(){<br> //查找等待上传的apk文件<br> //正常打包可以在debug和relase下找到,但是多渠道打包,需要选择正确的渠道路径<br> def apkDir = new File("build/outputs/apk/wandoujia/debug")<br> <br> if(!apkDir.exists()){<br> throw new RuntimeException("apk outputs path not exists!")<br> }<br> <br> def apk = null<br> for(int i = apkDir.listFiles().length - 1 ; i >= 0 ; i--){<br> File file = apkDir.listFiles()[i]<br> if(file.name.endsWith(".apk")){<br> apk = file<br> break<br> }<br> }<br> <br> if(apk == null){<br> throw new RuntimeException("apk file not exists!")<br> }<br> <br> println "*********************************** start upload file ******************************************"<br> <br> def twoHyphens = "--"<br> def boundary = "*********"<br> def end = "\r\n"<br> <br> //蒲公英API上传接口 https://www.pgyer.com/doc/view/api#uploadApp 官方文档地址<br> def conn = new URL("https://www.pgyer.com/apiv2/app/upload").openConnection()<br> conn.setRequestMethod("POST")<br> conn.setRequestProperty("Connection", "Keep-Alive")<br> conn.setRequestProperty("Charset", "UTF-8")<br> conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary)<br> conn.setDoInput(true)<br> conn.setDoOutput(true)<br> <br> /**<br> * 蒲公英为测试账号<br> * xxxxxxxxx<br> */<br> <br> //添加参数:_api_key<br> def sb = new StringBuilder()<br> sb.append(twoHyphens).append(boundary).append(end)<br> sb.append("Content-Disposition: form-data; name=_api_key")<br> sb.append(end).append(end)<br> sb.append("写自己的").append(end)<br> <br> //添加参数:buildUpdateDescription 更新日志,取值git<br> sb.append(twoHyphens).append(boundary).append(end)<br> sb.append("Content-Disposition: form-data; name=buildUpdateDescription")<br> sb.append(end).append(end)<br> sb.append(getGitVersionInfo()).append(end)<br> <br> //添加参数:buildInstallType 设置密码安装<br> sb.append(twoHyphens).append(boundary).append(end)<br> sb.append("Content-Disposition: form-data; name=buildInstallType")<br> sb.append(end).append(end)<br> sb.append(2).append(end)<br> <br> //添加参数:buildPassword 设置密码 cfss1234 fgbp1234<br> sb.append(twoHyphens).append(boundary).append(end)<br> sb.append("Content-Disposition: form-data; name=buildPassword")<br> sb.append(end).append(end)<br> sb.append("自己的提取密码").append(end)<br> <br> //添加参数file: 需要上传的apk文件<br> sb.append(twoHyphens).append(boundary).append(end)<br> sb.append("Content-Disposition: form-data; name=file;filename=").append(apk.getName())<br> sb.append(end).append(end)<br> <br> def dos = new DataOutputStream(conn.getOutputStream())<br> dos.writeBytes(sb.toString())<br> dos.flush()<br> sb.delete(0, sb.length())<br> <br> def fis = new FileInputStream(apk)<br> byte[] bf = new byte[8192]<br> int len<br> while ((len = fis.read(bf)) != -1) {<br> dos.write(bf, 0, len)<br> }<br> sb.append(end)<br> sb.append(twoHyphens).append(boundary).append(end)<br> dos.writeBytes(sb.toString())<br> <br> dos.flush()<br> fis.close()<br> dos.close()<br> conn.connect()<br> <br> def text = conn.getContent().text<br> def resp = new JsonSlurper().parseText(text)<br> <br> println text<br> println "*************** upload finish ***************"<br> <br> if (resp.code != 0) {<br> throw new RuntimeException(resp.message)<br> }<br> <br> //浏览器中打开短连接<br> def url = "https://www.pgyer.com/" + resp.data.buildShortcutUrl<br> print("上传成功,应用链接:" + url)<br> <br>}<br> <br>def getGitVersionInfo() {<br> return 'git log -n 1'.execute().text.trim()<br>}<br> <br>//打包测试环境apk 上传蒲公英 发送邮件功能使用蒲公英自带的邮件功能<br>task uploadApk(group: "upload") {<br> dependsOn("assembleDebug")<br> <br> doLast {<br> uploadApk()<br> }<br>}</code></pre><p> 双击uploadApk任务,由于依赖了assembleDebug任务,所以会先执行编译打包的任务。wandoujia的路径,见上一篇多渠道打包。具体的地址根据自己的工程结构来构建<br><br>Android Gradle的总结,强烈推荐这篇文章<br><br>https://blog.csdn.net/zhaoyanjun6/article/details/77678577<br><br>最终效果</p><p><img src="https://51techud.yykj.com:9002/forumpic/20210722160439_gi.png" style="max-width:100%;"><br></p><p><span style="color: rgb(77, 77, 77); font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif, SimHei, SimSun; font-size: 16px;">网页的地址再AS的Run输出中打印了</span><br></p><p><img src="https://51techud.yykj.com:9002/forumpic/20210722160453_il.png" style="max-width:100%;"><span style="color: rgb(77, 77, 77); font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif, SimHei, SimSun; font-size: 16px;"><br></span></p>
赞(0)
收藏(0)
分享
相关标签: