可能重複的字符串:
Removing unused strings during ProGuard optimisation使用ProGuard刪除記錄不會被刪除記錄
我有幾十個記錄語句的Android應用程序。我寧願他們將不會出現在發行版本,所以我用Proguard的像這樣的東西在proguard.cfg
文件:
-assumenosideeffects class android.util.Log {
public static *** d(...);
}
但問題是,有很多的Log.d("something is " + something)
,雖然Log.d()
語句正在從字節碼中刪除,字符串仍然存在。
所以,以下this答案,我創建了一個簡單的包裝類,沿着線的東西:
public class MyLogger {
public static void d(Object... msgs) {
StringBuilder log = new StringBuilder();
for(Object msg : msgs) {
log.append(msg.toString());
}
Log.d(TAG, log.toString());
}
}
然後我編輯proguard.cfg
:
-assumenosideeffects class my.package.MyLogger {
public static *** d(...);
}
但字符串仍然被找到在生成的字節碼中!
除此之外,我使用Android SDK提供的標準proguard.cfg
。難道我做錯了什麼?
編輯:檢查生成的字節碼之後,我看到了弦在那裏,但他們沒有被追加另一個人,因爲我以爲。他們正在存儲在一個陣列。爲什麼?將它們作爲可變參數傳遞給我的方法。它看起來像ProGuard的不喜歡,所以我修改了我的記錄器類是這樣的:
public static void d(Object a) {
log(a);
}
public static void d(Object a, Object b) {
log(a, b);
}
(... I had to put like seven d() methods ...)
private static void log(Object... msgs) {
(same as before)
}
這是醜陋的,但現在的字符串是無處字節碼。
這是ProGuard的某種bug /限制嗎?還是隻是我不理解它是如何工作的?
你可能想避免proguard黑客,只是使用一個常量:http://stackoverflow.com/questions/4199563/android-util-log-when-publishing-what-can-i-do-not-do如果然後你使用一個常量proguard會在它==假時刪除代碼行。 – Blundell
的確,這是一個黑客攻擊,也是一個醜陋的攻擊,但我認爲這比將if(DEBUG)放在任何地方都好。生成的代碼更清晰,結果在導出的應用程序中是相同的。另外,出於某種原因,如果調試常量是錯誤的,Eclipse會對死代碼抱怨,我不喜歡這樣。感謝您的想法,但:) –
請注意,如果您傳遞基本數據類型,可能仍然有一些死代碼。 Proguard不會將基本數據類型移除到相應的「對象」轉換。例如。如果你傳遞一個'int',Proguard將會在'Integer.valueOf(someVar)'行中離開;' – crazymaik