我有日誌記錄靜態方法的類,如:刪除日誌要求使用ProGuard留下StringBuilders
我試圖刪除所有這些使用ProGuard。我不想僅僅禁用它們(反正用邏輯來完成),我希望它們在反編譯時消失。
它正在成功刪除對我的日誌記錄方法的調用,但留下了連接的字符串。它完全刪除了已修復的字符串。
這是我的ProGuard設置:
-assumenosideeffects class com.mypackage.Log { *; }
這是我的源:
void doSomething(String name) {
Log.verbose("Hello!");
Log.verbose("My name is " + name);
...
}
這是它反編譯到:
void a(String a) {
new StringBuilder("My name is ").append(a);
...
}
這就是我希望它反編譯爲:
void a(String a) {
...
}
對於此示例,假定名稱參數稍後在方法中使用(即不應完全優化)。
我還應該使用assumenosideeffects
作爲StringBuilder嗎?我在其他地方使用了StringBuilders,我確實想保留它。那也會在那裏把他們刪除嗎?
您使用的是哪種日誌記錄框架?用log4j你可以寫Log.verbose(「我的名字是#0」,名字);而不是Log.verbose(「我的名字是」+ name);只有在必要時纔會發生串聯,即如果loglevel> = verbose。 – StephaneM
[在ProGuard優化期間刪除未使用的字符串]可能的副本(http://stackoverflow.com/questions/6009078/removing-unused-strings-during-proguard-optimisation) – sschuberth