2016-11-04 2 views
1

나는 안드로이드 스튜디오 2.2.2 gradle을 사용하고 있습니다. 이 방법으로 build.gradle에서 Proguard를 사용하고 있습니다. Proguard를 사용하여 로그인 인쇄를 방지하는 방법 릴리스 빌드에서 안드로이드

-keepattributes EnclosingMethod 

-dontwarn okio.** 
-dontwarn retrofit2.Platform$Java8 
-dontwarn sun.misc.Unsafe 
-dontwarn  org.w3c.dom.bootstrap.DOMImplementatio Registry 

-keep class * extends android. 

-assumenosideeffects class android.util.Log { *; } 

-assumenosideeffects class     java.io.PrintStream { 
public void println(...); 
public void print(...); 
} 

지금 내 MainActivity.java에 내가 oncreate--

int i=0; 
Log.d(TAG,"i val:"+i++); 
Toast i value 

그리고 출력 항상 "나는 발에 뭔가를 확인 여기

buildTypes { 

    release { 

     // Enable ProGuard 
     minifyEnabled true 
     shrinkResources true 
     // Common release options 
     zipAlignEnabled true 
     debuggable false 
     jniDebuggable false 

     // Notice that the default ProGuard file (SDK-provided) also enables optimization 
     // Here we also include a third file which disables the logging (see below) 
     proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 


    } 

    debug { 
     // We enable ProGuard also for debug builds 
     minifyEnabled true 

     // Notice that the default ProGuard file (SDK-provided) differs from the release one 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
    } 
} 

그리고 내 난독 화는 ... : 1". 이제 내 질문은 로그 라인이 실행되는 이유는 무엇입니까?

답변

2

로그 라인 또는 system.out은 콘솔 (전화 로그 파일) 에서 인쇄하는 방법입니다. 릴리스 빌드에서 로그를 차단하려는 경우 다음 단계를 따라 실행하십시오.

이 같은 클래스 만들기 : 변수

이제
public class LogTag { 
    public static void d(String msg){ 
    if (ApplicationClass.isDebug){ 
     Log.d("log_tag", msg); 
    } 
    } 

    public static void v(String msg){ 
    if (ApplicationClass.isDebug){ 
     Log.v("log_tag", msg); 
    } 
    } 
    public static void e(String msg,Exception e){ 
    if (ApplicationClass.isDebug){ 
     Log.e("log_tag", msg, e); 
    } 
    } 
    public static void e(String msg){ 
    if (ApplicationClass.isDebug){ 
     Log.e("log_tag", msg); 
    } 
    } 
} 

응용 프로그램의 클래스 초기화 isDebug를

public static boolean isDebug = BuildConfig.DEBUG; 
Log.d("TAG", "TAG"); 
    int i = 0 + 1; 
    Log.d("TAG", "i val:" + 0); 
    System.out.println("i:" + i); 
:다음

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

당신이 당신이해야합니다 코드 인 APK를 컴파일하는 경우의 깊은에서 살펴 보자 난독이 줄을 추가 다른 사람이

LogTag.d('message...'); 

같은 로그를 인쇄

원래

Log.d("TAG","TAG"); 
    int i=0; 
    Log.d("TAG","i val:"+i++); 
    System.out.println("i:"+i); 
그래서 0

우리가하자 또 다른 예를 디 컴파일 코드했다

Log.d을 최적화하고 제거하는대로 컴파일러가 변경됩니다 볼 수 있습니다 :

int index = 0; 
    while (index < 10) { 
     int i2 = i + 1; 
     Log.d("TAG", "i val:" + i); 
     index++; 
     i = i2; 
    } 
    System.out.println("i:" + i); 

원래 코드 :

for(int index = 0;index<10;index++){ 
     Log.d("TAG","i val:"+i++); 
    } 
    System.out.println("i:"+i); 
+0

I을 이것을 사용하고 싶지 않으므로 Proguard를 사용하여이 작업을 수행합니다. – Subho

+0

대체하십시오 -assumenosideeffects class android.util.Log {*; } to this -assumenosideeffects class android.util.Log { public static *** d (...); public static *** w (...); public static *** v (...); public static *** i (...); } –

+0

이와 같은 작업을 수행하려는 경우 Jake Warthon의 Timber를 사용하는 것이 좋습니다. https://github.com/JakeWharton/timber 그것은 문자 그대로 하나의 클래스이며 이미 Crashlytics 또는 릴리스와 유사하게 로그인 할 수 있도록 허용합니다. –

관련 문제