2011-04-05 2 views
46

내 앱을 시장에 출시하기 전에 내 앱인 LogCat 출력을 종료하는 것은 간단합니다. 나는 또한 자신의 디버그 편의를 위해 LogCat 메시지를 태그 및/또는 ID별로 선택적으로 필터링하는 방법을 알고있다.Android 앱에서 LogCat 출력을 완전히 사용 중지 하시겠습니까?

는하지만 지금은 훨씬 더 어려울 수 있습니다 뭔가에 관심이 있어요 (아마도 불가능?) : 모든 로그 캣 출력을 비활성화 특히 등 TtsService, GoogleLoginService 같은 제 3 자 서비스에서 오는 그

을 &을인가 포함 이게 가능해?

더 자세히 설명하려면 다음을 수행하십시오. 아니요, 자신을위한 메시지 필터링에 관심이 있습니다. Android 마켓에서 내 앱을 다운로드 한 사용자를 위해 제 3 자 메시지를 사용 중지하는 데 관심이 있습니다. 이것이 가능한가?

+2

그래서 사용자 장치의 모든 앱 *이 LogCat 출력을 쓰지 못하게 하시겠습니까? – eldarerathis

+1

앱에서 포함하거나 (또는 ​​사용하는) 타사 라이브러리의 로그 메시지를 의미합니까? – rajath

+0

@eldarerathis 아니요, 직접 또는 간접적으로 ** 내 앱 **에서 LogCat 출력을 작성하는 데 사용되는 앱을 차단하고 싶습니다. 죄송 합니다만 충분히 명확하지 않습니다. –

답변

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에없는, 따라서 로그 캣을 가진 사용자는 D/V/I 로그를 볼 것입니다. 당신이 난독 화를 사용하지 않는 경우

+1

이 팁은 믿을 수 없습니다. 이미 +1이 필요합니다. 내 애플 리케이션에서 실제로 원하는 결과를 얻을 수 있는지 확인한 후 대답을 수락합니다. 고맙습니다! –

+2

ProGuard는 정말 강력합니다! 이 팁을 사용하여 로깅뿐만 아니라 다른 형태의 개발 코드를 제거 할 수도 있습니다. –

+0

다른 어떤 시나리오에서 코드를 제거 할 수 있습니까? 그리고 어떤 형태입니까? – rajath

10

, 당신은 자신을 기록 관리해야하고 매니페스트 파일에 큰 대답이 제공

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 도구 8] (http : /developer.android.com/sdk/tools-notes.html) android : debuggable 플래그를 수동으로 설정할 필요가 없습니다. 이렇게하면 디버깅 가능한 릴리스를 선적 할 위험이 없습니다. –

+0

정보 주셔서 감사합니다. –

+22

Lol 클래스 이름 +1 +1 – akhyar

0

dubuggable 거짓 여기

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

내 사용자 지정 로그 클래스 만들기 David Caunt에 의해 proguard-android-optimize.txt에 정의 된 규칙에 대해 작동하지 않는 것 같습니다.

-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 자료에 디버깅 거짓 넣을 수 있습니다 대신 와일드 카드 ***를 사용

은 ProGuard에서의 현재 버전은 반환 매개 변수의 타입 한정자가 기대하는 것 같다. 응용 프로그램 build.gradle 파일 세트에서

buildTypes { 

    release { 
     debuggable false 
     ... 
    } 

} 
0

:

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 

그것은 나를 위해 일했습니다.

관련 문제