2012-12-10 36 views
1

當我們在下面這段代碼的運行proguard的應該刪除日誌statment:Proguard的左側額

Log.d(TAG, "field= "+field+「 : enhancedfield=」+enhancedfield); 

但是...... 編譯之後,您將看到:

Log.d(TAG, new StringBuilder().append("Field= ").append(field) 
    .append(「 : enhancedfield=」).append(enhancedfield).toString()); 

現在當我們運行這個proguard時,你會得到一些剩菜:

new StringBuilder().append("Field= ").append(field) 
    .append(「 : enhancedfield=」).append(enhancedfield).toString(); 

這泄漏信息pottential黑客...

我能做些什麼: 聲明一個final static boolean,只有當值爲true時纔會記錄。由於可以在編譯時確定此值,因此當值爲false時,將不會包含日誌記錄代碼。但是這會影響我的代碼,所以我對此並不滿意。

現在我的問題: 我該如何改善這種行爲?留下少量剩菜和泄漏較少的信息?

回答

0

日誌字符串在混淆中始終是一個問題,它們不能被混淆,只能將它們移動到單獨的類中,這並沒有什麼幫助。

該字符串的加密將更安全。 在我們的實踐中,我們並不在乎,在非常特殊的算法中,這是知道的核心,一旦知道這些方法沒有錯誤地工作,就可以刪除所有日誌。

使用靜態最終布爾isDebug的缺點是您無法啓用日誌記錄,您必須重新生成並安裝調試版本。

是否與statcic最終DBG解決方案=假

if (dbg) Log.d("unwanted debug log"); 

真的polute你的代碼?

2

你可以阻止編譯迫使語句是獨立於使用StringBuilder:

Log.d(TAG, "field:"); 
Log.d(TAG, field); 
Log.d(TAG, "enhancedfield:"); 
Log.d(TAG, enhancedfield); 

這當然對日誌的結果(4線,而不是1)的影響和代碼不太可維護。