1

我创建了一个包装类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();

在这两种情况下,混淆的剩余部分都非常无用,也应该被删除。

问题:

  1. 为什么 proguard 会在上面的示例 #1 中留下未使用的变量?
  2. 有没有更好的方法来告诉proguard - “当你删除这个方法声明和任何对它的调用,以及传递给它的参数时,假设没有副作用”?

我已阅读与该主题相关的其他答案,最接近的答案在这里。我不是在寻找具有 BuildConfig.IS_LOGGING_ENABLED 类型解决方案的解决方案,其中每个日志语句都应该使用此检查进行包装。

4

0 回答 0