2015-07-28 183 views
1

我ProGuard的配置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 ... 
} 

}

任何想法是错的,如何解决这个问题?

谢谢

回答

1

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

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

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行会发生什么?

+0

我不认为这很好。我要求它删除该行,但不能用一些冗余代码替换。确实是限制。 – yumoji

+0

您正在移除方法的调用,而不是您在该方法内使用的参数。而且你不能删除它们!我可以建议你使用木材吗?这是一个小型日志记录库,可能会有更好的结果。 –