关于安卓grovvy开发(一)bugly混淆自动上报

背景

打包,mapping,上传,这些是不是都困扰了开发很多。苦于复制粘贴?反正我是。于是,有了这个

最终效果

请添加图片描述
最终的效果,就是点击项目的打包gradle,复制mapping文件且进行bugly混淆的自动上报。

环境

win10
gradle7.5
jdk8,jdk11
as2022+

特别说明

jdk是要有jdk8和jdk11的。因为bugly的上报jar包,只能用jdk8运行。
在这里插入图片描述
上图是bugly符号表上传的官方说明,已经两年没更新了,可能已经稳定了吧,反正只能用jdk8。
对于上传符号表不懂的朋友,可以看我这篇文章。
https://blog.csdn.net/motosheep/article/details/130398365

开始编码

首先,写grovvy类似的脚本,需要有一定的java基础。这里就不在太多细节上面叙述了,麻烦自行研究。
这里主要分为两大块:
(一)mapping文件的复制
(二)mapping文件的上传


开始!!这里由于过于简单,就两个步骤一起讲。
文件复制,来来去去,都是一个流的操作,而在grovvy中,只需要通过Files.copy即可完成操作!方便吧!
核心代码讲完了,可以关网页了。请添加图片描述
好了,言归正传。
首先大致的流程如下:
找到release包生成的mapping目录–>复制mapping文件到自定义的目录–>上传mapping文件到bugly。对于上传,这里我写了一个bat脚本,直接在代码里面调用即可!

!!!注意!!!
自己写的xxx.gradle文件,需要放到项目的根目录。然后,需要在app项目中的build.gradle文件使用指令:apply from: "…/copyFileBat.gradle"进行引入,然后愉快地编写task即可。

这里要注意,我们是执行完 assembleRelease 才去进行复制上传的。通过百度网上的代码,可谓是五花八门,最后经过不断尝试,终于跑通了,下面放出代码,目的只有一个,就是要后人,少走弯路!

/*** 在打完正式包后执行(assembleRelease)*/
project.tasks.whenTaskAdded { Task task ->if (task.name == 'assembleRelease') {task.doLast {//todo 操作}}
}

我们的复制,上传,就是在todo作用域里面进行编码的。
而复制,就是传入两个文件全路径,进行api调用即可。例如:
a.jpg,b.jpg
Files.copy(new File(a.jpg).toPath(),new File(b.jpg).toPath())
即可实现复制!

而项目中,一般mapping路径如下图:

在这里插入图片描述
好了,源文件路径有了,复制指令有了,自己创建一个目录玩去吧。–就是一些File的api操作而已,不过记得,复制之前,要把父目录创建好,才不会报io错误。

下面放出所有核心代码:

copyFileBat.gradle文件:

import java.nio.file.Files
import java.text.SimpleDateFormatext {//copyFiledef CopyFilePath = "${rootProject.rootDir}/copytask/"//mapping文件原始目录MappingFileOrgPath = "${project.buildDir}/outputs/mapping/release/mapping.txt"//mapping复制文件目标目录def mappingRadonFile = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + "mapping.txt"MappingFileRootPath = CopyFilePath + "/mapping/"MappingPathName = MappingFileRootPath + mappingRadonFile//源apk文件ApkSourcePath = "${project.buildDir}/outputs/apk/release/"//复制apk目标文件夹ApkTargetPath = CopyFilePath + "/release/"//!!!!!!!!!!bugly 混淆上传相关,需要按照项目配置!!!!!!!!!!!!!!//jdk8运行环境
//    JDK8Path = "D:\\software\\java\\jdk1.8\\bin\\java.exe"JDK8Path = "D:\\software\\Java\\jdk1.8.0_211\\bin\\java.exe"BuglySymJar = new File("${rootProject.rootDir}").parent + "/buglyqq-upload-symbol/buglyqq-upload-symbol.jar"BuglySymMappingPath = new File("${rootProject.rootDir}").parent + "/buglyqq-upload-symbol/mappingfile"BuglyPackageName = "com.example.androidjiaguchannel"BuglyKey = "d89bcdce-978b-4485-8ff4-a95b20372ed6"BuglyId = "877be21cd4"BuglyBat = new File("${rootProject.rootDir}").parent + "/buglyqq-upload-symbol/run.bat"
}/*** 查找apk文件* @param path* @param suffix* @return*/
private static File findApkFile(path, suffix) {def dir = new File(path)return dir.listFiles().find { it.isFile() && it =~ /.*${suffix}\.apk/ }
}/*** 查找txt文件* @param path* @param suffix* @return*/
private static File findTxtFile(path, suffix) {def dir = new File(path)return dir.listFiles().find { it.isFile() && it =~ /.*${suffix}\.txt/ }
}/*** 复制mapping文件* */
private static boolean copyMapping(MappingFileOrgPath, MappingFileRootPath, MappingPathName) {//复制mapping文件System.println("----------------assembleRelease finish----------------")try {System.println("----------------copy mapping file start---------------")def orgMappingFilePath = new File(MappingFileOrgPath)def targetMappingPath = new File(MappingFileRootPath)targetMappingPath.deleteDir()targetMappingPath.mkdirs()def targetMappingFilePath = new File(MappingPathName)Files.copy(orgMappingFilePath.toPath(), targetMappingFilePath.toPath())System.println("----------------copy mapping 目录---------------")System.println(targetMappingFilePath.toPath())} catch (Exception e) {e.printStackTrace()System.println("----------------copy mapping error,不再进行后续操作----------------")return false}return true
}/*** 复制apk文件* */
private static boolean copyReleaseApk(ApkSourcePath, ApkTargetPath) {//复制生成的apk release文件try {System.println("----------------copy release apk---------------")System.println("----------------copy apk file start---------------")def findSourceApk = findApkFile(ApkSourcePath, "-release")if (findSourceApk == null) {System.println("----------------copy apk can‘t find-------------")return}def sourceApkNameFullPath = findSourceApk.toPath().toString()def fileNameStartPos = sourceApkNameFullPath.lastIndexOf(File.separator)def sourceFileName = "app-release.apk"if (fileNameStartPos != -1) {sourceFileName = sourceApkNameFullPath.substring(fileNameStartPos + 1)}def orgApkFilePath = findSourceApkdef targetApkPath = new File(ApkTargetPath)targetApkPath.deleteDir()targetApkPath.mkdirs()def targetApkFilePath = new File(ApkTargetPath + sourceFileName)Files.copy(orgApkFilePath.toPath(), targetApkFilePath.toPath())System.println("----------------copy apk 目录---------------")System.println(targetApkFilePath.toPath())} catch (Exception e) {e.printStackTrace()System.println("----------------copy apk error,不再进行后续操作----------------")return false}return true
}/*** bugly mapping上传* */
private static void buglyMappingUpload(JDK8Path, BuglyBat, BuglySymMappingPath, MappingFileRootPath,BuglySymJar, BuglyPackageName, BuglyId, BuglyKey) {try {
//复制mapping文件到脚本目录,然后上传到buglydef jdk8File = new File(JDK8Path)if (!jdk8File.exists()) {System.println("----------------mapping上传要求的jdk8环境不存在---------------" + jdk8File.toPath())return}def outsidePath = BuglyBatdef uploadBatFile = new File(outsidePath)if (!uploadBatFile.exists()) {System.println("----------------mapping上传脚本不存在---------------")return}def outsideMappingPath = BuglySymMappingPath + "/"new File(outsideMappingPath).mkdirs()System.println("----------------mapping上传脚本开始---------------")def findSourceMappingFile = findTxtFile(MappingFileRootPath, "mapping")if (findSourceMappingFile == null) {System.println("----------mapping上传错误,源文件不存在----------")return}def orgFileName = "mapping.txt"def fileNameStartPos = findSourceMappingFile.toPath().toString().lastIndexOf(File.separator)if (fileNameStartPos != -1) {orgFileName = findSourceMappingFile.toPath().toString().substring(fileNameStartPos + 1)}//外部mapping文件def outSizeFilePath = outsideMappingPath + orgFileNamedef outsideFile = new File(outSizeFilePath)outsideFile.delete()Files.copy(findSourceMappingFile.toPath(), outsideFile.toPath())System.println("bugly文件路径: " + outsideFile.toPath())System.println("脚本路径:" + uploadBatFile.path)Process process = Runtime.getRuntime().exec("cmd /c start " + uploadBatFile.path +" ${JDK8Path} ${BuglySymJar} " +"${BuglyPackageName} ${BuglySymMappingPath} ${outSizeFilePath} ${BuglyId} ${BuglyKey}")process.waitFor() // 等待批处理文件执行完成int exitCode = process.exitValue() // 获取批处理文件的退出码System.out.println("批处理文件执行完成,退出码:" + exitCode)} catch (Exception e) {e.printStackTrace()System.println("mapping上传错误:\n" + e.printStackTrace())}
}/*** 在打完正式包后执行(assembleRelease)*/
project.tasks.whenTaskAdded { Task task ->if (task.name == 'assembleRelease') {task.doLast {//源mapping复制if (!copyMapping(MappingFileOrgPath, MappingFileRootPath, MappingPathName)) {return}//源apk复制if (!copyReleaseApk(ApkSourcePath, ApkTargetPath)) {return}//bugly mapping 上传buglyMappingUpload(JDK8Path, BuglyBat, BuglySymMappingPath, MappingFileRootPath,BuglySymJar, BuglyPackageName, BuglyId, BuglyKey)}}
}

bat脚本上传文件:

@echo off
CLS
chcp 65001
echo 参数jdk8路径:%1
echo 参数bugly混淆jar路径:%2
echo 参数bugly目标包名:%3
echo 参数bugly混淆文件父目录:%4
echo 参数bugly混淆文件全路径:%5
echo 参数bugly Id:%6
echo 参数bugly Key:%7
echo "------------------------java版本信息------------------------"
%1 -version
echo "------------------------begin------------------------"
echo "------------------------注意!注意!注意!mapping文件需要放在mappingfile目录下------------------------"
echo "------------------------版本号------------------------"
set /p codeInput="请输入app版本号(例如:1.0.0):"
echo 输入app版本号为:%codeInput%echo "------------------------开始上传------------------------"
%1 -jar %2 -appid %6 -appkey %7 -bundleid %3 -version %codeInput% -platform Android -inputSymbol %4 -inputMapping %5
pause

注意!!!

copyFileBat.gradle文件中:

    //!!!!!!!!!!bugly 混淆上传相关,需要按照项目配置!!!!!!!!!!!!!!//jdk8运行环境
//    JDK8Path = "D:\\software\\java\\jdk1.8\\bin\\java.exe"JDK8Path = "D:\\software\\Java\\jdk1.8.0_211\\bin\\java.exe"BuglySymJar = new File("${rootProject.rootDir}").parent + "/buglyqq-upload-symbol/buglyqq-upload-symbol.jar"BuglySymMappingPath = new File("${rootProject.rootDir}").parent + "/buglyqq-upload-symbol/mappingfile"BuglyPackageName = "com.example.androidjiaguchannel"BuglyKey = "d89bcdce-978b-4485-8ff4-a95b20372ed6"BuglyId = "877be21cd4"BuglyBat = new File("${rootProject.rootDir}").parent + "/buglyqq-upload-symbol/run.bat"

需要修改为你电脑,项目中的配置信息。上述涉及到的变量,都要重新定义,你的环境和我的不一样!

最后,附上相关工具类的网址:
bugly符号表:
https://bugly.qq.com/docs/release-notes/release-symboltool/?v=1.0.0

that’s all--------------------------------------------------------------------------------------

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

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

相关文章

LeetCode141.环形链表

这个题非常简单,我一下子就想到了用HashSet,从前往后把节点放入hashset中,如果set中存在这个节点说明存在环,如果把链表遍历完了说明不存在环,直接返回false,以下时我的代码: public class Sol…

环境扫描/透射电子显微镜气体样品架的真空压力和微小流量控制解决方案

摘要:针对环境扫描/透射电子显微镜对样品杆中的真空压力气氛环境和流体流量精密控制控制要求,本文提出了更简单高效和准确的国产化解决方案。解决方案的关键是采用动态平衡法控制真空压力,真空压力控制范围为1E-03Pa~0.7MPa;采用压…

Pytest模式执行python脚本不生成allure测试报告

1.安装allure 下载allure的zip安装包 将allure.zip解压到python的lib目录中 将allure的bin路径添加到环境变量path中(注意:配置环境变量后,一定要重启电脑。因为环境变量没生效,我搞了半天在pycharm不能生成报告,在cmd中可以生成…

【Redis】.net core Redis事件订阅与发布,基础篇

2023年,第38周。给自己一个目标,然后坚持总会有收货,不信你试试! 发布与订阅(Publish/Subscribe,也简称为 Pub/Sub)是一种消息传递模式,用于解耦发布者和订阅者之间的关系。 目录 一…

华清远见第六课程day4作业

仿照string类&#xff0c;完成myString 类 #include <iostream> #include <cstring>using namespace std;class myString{ private:char *str;int size; public:myString():size(10){str new char[size];strcpy(str,"");}myString(const char*s){size …

【FPGA零基础学习之旅#12】三线制数码管驱动(74HC595)串行移位寄存器驱动

&#x1f389;欢迎来到FPGA专栏~三线制数码管驱动 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;FPGA学习之旅 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望大家能指…

Transformer(二)—— ResNet(残差网络)

Transformer&#xff08;二&#xff09;—— ResNet&#xff08;残差网络&#xff09; 一、背景1.1 梯度消失/爆炸1.2 网络退化(Degradation) 二、思路2.1 为什么需要更深的网络2.2 理想中的深网络表现 三、实践和实验效果3.1 构造恒等映射&#xff1a;残差学习&#xff08;res…

0016Java程序设计-springboot幼儿园管理系统

摘 要目 录系统设计开发环境 摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于幼儿园管理系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了幼儿园管理系统&a…

【进阶篇】MySQL的MVCC实现机制详解

文章目录 0.前言1.基础介绍1.1. 什么是MVCC?1.1. 什么是当前读和快照读&#xff1f;1.1. 当前读&#xff0c;快照读和MVCC的关系1.1. MVCC能解决什么问题&#xff0c;好处是&#xff1f;1.1.1. 提高并发性能1.1.2. 避免死锁1.1.3. 解决脏读、不可重复读和幻读等问题1.1.4. 实现…

【unity3D】如何修改相机的默认视角

&#x1f497; 未来的游戏开发程序媛&#xff0c;现在的努力学习菜鸡 &#x1f4a6;本专栏是我关于游戏开发的学习笔记 &#x1f236;本篇是unity的如何修改相机的默认视角 如何修改相机的默认视角 Game窗口运行的话视角是这样的&#xff1a; 此时Scene窗口的视角是这样的&…

游戏发行平台都有什么服务和功能?

游戏发行平台通常提供一系列服务和功能&#xff0c;以帮助游戏开发商将游戏推向市场&#xff0c;并为玩家提供游戏。以下是一些常见的游戏发行平台服务和功能&#xff1a; 1、游戏发布 发行平台允许游戏开发商将游戏上传到平台上&#xff0c;以供玩家下载和安装。 2、游戏销售…

qt作业day4

//clock_exercise.cpp#include "clock_timer.h" #include "ui_clock_timer.h"//时间事件处理函数 void Clock_Timer::timerEvent(QTimerEvent *event) {if(event->timerId() time_id){sys_tm QDateTime :: currentDateTime(); // int year sy…

远程恋爱网站部署秘籍——群晖虚拟机助ni秀恩爱

文章目录 前言1. 安装网页运行环境1.1 安装php1.2 安装webstation 2. 下载网页源码文件2.1 访问网站地址并下载压缩包2.2 解压并上传至群辉NAS 3. 配置webstation3.1 配置网页服务3.2 配置网络门户 4. 局域网访问静态网页配置成功5. 使用cpolar发布静态网页&#xff0c;实现公网…

习题练习 C语言(暑期第四弹)

自我小提升&#xff01; 前言一、数组二、指针运算三、统计每个月兔子的总数四、双指针的应用五、判断指针六、珠玑妙算七、两数之和八、数组下标九、指针十、寻找峰值十一、二级指针十二、大端小端十三、无符号参数十四、数对十五、截取字符串总结 前言 重要的事说三遍&#…

分布式系统常用的模式

分布式系统常用的模式 Ambassador 名称&#xff1a;“大使”模式 介绍&#xff1a;作为应用程序和其他服务的“中间人”&#xff0c;负责应用程序和其他服务之间的通信&#xff0c;包括日志、监控或重试处理等任务。 举例&#xff1a;K8S使用Envoy作为一个“大使”来简化服务…

Docker 搭建Redis 集群之路

前言 搞技术就是动手,动手再动手,实践出真知,毕竟最终是要解决问题的呢,废话不多讲,开搞,主要是为了记录一下,毕竟过程还是有点艰辛呢需求(target) Windows 电脑 装一个虚拟机用虚拟机构造Linux 系统下载Docker 搭建Redis 集群代码交互集群过关斩将 检查电脑是否开启…

初识Kafka

kafka 第一章、初识Kafka 原先&#xff1a; kafka&#xff0c;由LinkedIn公司采用Scala语言开发的一个多分区&#xff0c;多副本&#xff0c;基于Zookeeper协调的分布式消息系统&#xff0c;被捐献给Apache基金会。 现在 分布式流式处理平台。 高吞吐 可持久化 可水平扩展 …

go小知识2

Golang开发新手常犯的50个错误_gezhonglei2007的博客-CSDN博客 一些题目整理&#xff0c;附带大佬的解释 1.go中哪些值不能寻址& 常量&#xff08;const常量&#xff0c;字面值3.14&#xff0c;字符串“xxx”&#xff0c;函数或方法, map的val值&#xff09; golang中接…

JVM系列 运行时数据区

系列文章目录 第一章 运行区实验 文章目录 系列文章目录前言一、堆&#xff08;Heap&#xff09;1.1、新生代/Young区1.1.1、Eden区1.1.2、Survival区 1.2、年老代&#xff08;old区&#xff09; 二、虚拟机栈&#xff08;Stack&#xff09;2.1、栈顶缓存技术2.2、溢出2.3、栈…

83 # 静态服务中间件 koa-static 的使用以及实现

静态服务中间件&#xff1a;koa-static 中间件可以决定是否向下执行&#xff0c;如果自己可以处理&#xff0c;那么直接处理完毕结束&#xff0c;如果自己处理不了&#xff0c;next 方法会继续向下执行 新建 public 文件夹&#xff0c;里面添加 index.html、style.css 文件 …