release 时去除 log 大家都知道,一方面是 log 只在开发调试时有用,release 时如果不去除也会影响性能。第二是如果 release 不去除 log 别人逆向分析你的 apk 时会有安全问题。
主要有 2 种方法去除 log
- 通过 BuildConfig
if (BuildConfig.DEBUG) {
Log.d("leslie", "hello world");
}
注意这不是什么条件编译,只是编译器对编译时常量包裹的 dead code 做了代码优化
- 通过 ProGuard 优化掉 Log 代码
首先要让 ProGuard 开启优化选项,默认没有开启优化
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
proguard-android-optimize.txt 里面指定了优化算法
proguard-rules.pro 中加入下面的配置就行了
-assumenosideeffects class android.util.Log {
public static int v(...);
public static int i(...);
public static int w(...);
public static int d(...);
public static int e(...);
}
看到有些人自定义 Log 方法包装 系统 Log 方法,用 BuildConfig.DEBUG 或自定义变量做开关,这样其实并没有真正的删除 Log,不仅每次都多调用了一个空方法,而且别人逆向了你的 apk 后只需要改变一个变量的值所有的 Log 就都能打印了,存在严重的安全问题。 即使你的打印 Log 的代码被编译器优化掉了,我仍然可以逆向后手动加上。
android studio 生成工程默认没有启用 ProGuard 的优化功能, google 是这样说的
# Optimization is turned off by default. Dex does not like code run
# through the ProGuard optimize and preverify steps (and performs some
# of these optimizations on its own).
-dontoptimize
-dontpreverify
所以这里推荐第一种方法在编译时删除 Log 代码,每次写 log 时都加个判断。