📅  最后修改于: 2023-12-03 15:38:08.301000             🧑  作者: Mango
Android 应用程序通常使用混淆工具来保护代码安全。但是,由于混淆过程会改变类、方法和字段的名称,使得 Stacktrace 的可读性受到影响,这对开发人员分析应用程序的崩溃日志非常困难。为了帮助解决这个问题,Google 在 SDK Tools 17 以后的版本中提供了一种自动反混淆的技术,即使用映射文件(mapping file)。
映射文件是一个文本文件,其中包含混淆前和混淆后的各个标识符之间的映射关系。可以通过 Gradle 构建工具来自动生成映射文件。一旦有了映射文件,就可以用它来还原混淆后的类、方法和字段的名称,以便更容易地分析 Stacktrace。
以下是使用映射文件对 Android Stacktrace 进行反混淆的步骤:
在 Gradle 构建工具中,可以使用以下命令来生成映射文件:
./gradlew assembleRelease --dry-run | grep mapping
这将在命令行输出中显示混淆的映射文件的路径,如下所示:
:app:transformClassesAndResourcesWithProguardForRelease
/path/to/app/build/outputs/mapping/release/mapping.txt
首先从 Google Play 控制台或崩溃日志中找到你要解决的崩溃日志。崩溃日志将包括类似于以下内容的信息:
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.example.myapp.MainActivity.getHello()' on a null object reference
at com.example.myapp.MainActivity.onCreate(MainActivity.java:23)
将 Stacktrace 中的每个类和方法名称与映射文件中的对应项进行比较。你可以使用以下格式查找方法和类名:
<混淆前名称> -> <混淆后名称>:
如果找到了一项,即可使用混淆前的名称来还原原始的类或方法名称。例如,在本例中,可以找到以下内容:
com.example.myapp.MainActivity -> com.example.myapp.a:
java.lang.String getHello() -> a()
这表明 MainActivity
类已被混淆为 a
,getHello()
方法已被混淆为 a()
。
可以将这些信息应用于 Stacktrace 中的每个混淆名称以还原它们的原始名称。使用反混淆后的 Stacktrace,就可以更轻松地分析问题并修复错误。
总结:使用映射文件对 Android Stacktrace 进行反混淆,能够帮助开发人员更轻松地分析崩溃日志。通过逐个比对混淆前和混淆后的名称,可以还原出原始的类和方法名称,从而更容易地解决问题。