使用 minifyEnabled 和 proguard 时如何将崩溃日志转换为可读形式?
How to convert the crash log into a readable form when using minifyEnabled and proguard?
我的项目有以下设置:
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
崩溃日志有时来自应用程序用户,例如:
l.c.b.c0.a.g
l.c.b.a0.z.j$a.a
l.c.b.i.c
l.c.b.i.b
k.a.a.f.a.i.a
n.m0.g.e$a.run
java.util.concurrent.ThreadPoolExecutor.runWorker ThreadPoolExecutor.java:1167
java.util.concurrent.ThreadPoolExecutor$Worker.run ThreadPoolExecutor.java:641
java.lang.Thread.run Thread.java:919
但是我怎么能看懂这里写的是什么?应该有反向转换。
如有任何帮助,我将不胜感激!
要首先获得可读代码,您必须确保始终保留 映射文件 的副本,每个构建都生成 minifyEnabled 设置为真。请注意,每次构建时都会覆盖映射文件,因此必须在构建后立即获取它们,否则映射将不再对应于您的目标二进制文件。
映射文件生成于:
<your-module-name>/build/outputs/mapping/<build-type>/
然后您可以使用 ReTrace 工具位于:
<your-android-sdk-location>\tools\proguard\lib\proguardgui.jar
ReTrace 屏幕截图,(该工具适用于 proguard 和 R8):
要直接在 android 的开发人员控制台中查看任何未混淆的崩溃堆栈跟踪,完成发布新版本后,请转到 “App Bundle Explorer” 部分,select "下载",并上传相应的映射文件。见截图:
• 奖金
下一个 gradle 脚本会将映射文件复制到与输出版本相同的位置,因此您无需在每次发布时都浏览它们:
task copyMappings() {
android.applicationVariants.all { variant ->
variant.outputs.all { output ->
variant.getAssembleProvider().configure() {
it.doLast {
if (variant.getBuildType().isMinifyEnabled()) {
def mappingProvider = variant.getMappingFileProvider()
if (mappingProvider != null) {
def files = mappingProvider.get().files
if (!files.isEmpty()) {
def mappingFile = files.iterator().next()
if (mappingFile != null && mappingFile.exists()) {
copy {
from mappingFile
into variant.getPackageApplicationProvider().get().outputDirectory
}
}
}
}
}
}
}
}
}
}
我的项目有以下设置:
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
崩溃日志有时来自应用程序用户,例如:
l.c.b.c0.a.g
l.c.b.a0.z.j$a.a
l.c.b.i.c
l.c.b.i.b
k.a.a.f.a.i.a
n.m0.g.e$a.run
java.util.concurrent.ThreadPoolExecutor.runWorker ThreadPoolExecutor.java:1167
java.util.concurrent.ThreadPoolExecutor$Worker.run ThreadPoolExecutor.java:641
java.lang.Thread.run Thread.java:919
但是我怎么能看懂这里写的是什么?应该有反向转换。
如有任何帮助,我将不胜感激!
要首先获得可读代码,您必须确保始终保留 映射文件 的副本,每个构建都生成 minifyEnabled 设置为真。请注意,每次构建时都会覆盖映射文件,因此必须在构建后立即获取它们,否则映射将不再对应于您的目标二进制文件。
映射文件生成于:
<your-module-name>/build/outputs/mapping/<build-type>/
然后您可以使用 ReTrace 工具位于:
<your-android-sdk-location>\tools\proguard\lib\proguardgui.jar
ReTrace 屏幕截图,(该工具适用于 proguard 和 R8):
要直接在 android 的开发人员控制台中查看任何未混淆的崩溃堆栈跟踪,完成发布新版本后,请转到 “App Bundle Explorer” 部分,select "下载",并上传相应的映射文件。见截图:
• 奖金
下一个 gradle 脚本会将映射文件复制到与输出版本相同的位置,因此您无需在每次发布时都浏览它们:
task copyMappings() {
android.applicationVariants.all { variant ->
variant.outputs.all { output ->
variant.getAssembleProvider().configure() {
it.doLast {
if (variant.getBuildType().isMinifyEnabled()) {
def mappingProvider = variant.getMappingFileProvider()
if (mappingProvider != null) {
def files = mappingProvider.get().files
if (!files.isEmpty()) {
def mappingFile = files.iterator().next()
if (mappingFile != null && mappingFile.exists()) {
copy {
from mappingFile
into variant.getPackageApplicationProvider().get().outputDirectory
}
}
}
}
}
}
}
}
}
}