我有一個使用了大量的Log.d()
或Log.e()
呼籲調試的應用程序。現在我想創建我的最終版本來發布。 Eclipse中的Android導出功能提到刪除清單中的"Debuggable"
標誌,我已經完成。我是否還應該評論所有Log
調用以改進我的應用程序的性能,或者這些調用在非可調試最終版本包中不會執行任何操作?創建我的最終包時,我應該評論我的日誌調用嗎?
21
A
回答
18
我有子類Log類到一個名爲Trace類,這反映在日誌的方法。所以我做了Trace.d(TAG,「blah」),然後在Trace.d方法中,代碼僅基於一個名爲LOGGING_LEVEL的靜態最終類變量執行,該變量的級別爲1-5(無,錯誤,錯誤&警告,錯誤&警告&信息和一切包括調試)。製作生產APK時,Proguard將刪除應用程序中未使用的所有代碼,因此它適用於我。
對於我來說,日誌記錄太重要了,不能從源代碼中刪除,但爲了性能,安全和知識產權的原因,日誌必須從生產應用程序中刪除。
這種結構可以讓我多了很多記錄添加到應用程序,這使得調試問題要容易得多,但任何對生產沒有任何影響APK
public class Trace
{
public static final int NONE = 0;
public static final int ERRORS_ONLY = 1;
public static final int ERRORS_WARNINGS = 2;
public static final int ERRORS_WARNINGS_INFO = 3;
public static final int ERRORS_WARNINGS_INFO_DEBUG = 4;
private static final int LOGGING_LEVEL = ERRORS_ONLY; // Errors + warnings + info + debug (default)
public static void e(String tag, String msg)
{
if (LOGGING_LEVEL >=1) Log.e(tag,msg);
}
public static void e(String tag, String msg, Exception e)
{
if (LOGGING_LEVEL >=1) Log.e(tag,msg,e);
}
public static void w(String tag, String msg)
{
if (LOGGING_LEVEL >=2) Log.w(tag, msg);
}
public static void i(String tag, String msg)
{
if (LOGGING_LEVEL >=3) Log.i(tag,msg);
}
public static void d(String tag, String msg)
{
if (LOGGING_LEVEL >=4) Log.d(tag, msg);
}
}
4
從developer.android.com:
關閉日誌記錄和調試和清理數據/文件發佈,你 應該確保調試設備 被關閉,並且調試和 其他不必要數據/文件是 從您的應用程序項目中刪除。
從清單的 元素中刪除android:debuggable =「true」 屬性。從應用程序 項目日誌 文件,備份文件,以及其他 不必要的文件。檢查私有數據或 專有數據,並將其作爲 刪除。停用對源代碼中Log 方法的任何調用。
8
這讓我檢查我的假設log.d
行代碼就有點不上籤署發佈的apk沒有在清單中設置調試的標誌出現,我錯了,他們仍然出現。
上SO快速搜索導致我接受了這個問題的答案: Remove all debug logging calls before publishing: are there tools to do this?
它工作得很好,你不用改變任何代碼。
2
我會刪除下面的日誌記錄代碼:
-assumenosideeffects class android.util.Log {
public static boolean isLoggable(java.lang.String, int);
public static int v(...);
public static int i(...);
public static int w(...);
public static int d(...);
public static int e(...);
public static java.lang.String getStackTraceString(java.lang.Throwable);
}
-assumenosideeffects class java.lang.Exception {
public void printStackTrace();
}
-assumenosideeffects class * implements org.slf4j.Logger {
public void trace(...);
public void debug(...);
public void info(...);
public void warn(...);
public void error(...);
public boolean isTraceEnabled(...);
public boolean isDebugEnabled(...);
public boolean isInfoEnabled(...);
public boolean isWarnEnabled(...);
public boolean isErrorEnabled(...);
}
如果需要,可以保留錯誤和警告類別。但是請確保爲構建啓用了優化和縮小功能,然後代碼刪除才生效
相關問題
- 1. 我應該評論我的測試嗎?
- 2. 我應該在調用方法時發表評論嗎?
- 3. 我應該刪除日誌到我的最終版本項目嗎?
- 4. 顯示最終用戶的訪問權限..我應該嗎?我不應該嗎?
- 5. 我應該使用Redux創建我的ReactNative應用程序嗎?
- 6. 我應該評論Java中的@Override方法嗎?
- 7. PHP我應該寫評論/文檔
- 8. 我應該如何存儲評論?
- 9. 我應該如何評論python代碼?
- 10. 我應該在EDT中創建的線程中調用InvokeLater嗎?
- 11. 我的評論用完評論箱
- 12. 我應該如何創建我的GUID?
- 13. 我應該使用readonly標誌嗎?
- 14. 我應該創建子類NSManagedObject嗎?
- 15. 我應該創建此訪問器嗎?
- 16. 我應該爲此創建索引嗎?
- 17. 我應該創建一個新表嗎?
- 18. 我應該爲模塊創建DLL嗎?
- 19. 我應該創建另一個表嗎?
- 20. 在我發佈的評論請求中,我想更新包含用戶標識和評論的評論值
- 21. 我應該*真的*調用DataBind()嗎?
- 22. 我應該發佈我創建的NSThread嗎?
- 23. 我應該在iOS中創建我的ivars屬性嗎?
- 24. 如果窗口創建失敗,我應該調用SDL_DestroyWindow嗎?
- 25. 在我的評論應用程序,當我刷新頁面評論消失
- 26. Android應用程序:我如何創建評論欄?
- 27. 我可以評論Facebook的風格嗎?
- 28. 評論會影響我的表評論
- 29. 評論我的Python軟件包結構
- 30. 代碼評論 - 我創建Rube Goldberg機器嗎?
我不會那麼嚴格地刪除所有日誌記錄,但可以確定地調試日誌記錄。 – 2011-02-10 15:37:58
我已經看到了有關android dev網站的信息,但是我不清楚是否有一種機制可以「關閉日誌記錄」而不是評論所有內容。另外,當他們說「停用對源代碼中的Log方法的任何調用」時,它們是否意味着「評論」或者是否有其他方式尚不清楚。 – jmbouffard 2011-02-10 16:10:44
我不知道僞君子寫了什麼? Android日誌98%充滿了來自股票android應用程序和服務的消息。也許他們的意思是「禁用所有的日誌記錄,這樣當我們想找到我們的日誌消息時它不會混亂日誌。」 – 2011-02-10 16:16:54