【问题标题】:proguard bug? removing logs预防错误?删除日志
【发布时间】:2015-10-18 20:43:53
【问题描述】:

我的proguard配置

-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** w(...);
    public static *** v(...);
    public static *** i(...);
    public static *** e(...);
}

proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

它确实删除了大部分日志。但是对于某些日志,它会产生奇怪的输出,如下所示。如您所见,Log.d 已被一些冗余代码取代。

public void MyFunction(int param1, String param2) {
    Log.d(TAG, "MyFunction: " + param1 + " : " + param2);

    ...some code...
}

这被转化为

public final void a(int paramInt, String paramString)
{
new StringBuilder("MyFunction: ").append(paramInt).append(" : ").append(paramString);

... some code ...
}

}

知道出了什么问题以及如何解决这个问题吗?

谢谢

【问题讨论】:

    标签: android logging proguard


    【解决方案1】:

    这不是错误。您是在告诉 proguard 删除 Log.d/w/v/i/e 方法调用,而不是整行。据我所知,这是你能得到的最好的。 顺便说一句,new StringBuilder("MyFunction: ")... 行是对你的类的字节码进行逆向工程的结果,这很好。

    我想举例说明为什么 proguard 只删除方法调用而不是整行。看看这个sn-p:

    int sum = 0;
    int a = 10;
    int b = 10;
    assert a > 0;
    assert b > 0;
    Log.d("TAG", "The value of a+b is " + (sum=a+b));
    // the sum of two positive number is a positive number
    assert sum > 0;
    

    如果 proguard 删除 Log.d 行会发生什么?

    【讨论】:

    • 我不认为这很好。我要求它删除该行,但不要用一些冗余代码替换。确实有限制。
    • 您正在删除方法的调用,而不是您在该方法中使用的参数。你不能删除它们!我可以建议你使用木材吗?这是一个小型的日志库,可能会有更好的结果。
    猜你喜欢
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多