2011-02-10 49 views
21

我有一個使用了大量的Log.d()Log.e()呼籲調試的應用程序。現在我想創建我的最終版本來發布。 Eclipse中的Android導出功能提到刪除清單中的"Debuggable"標誌,我已經完成。我是否還應該評論所有Log調用以改進我的應用程序的性能,或者這些調用在非可調試最終版本包中不會執行任何操作?創建我的最終包時,我應該評論我的日誌調用嗎?

回答

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 方法的任何調用。

Source

+2

我不會那麼嚴格地刪除所有日誌記錄,但可以確定地調試日誌記錄。 – 2011-02-10 15:37:58

+0

我已經看到了有關android dev網站的信息,但是我不清楚是否有一種機制可以「關閉日誌記錄」而不是評論所有內容。另外,當他們說「停用對源代碼中的Log方法的任何調用」時,它們是否意味着「評論」或者是否有其他方式尚不清楚。 – jmbouffard 2011-02-10 16:10:44

+16

我不知道僞君子寫了什麼? Android日誌98%充滿了來自股票android應用程序和服務的消息。也許他們的意思是「禁用所有的日誌記錄,這樣當我們想找到我們的日誌消息時它不會混亂日誌。」 – 2011-02-10 16:16:54

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(...); 
} 

如果需要,可以保留錯誤和警告類別。但是請確保爲構建啓用了優化和縮小功能,然後代碼刪除才生效

相關問題