Proguard 不会删除内部类中的 Log.d?

Posted

技术标签:

【中文标题】Proguard 不会删除内部类中的 Log.d?【英文标题】:Proguard does not remove Log.d in internal classes? 【发布时间】:2015-03-27 01:46:20 【问题描述】:

我用

-assumenosideeffects class android.util.Log 
    public static boolean isLoggable(java.lang.String, int);
    public static int v(...);
    public static int i(...);
    public static int w(...);
    public static int d(...);
    public static int e(...);
    public static java.lang.String getStackTraceString(java.lang.Throwable);

但是,当我反编译时,我看到了我在反编译的 jar 文件的 Log.d 行中使用的唯一一个自定义字符串。这怎么可能? Proguard 不会完全删除 Log.d 行吗?

【问题讨论】:

【参考方案1】:

如果启用了 proguard 优化,这是相关的,即你的 proguard.config 是这样的

proguard.config=$sdk.dir/tools/proguard/proguard-android-optimize.txt:proguard-project.txt

【讨论】:

我的 proguard.config 行就是这样。背后的原因是什么?我怎样才能在使用优化的同时删除 Log.d 行中的字符串?【参考方案2】:

为了澄清,我的理解是“必须”启用优化才能剥离日志调用。

您可以尝试使用日志包装类(like this one) 来包装android.util.Log。我之所以使用这种方法,是因为 Eric(又名 Proguard 先生)在此 answer 中关于 Proguard 如何检查代码的说明。所以这最终会以更简单的方式调用Log.d(tag, string) 而不是Log.d(tag, string + value+ String)

或者使用 DexGuard IIRC 具有一些明确的日志删除功能。 -- [更新: 抱歉,这不是一个显式函数 DexGuard 使用与您提到的相同的配置。我想我在想反编译的代码更容易被 DexGuard 破坏。]

【讨论】:

那么,根据您共享的包装类,当我使用QLog.d('myclass','my string ->'+myvalue); 并配置 Proguard 以删除这些行时,'my string ->' 不可见吗?不一样吗?逻辑是什么? (我有 DexGuard,但我不知道这个特殊功能:|) 嗯,如果“我的字符串 ->”仍然可见,我需要通过反转我的一个应用程序来仔细检查。我误读了你的主要目标,我以为你试图阻止 ProGuarded 应用程序记录。 我在我的应用程序运行时检查了 LogCat,但没有输出(正确)。但是ProGuard(DexGuard)并没有以某种方式触及该字符串..(我在反编译dex文件时看到了)

以上是关于Proguard 不会删除内部类中的 Log.d?的主要内容,如果未能解决你的问题,请参考以下文章

Proguard 不会删除某些类

启用 proguard 后无法访问 kotlin 类中使用的伴随对象

使用 ProGuard 删除日志不会删除正在记录的字符串 [重复]

Proguard 不会保留班级成员的枚举

如何在Android Studio中进行发布版本时删除System.out println()?

启用 Proguard 后无法实例化片段