2015-07-28 174 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

您正在移除方法的調用,而不是您在該方法內使用的參數。而且你不能刪除它們!我可以建議你使用木材嗎?這是一個小型日誌記錄庫,可能會有更好的結果。 –