一. 代码混淆的意义
代码混淆的一个主要的目的是为了能够保证代码的安全性:我们的代码发布出去以后,有的用户可能会使用某些反编译工具查看我们的代码,为了避免这样的行为,故有代码混淆。
代码混淆以后,原有代码的包名,类名和方法名会被修改。
二.问题定位
问题的定位是比较复杂的,基本的思路是
1. 准备:错误日志、mapping文件、源代码
2.使用mapping文件迅速定位到源码位置
三.mapping.txt 在哪里?
设置proguard.config属性:
在创建Android工程时,proguard.cfg文件会在根目录自动被创建,该文件定义了ProGuard如何优化和混淆代码。其默认的配置只覆盖了一些通用的情况,但也满足了基本的需求;如需深入定制,还需参考相关的配置文档。
默认情况下,proguard.config属性是未被设置的,如需启用,则在工程根目录下的default.properties文件中设置,其路径可以是相对路径或是绝对路径。
书写形式如可以是这样的:
proguard.config=proguard.cfg
也可以将proguard.cfg文件放到别处,然后指定路径:
proguard.config=/path/to/proguard.cfg
混淆打包:
在release模式下,有如下几种导出方式:
1、右击工程->android tools->export signed android package生成签名的包,
2、右击工程——>Export选择导出类型
3、ant release
混淆成功后,除生成了指定类型的混淆包外,还会在工程的根目录下或是根目录下得bin文件夹中生成proguard文件夹,里面包含dump.txt、mapping.txt、seeds.txt和usage.txt四个文件。
Android studio是在\app\build\outputs\mapping\release 这个目录下
dump.txt : 描述.apk文件中所有类文件间的内部结构
mapping.txt :列出了原始的类,方法和字段名与混淆后代码间的映射。这个文件很重要,当你从release版本中收到一个bug报告时,可以用它来翻译被混淆的代码。
seeds.txt :列出了未被混淆的类和成员
usage.txt : 列出了从.apk中删除的代码
四. 实例操作
混淆之后的代码报错:
Caused by: java.lang.NullPointerException
at net.simplyadvanced.ltediscovery.be.u(Unknown Source)
at net.simplyadvanced.ltediscovery.at.v(Unknown Source)
at net.simplyadvanced.ltediscovery.at.d(Unknown Source)
at net.simplyadvanced.ltediscovery.av.onReceive(Unknown Source)
使用mapping之后的报错:
Caused by: java.lang.NullPointerException
at net.simplyadvanced.ltediscovery.UtilTelephony.boolean is800MhzNetwork()(Unknown Source)
at net.simplyadvanced.ltediscovery.ServiceDetectLte.void checkAndAlertUserIf800MhzConnected()(Unknown Source)
at net.simplyadvanced.ltediscovery.ServiceDetectLte.void startLocalBroadcastReceiver()(Unknown Source)
at net.simplyadvanced.ltediscovery.ServiceDetectLte$2.void onReceive(android.content.Context,android.content.Intent)(Unknown Source)
五. 如何做到的?
你可以在GUI或者命令行中进行操作。
在GUI下操作:
1) 打开/tools/proguard/bin/proguardgui.bat
2) 选择左边的 “ReTrace”操作.
3) 添加你的mapping文件和错误.
4) 点击“ReTrace!”
在命令行下操作
1) 将mapping.txt 和错误日志(txt保存一下)拷贝到你的这个目录下:
/tools/proguard/bin.
2) 在windows下,进入到对应目录,运行命令(确保你的错误文件名字是对的):
retrace.bat -verbose mapping.txt stacktrace.txt > out.txt
3) out.txt 就是解混淆之后的错误日志了.
现在加上源码,就比较容易定位问题了。