【问题标题】:Proguard does not remove Log.d in internal classes?Proguard 不会删除内部类中的 Log.d?
【发布时间】: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 行吗?

【问题讨论】:

    标签: java android proguard dexguard


    【解决方案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文件时看到了)
    猜你喜欢
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多