Android中可以通过混淆减少apk的大小,提高apk反编译的难度。
但是在混淆过后会遇到一个问题,就是日志,比如说错误日志的函数会变成abcd.
怎么解决这个问题呢
通过mapping文件
mapping文件是混淆后的代码跟正常代码的一个映射文件
通过这个文件可以把混淆后的代码转换成正常的代码展示
mapping文件在minifyEnabled 为false的时候,是不会产生的。当我们设置了minifyEnabled 为true,也就是开启混淆之后,默认是会在app下的build/outpus/mapping文件夹中产生一个mapping.txt文件
也可以通过在app下的proguard-rules.pro 文件中加入 -printmapping mapping.txt
就会在app下面输出一个mapping.txt文件
可以通过在混淆文件中加入
#保留源文件名称以及行号
-keepattributes SourceFile,LineNumberTable
#保留自定义异常
-keep public class * extends java.lang.Exception
来保留文件名跟行号
接下来就是解决方案
方案1
比如说我们把错误日志上传到了bugly或者firebase这种第三方平台。
我们可以通过上传mapping文件,比如bugly中,
如果是firebase,在开启混淆后,会报一个错
Execution failed for task ‘:app:uploadCrashlyticsMappingFileDebug’
Connection timed out: connect. If you are behind an HTTP proxy, please configure the proxy settings either in IDE or Gradle.
这是因为firebase自动上传mapping的时候,因为国外网络原因,无法自动上传
需要设置
debug {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.xxx//指定签名文件签名
// 设置是否要自动上传
firebaseCrashlytics {
mappingFileUploadEnabled true
}
}
但是这样的话,就不能上传mapping文件了,这个可能需要解决这个网络问题了
方案二
1.cmd进入sdk/tools/proguard/bin目录
2.将混淆后的日志cache_file_name.txt和上文提到的mapping文件放入此目录中。
3.执行命令:retrace.bat mapping.txt cache_file_name.txt
通过sdk中的工具,用命令的方式输出原日志。cache_file_name.txt这个文件可以自己随意定义,只需要把错误日志复制到里面就行了
方案三
还可以通过gui图形界面的方式输出
还是进入到 sdk/tools/proguard/bin目录
使用proguard.bat