一:前言
某家检查结构检测出APP里面存在日志泄漏,即有Log或者System.out,被定为了高危风险,可能会被查,无奈只能积极响应xx号召,想办法处理掉日志。
二:检测方式
检测机构反编译了APP,在smali文件里面搜索“Landroid/util/Log;->”或者“Ljava/lang/System;->out:Ljava/io/PrintStream”或者“Ljava/lang/System;->err:Ljava/io/PrintStream”字符串,有则说明存在日志泄漏。 上述属于静态检测,动态检测一般是APP跑起来后看看有没有log打印。
三:方案分析
不管是哪一种检测,处理自己项目里面的日志还是比较好弄的,大不了删除代码,但是第三方SDK里面没法弄,一个个去找第三方SDK提供商修改代码也很麻烦,还不一定能完全处理掉,所以需要另想办法一次性处理掉所有的Log。
第一种:使用proguard规则(较简单)
第二种:使用gradle,插入任务来过滤(较复杂)
四:使用proguard规则过滤日志
- 混淆文件里面添加
# 去除log
-assumenosideeffects class android.util.Log {
public static *** d(...);
public static *** v(...);
public static *** i(...);
public static *** e(...);
public static *** w(...);
}
# 去除System.out.println();
-assumenosideeffects class java.io.PrintStream {
public void println(...);
}
- 去掉-dontoptimize,否则上面配置不会生效
五:注意事项
- -dontoptimize一定要全部清除,可以全局搜索下该关键字去除,然后依次点开aar,检查下里面的混淆文件。最后检查下build.gradle proguardFiles getDefaultProguardFile(),看看是不是用的proguard-android.txt,如果是的话替换成proguard-android-optimize.txt,因为它里面也有这个参数。可以去build/intermediates/proguard-files里面找到这两个文件。
六:验证
随便打印几个日志,开启混淆minifyEnable true,看看有没有日志打印就可以了。