我创建了一个包装类MyLog
来为我的 Android 应用程序进行日志记录,它本质上只是包装了android.util.Log
. 我希望日志记录在我的发布应用程序中完全消失。我的 proguard 文件中定义了以下规则:
-assumenosideeffects class com.myapp.logging.MyLog {
public static void d(...);
}
我看到具有如下日志语句的行:
MyLog.d("Logging a boolean %b and a string %s parameter", isTrue, stringName);
正在缩小到:
Object[] objArr = new Object[]{Boolean.valueOf(z), str};
和带有日志语句的行如下:
MyLog.d("function call result: " + foo() + " end");
缩小为:
new Object[1][0] = foo();
在这两种情况下,混淆的剩余部分都非常无用,也应该被删除。
问题:
- 为什么 proguard 会在上面的示例 #1 中留下未使用的变量?
- 有没有更好的方法来告诉proguard - “当你删除这个方法声明和任何对它的调用,以及传递给它的参数时,假设没有副作用”?
我已阅读与该主题相关的其他答案,最接近的答案在这里。我不是在寻找具有 BuildConfig.IS_LOGGING_ENABLED 类型解决方案的解决方案,其中每个日志语句都应该使用此检查进行包装。