2011-04-05 111 views
46

關閉釋放的應用市場之前關閉我自己應用程序的logcat的輸出很簡單。我也知道如何通過標記和/或ID選擇性地過濾LogCat消息以實現我自己的調試便利。在發佈Android應用程序中完全禁用LogCat輸出?

但現在我感興趣的東西,可能會更加困難(甚至不可能):禁用所有的logcat輸出,包括&尤其是來自像TtsService,GoogleLoginService等第三方服務來

是這可能嗎?

爲了進一步闡明:我是而不是有興趣爲我自己過濾掉郵件。我非常有興趣爲從Android Market下載我的應用的任何人禁用第三方消息。這可能嗎?

+2

所以,你要阻止*在用戶的設備上*任何應用程序從編寫logcat的輸出? – eldarerathis 2011-04-05 14:07:24

+1

您的意思是您包含(或使用)來自應用程序的第三方庫的日誌消息嗎? – rajath 2011-04-05 14:11:28

+0

@eldarerathis不,我想,以防止直接或間接地被**使用我的應用程序**任何應用程序,從寫logcat的輸出。對不起,不夠清楚。 – 2011-04-05 14:21:40

回答

177

您可以使用ProGuard徹底刪除其中一個返回值不使用,告訴ProGuard的假設不會有問題的行。

以下proguard.cfg塊指示刪除Log.d,Log.v和Log.i調用。

-assumenosideeffects class android.util.Log { 
    public static *** d(...); 
    public static *** w(...); 
    public static *** v(...); 
    public static *** i(...); 
} 

最終的結果是,這些日誌行不在您發佈的APK,並因此與任何logcat中用戶不會看到d/V/I日誌。

+1

這個技巧是不可思議的。它已經值得+1。在確定它確實在我的應用中產生了期望的結果後,我會接受答案。謝謝! – 2011-04-05 14:25:40

+2

ProGuard真的很強大!您也可以使用此提示刪除其他形式的開發代碼,而不僅僅是日誌記錄。 – 2011-04-05 14:35:21

+0

在我們想要刪除代碼的其他場景中?什麼形式? – rajath 2011-04-05 14:48:06

10

,如果你不使用proguard的,你必須管理的登錄自己和清單文件使dubuggable假

<application 
    android:name="MyApplication" 
    android:icon="@drawable/gift" 
    android:label="@string/app_name" android:debuggable="@bool/build_log"> 

這裏我的自定義日誌

public class Lol { 

    public static final boolean ENABLE_LOG = true & MyApplication.sDebug; 

    private static final boolean DEBUG = true & ENABLE_LOG; 

    private static final boolean VERBOSE = true & ENABLE_LOG; 

    private static final boolean TEMP = true & ENABLE_LOG; 

    private static final boolean WARNING = true & ENABLE_LOG; 

    private static final boolean INFO = true & ENABLE_LOG; 

    private static final boolean ERROR = true & ENABLE_LOG; 

    public static void obvious(String tag, String msg) { 
     if (DEBUG) { 
      msg = "*********************************\n" + msg 
        + "\n*********************************"; 
      Log.d(tag, msg); 
     } 
    } 

    public static void d(String tag, String msg) { 
     if (DEBUG) 
      Log.d(tag, msg); 
    } 

    public static void d(boolean bool, String tag, String msg) { 
     if (TEMP&bool) 
      Log.d(tag, msg); 
    } 

    public static void i(String tag, String msg) { 
     if (INFO) 
      Log.i(tag, msg); 
    } 

    public static void e(String tag, String msg) { 
     if (ERROR) 
      Log.e(tag, msg); 
    } 

    public static void e(boolean bool, String tag, String msg) { 
     if (TEMP&bool) 
      Log.e(tag, msg); 
    } 

    public static void v(String tag, String msg) { 
     if (VERBOSE) 
      Log.v(tag, msg); 
    } 

    public static void w(String tag, String msg) { 
     if (WARNING) 
      Log.w(tag, msg); 
    } 

    public static String getStackTraceString(Exception e) { 
     return Log.getStackTraceString(e); 
    } 

    public static void w(String tag, String msg, Exception e) { 
     if (WARNING) 
      Log.w(tag, msg,e); 
    } 
} 
+8

由於[SDK Tools 8](http:///developer.android.com/sdk/tools-notes.html)它沒有必要手動設置android:debuggable標誌。這消除了發佈可調試版本的風險。 – 2012-04-18 10:44:21

+0

感謝您的信息。 – 2012-04-18 21:19:52

+22

+1爲Lol類名 – akhyar 2014-02-07 11:09:11

0

偉大的答案提供的類通過David Caunt似乎不適用於proguard-android-optimize.txt中定義的規則。

而不是使用通配符***的,ProGuard的當前版本似乎期望返回參數的類型修飾符:

-assumenosideeffects class android.util.Log { 
    public static int d(...); 
    public static int w(...); 
    public static int v(...); 
    public static int i(...); 
    public static int wtf(...); 
} 
0

你可以把調試的假上buildTypes釋放。

buildTypes { 

    release { 
     debuggable false 
     ... 
    } 

} 
0

在應用的build.gradle文件集:

release { 
    minifyEnabled true 
    …… 
} 

在proguard-rules.pro地說:

-assumenosideeffects class android.util.Log { 
    public static *** v(...); 
    public static *** d(...); 
    public static *** i(...); 
    public static *** w(...); 
    public static *** e(...); 
} 
-ignorewarnings 

它爲我工作。

相關問題