您的位置:首页 > 移动开发 > Android开发

android混淆之从异常堆栈中还原ProGuard混淆过的代码

2016-08-18 15:59 525 查看

一 代码混淆的意义

代码混淆的一个主要的目的是为了能够保证代码的安全性:我们的代码发布出去以后,有的用户可能会使用某些反编译工具查看我们的代码,为了避免这样的行为,故有代码混淆。

代码混淆以后,原有代码的包名,类名和方法名会被修改。

二、mapping文件位置

此路径为: app\build\outputs\mapping{}发布渠道}\release\mapping.txt

如果不存在就在gradle中配置:

release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}


在proguard-rules.pro中配置:

-printseeds seeds.txt
-printmapping mapping.txt
-printusage unused.txt


文件说明:

dump.txt  : 描述.apk文件中所有类文件间的内部结构

mapping.txt :列出了原始的类,方法和字段名与混淆后代码间的映射。这个文件很重要,当你从release版本中收到一个bug报告时,可以用它来翻译被混淆的代码。

seeds.txt :列出了未被混淆的类和成员

usage.txt : 列出了从.apk中删除的代码


三、实例操作

混淆后:

java.lang.ArithmeticException: divide by zero
at com.example.zzx.myapplication.d.a(Unknown Source)
at com.example.zzx.myapplication.a.onClick(Unknown Source)
at android.view.View.performClick(View.java:4760)
at android.view.View$PerformClick.run(View.java:19762)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5336)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)


mapping后:

java.lang.ArithmeticException: divide by zero
at com.example.zzx.myapplication.Test.toTest()(Unknown Source)
at com.example.zzx.myapplication.MainActivity.onClick(Unknown Source)
at android.view.View.performClick(View.java:4760)
at android.view.View$PerformClick.run(View.java:19762)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5336)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)


四、如何实现

你可以在GUI或者命令行中进行操作。

在GUI下操作 :

1) 打开< Android -sdk>/tools/proguard/bin/proguardgui.sh

2) 选择左边的 “ReTrace”操作.

3) 添加你的mapping文件和错误.

4) 点击“ReTrace!”

在命令行下操作

1) 将mapping.txt 和错误日志(txt保存一下)拷贝到你的这个目录下:

/tools/proguard/bin.

2) 在mac下,进入到对应目录,运行命令(确保你的错误文件名字是对的):

retrace.sh -verbose mapping.txt stacktrace.txt > out.txt

3) out.txt 就是解混淆之后的错误日志了.

现在加上源码,就比较容易定位问题了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mapping proguard android