android还原代码混淆proguard日志的工具--retrace和SmartRetrace

article/2025/11/1 3:10:27

介绍

代码混淆时android反编译的常用方法,android SDK提供了Proguard工具,路径是

ANDROID_SDK_HOME/tools/proguard

命令行在ANDROID_SDK_HOME/tools/proguard/bin下,而实际的执行代码路径为ANDROID_SDK_HOME/tools/proguard/lib

 

apk经过混淆后,在闪退时只要有mapping文件,可以通过retrace工具恢复。SDK提供的retrace命令如下:

java -jar retrace.jar [options...] mapping_file [stacktrace_file]

 

例如下面的崩溃堆栈

08-24 00:39:08.406 31542 31542 I QarthLog: [PatchStore] create disable file for com.lucky.bamboo uid is 10185
--------- beginning of crash
08-24 00:39:08.407 31542 31542 E AndroidRuntime: FATAL EXCEPTION: main
08-24 00:39:08.407 31542 31542 E AndroidRuntime: Process: com.lucky.bamboo, PID: 31542
08-24 00:39:08.407 31542 31542 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.lucky.bamboo/com.lucky.bamboo.MainActivity}: java.lang.ArithmeticException: divide by zero
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3895)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4074)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2473)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:110)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at android.os.Looper.loop(Looper.java:219)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:8347)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1055)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: Caused by: java.lang.ArithmeticException: divide by zero
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at com.lucky.bamboo.c.a.a(SourceFile:2)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at com.lucky.bamboo.c.a.<init>(SourceFile:2)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at com.lucky.bamboo.c.a.a(SourceFile:1)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at com.lucky.bamboo.MainActivity.onCreate(SourceFile:3)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at android.app.Activity.performCreate(Activity.java:8085)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at android.app.Activity.performCreate(Activity.java:8073)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1320)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3868)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: ... 11 more
08-24 00:39:08.408 1750 2835 W ActivityManager: Process com.lucky.bamboo has crashed too many times: killing!
08-24 00:39:08.408 1750 2835 W ActivityTaskManager: handleAppCrashLocked Force finishing activity com.lucky.bamboo/.MainActivity

mapping文件为“mapping.txt”

方法一、retrace运行命令

retrace.bat mapping.txt error.txt

 

运行得到结果:

 

08-24 00:39:08.406 31542 31542 I QarthLog: [PatchStore] create disable file for com.lucky.bamboo uid is 10185
--------- beginning of crash
08-24 00:39:08.407 31542 31542 E AndroidRuntime: FATAL EXCEPTION: main
08-24 00:39:08.407 31542 31542 E AndroidRuntime: Process: com.lucky.bamboo, PID: 31542
08-24 00:39:08.407 31542 31542 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.lucky.bamboo/com.lucky.bamboo.MainActivity}: java.lang.ArithmeticException: divide by zero
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3895)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4074)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2473)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at android.os.Handler.dispatchMessage(Handler.java:110)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at android.os.Looper.loop(Looper.java:219)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at android.app.ActivityThread.main(ActivityThread.java:8347)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at java.lang.reflect.Method.invoke(Method.java)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1055)
08-24 00:39:08.407 31542 31542 E AndroidRuntime: Caused by: java.lang.ArithmeticException: divide by zero
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at com.lucky.bamboo.db.BambooDatabaseHelper.testMapping(BambooDatabaseHelper.java:26)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at com.lucky.bamboo.db.BambooDatabaseHelper.<init>(BambooDatabaseHelper.java:21)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at com.lucky.bamboo.db.BambooDatabaseHelper.obtain(BambooDatabaseHelper.java:16)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at com.lucky.bamboo.MainActivity.onCreate(MainActivity.java:15)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at android.app.Activity.performCreate(Activity.java:8085)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at android.app.Activity.performCreate(Activity.java:8073)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1320)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3868)
08-24 00:39:08.407 31542 31542 E AndroidRuntime:        ... 11 more
08-24 00:39:08.408  1750  2835 W ActivityManager: Process com.lucky.bamboo has crashed too many times: killing!
08-24 00:39:08.408  1750  2835 W ActivityTaskManager:   handleAppCrashLocked Force finishing activity com.lucky.bamboo/.MainActivity

 

方法二:SmartRetrace UI工具

在实际项目中,经常为了查看某段堆栈的原始代码要把日志放在txt文件,然后再用命令行运行,而且还要找到mapping文件,用起来非常繁琐,命令行很长,而且操作步骤很多。

鉴于retrace本身就是jar包,所以本人想到能不能把retrace的命令做成UI模式,这样子很方便操作。经过两天的努力终于完成了一个勉强可用的UI工具——SmartRetrace

如果在SmartRetrace.jar的同级目录下新建一个目录“mappings”,里面可以存放多个mapping文件,并且可以使用下拉框。

工具下载链接:https://download.csdn.net/download/SweetTool/12741147

 

方法三、android sdk的tools下的proguard工具retraceui,不过感觉不好用,还不如命令行方便。

 

 

相对来说,官方的UI工具没那么好用,主要是选择文件的效率比命令行直接输出跟慢。


http://chatgpt.dhexx.cn/article/NBM2RAcE.shtml

相关文章

with recursive用法

with recursive 则是一个递归的查询子句&#xff0c;他会把查询出来的结果再次代入到查询子句中继续查询。 with recursive d(n, fact) as ( values (1,2) union all #合并 select n1, (n1)*fact from d where n < 5) SELECT * from d;递归过程如下&#xff1a; n1 fact2 n…

python实验之绘制南丁格尔玫瑰图

一、实验目的 了解玫瑰图的前世今生&#xff1b;了解 matplotlib 标准库中的 pyplot 模块&#xff1b;了解在极坐标 系中绘制柱状图。 二、实验基本原理及步骤&#xff08;或方案设计及理论计算&#xff09; 实验步骤&#xff1a; 查阅文档&#xff0c;了解南丁格尔玫瑰图的原…

南丁格尔玫瑰图 | 集才华和美貌于一身的数据图表

南丁格尔玫瑰图将柱图转化为更美观的饼图形式&#xff0c;是极坐标化的柱图&#xff0c;其夸大了数据之间差异的视觉效果&#xff0c;适合展示数据原本差异小的数据。 1、玫瑰图的前世今生 长得像饼图又不是饼图&#xff0c;这种有着极坐标的统计图有着一个美丽的名字—南丁格…

雷达图+南丁格尔玫瑰图

具体实现的效果图&#xff1a; 使用的图表插件是echarts,具体的完整代码如下&#xff1a; import * as echarts from echarts;var chartDom document.getElementById(main); var myChart echarts.init(chartDom); var option;var arr [{ name: 1楼, value: 30 },{ name: 2楼…

Echarts南丁格尔玫瑰图、锥形柱状图、渐变曲线图

目录 1、南丁格尔玫瑰图 2、锥形柱状图 3、渐变曲线图 4、曲线图 1、南丁格尔玫瑰图 option {title: {text: 作物占比,left: 50, // 组件离容器左侧的距离top: 20},legend: {top: 52%,x: center,y: top,width: 180,height: 60,itemGap: 30,itemWidth: 15,itemHeight: 1…

Python数据可视化之南丁格尔玫瑰图(亲测)

文章目录 1. 什么是南丁格尔玫瑰图2. 南丁格尔玫瑰图的绘制 1. 什么是南丁格尔玫瑰图 央视新闻用来展示疫情0增长天数的图就是南丁格尔玫瑰图。 南丁格尔玫瑰图&#xff08;Nightingale rose diagram&#xff09;又名鸡冠花图、极坐标区域图。统计学家和医学改革家佛罗伦斯‧…

【R语言 南丁格尔玫瑰图绘制】

继续上一篇地理信息可视化讲起&#xff0c;为了能够更加直观的展示数据分布情况&#xff0c;发现之前人民日报客户端曾经做过一张关于疫情分布的玫瑰图&#xff0c;非常惊艳&#xff0c;故尝试用当前爬取的数据进行绘制。 绘图前数据整理 现存数据中不少地区病例已经清零&…

南丁格尔玫瑰图解析

一&#xff1a;先安装软件&#xff0c;任意一个都可以 PyCharm安装教程 https://www.cnblogs.com/du-hong/p/10244304.html Anaconda安装教程 https://blog.csdn.net/ITLearnHall/article/details/81708148 二&#xff1a;相关软件以及Python库的知识讲解&#xff1a; Py…

Echarts南丁格尔图.

项目场景&#xff1a; 通过Echarts修改南丁格尔图js文件&#xff0c;修改轮盘颜色。使项目更加美观 文本标签自定义 问题描述 不知道为什么自定义函数使饼图图形上的文本标签label标签显示在内部且&#xff0c;获得对应标签的数据。使用自定义函数formatter的参数是ar&#…

Python+Matplotlib绘制饼状图模拟南丁格尔玫瑰图

开学第一课&#xff1a;一定不要这样问老师Python问题 董付国老师Python系列教材推荐与选用参考 版权声明&#xff1a;由于公众号后台规则问题&#xff0c;本文暂时无法设置原创标记&#xff0c;但仍属原创内容&#xff0c;微信公众号“Python小屋”坚持只发原创技术文章。 推…

使用Matplotlib绘制南丁格尔玫瑰图

前言 在前文中&#xff0c;我们介绍了使用pyecharts绘制南丁格尔玫瑰图&#xff0c;本章我们再学习一下使用matplotlib绘制南丁格尔玫瑰图&#xff0c;了解在极坐标系中绘制柱状图。并对比一下两种不同的绘制方法&#xff0c;如何实现&#xff1f; 介绍 玫瑰图是弗罗伦斯南丁…

从南丁格尔图到医学发展史

可视化中&#xff0c;前端用于表现不同类目的数据在总和中的占比的场景&#xff0c;往往会采用饼图。 针对数据大小相近&#xff0c;南丁格尔图的呈现会更加美观。 南丁格尔图&#xff0c;又称玫瑰图&#xff0c;是由弗罗伦斯南丁格尔发明。 弗洛伦斯南丁格尔 开创了护理事业…

echarts绘制嵌套环形图(南丁格尔玫瑰图)

根据专业总人数和学院总人数绘制嵌套环形图 首先&#xff0c;echarts的基本步骤 引入js&#xff0c;准备容器&#xff0c;初始化实例&#xff0c; <script src"lib/echarts.min.js"></script><style>.box{width: 900px;height: 500px;background…

Python数据可视化之南丁格尔玫瑰图

文章目录 1. 什么是南丁格尔玫瑰图2. 南丁格尔玫瑰图的绘制 1. 什么是南丁格尔玫瑰图 央视新闻用来展示疫情0增长天数的图就是南丁格尔玫瑰图。 南丁格尔玫瑰图&#xff08;Nightingale rose diagram&#xff09;又名鸡冠花图、极坐标区域图。统计学家和医学改革家佛罗伦斯‧…

R-南丁格尔玫瑰图: 仿制效果最好的疫情玫瑰图

这是到目前为止我觉得讲解最为细致、仿制与色彩改进效果最好的疫情玫瑰图教程。所以特约稿给大家学习&#xff01;作者码字不易&#xff0c;还请多多支持。 Angus,温州医科大学在读博士&#xff0c;急诊医学专业&#xff0c;主攻临床数据库及人工智能在危重症患者的应用。 Easy…

教你做超惊艳的南丁格尔玫瑰图

其实早在今年初&#xff0c;疫情还很严重的时候&#xff0c;人民日报发布的这个图就吸引了广大数据分析者的注意。 今天我们就把这个图的前因后果以及怎么做一次性讲清楚。 玫瑰图的前世今生 这个图学名&#xff1a;南丁格尔玫瑰图&#xff0c;是弗罗伦斯南丁格尔女士发明的…

Python科学绘图 南丁格尔图/玫瑰图

文章目录 Github/GItee仓库地址注意生成数据乱序数据渲染图片为png或jpeg顺序数据 Github/GItee仓库地址 ScienceGallery-GithubScienceGallery-Gitee 注意 数据传入到 pyecharts 的时候&#xff0c;需要自行将数据格式转换成上述 Python 原生的数据格式。方法&#xff1a; …

南丁格尔玫瑰图 With ggplot2【R语言】

前言 之前在饼图中提到过&#xff0c;要整理一下南丁格尔玫瑰图的画法&#x1f611; 南丁格尔玫瑰图又名鸡冠花图、极坐标区域图&#xff0c;是南丁格尔在克里米亚战争期间提交的一份关于士兵死伤的报告时发明的一种图表。南丁格尔玫瑰图是在极坐标下绘制的柱状图&#xff0c;…

echarts最简单的南丁格尔玫瑰图+图例

//图标写在方法里面&#xff08;然后在mounted里展示&#xff09; getEcharts(){ var myChart document.getElementById(‘echarts’); let echarts echarts.init(myChart); var option; var legends this.getlowIncomeData_xData; //图例名字&#xff08;在这里作修改&…

python+matplotlib绘制南丁格尔玫瑰图

实验:绘制南丁格尔玫瑰图   本实验有一定难度,有人说matplotlib绘图和matlab大同小异,我看除了一些函数名相同之外,其他的像参数和使用方法很不一样.另外我不知道是不是在matlab中画玫瑰图直接一个"肉丝"函数就成了,为什么matplotlib里面没有~~   无论如何还是感…