Android去除Log日志代码

1,300 阅读1分钟

一:前言

某家检查结构检测出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规则过滤日志

  1. 混淆文件里面添加
# 去除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(...); 
} 
  1. 去掉-dontoptimize,否则上面配置不会生效

五:注意事项

  1. -dontoptimize一定要全部清除,可以全局搜索下该关键字去除,然后依次点开aar,检查下里面的混淆文件。最后检查下build.gradle proguardFiles getDefaultProguardFile(),看看是不是用的proguard-android.txt,如果是的话替换成proguard-android-optimize.txt,因为它里面也有这个参数。可以去build/intermediates/proguard-files里面找到这两个文件。

六:验证

随便打印几个日志,开启混淆minifyEnable true,看看有没有日志打印就可以了。