2012-02-17 9 views
4

Ant를 사용하여 응용 프로그램을 컴파일 할 때 자세한 Proguard 출력을 볼 수 있으며 로그 명령문 (아래 참조)을 제거하도록 설정했지만 모든 APM 릴리스 로그 문을 실행할 때 거기에 제거하려고했다.Proguard가 로그 호출을 제거하지 않습니다.

두 개의 프로젝트가 각각 공통 프로젝트를 포함하고 있습니다. 2 개의 주요 프로젝트와 공통 프로젝트에는 각각 proguard.cfg 파일이 있으며이 파일에는 모두 로그 문을 제거하는 스 니펫이 들어 있습니다.

내가 누락 된 것이 있습니까?

** 내 모든 로그 문은 Log.d (...)

proguard.cfg

-optimizationpasses 5 
-dontusemixedcaseclassnames 
-dontskipnonpubliclibraryclasses 
-dontpreverify 
-verbose 
-dontobfuscate 
-forceprocessing 
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 

-keep public class * extends android.app.Activity 
-keep public class * extends android.app.Application 
-keep public class * extends android.app.Service 
-keep public class * extends android.content.BroadcastReceiver 
-keep public class * extends android.content.ContentProvider 
-keep public class * extends android.app.backup.BackupAgentHelper 
-keep public class * extends android.preference.Preference 
-keep public class com.android.vending.licensing.ILicensingService 

-keepclasseswithmembernames class * { 
    native <methods>; 
} 

-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet); 
} 

-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet, int); 
} 

-keepclassmembers class * extends android.app.Activity { 
    public void *(android.view.View); 
} 

-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 

-keep class * implements android.os.Parcelable { 
    public static final android.os.Parcelable$Creator *; 
} 

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

걱정 되듯이 두 번 확인되었습니다. Ant 배포판에 대한 Log.d o/p 중 아무 것도 볼 수 없습니다. Logcat o/p를 PID로 필터링하면 dalvik GC_CONCUURRENT 항목이 표시됩니다. – NickT

+0

이 문제가 있습니다. 나는 Proguard 4.4를 실행한다 – ron

답변

0

대신의 삭제 또는 수 프로 가드를 사용하여 로그 메시지의 모든 주석 이런 식으로하십시오.

public class Util{ 

    public static boolean showLogs = true; 
    public static String myTag = 'My Tag'; 

    public static void logD(String message){ 
     if (Util.showLogs)  
      Log.d(myTag, message); 
    } 
} 

하기 전에 기본적으로 안드로이드 로깅 시스템의 래퍼 인 유틸리티 클래스를 만들어 내가 단순히 showLogs = true;를 호출하고 모든 로그 메시지 당신은 쉽게 확장 할 수 있습니다

supressed되어 배포 내 응용 프로그램을 컴파일 클래스를 사용하여 태그를 지정하고 디버깅 메시지 이상을 생성 할 수 있습니다.

+0

나는 여기에 동의해야한다. 동일한 assumenosideeffects 문을 사용하여 내 프로젝트에서 로그 라인을 제거하고 작동합니다 - Ant 릴리스 빌드에서 로그 o/p를 얻지 않습니다. 내 proguard.cfg와 이것 사이의 유일한 차이점은 하나의 프로젝트 만 있고 do not state -dontobfuscate 또는 -forceprocessing입니다. – NickT

+0

@NickT : 귀하가 프로 가드에없는 두 항목을 제거했습니다. cfg 파일이지만 로그 문은 여전히 ​​표시됩니다. 그것은 시험 할 가치가 있었다. – chris

+1

@slayton : Proguard 문서에 따르면'assumenosideeffects'는 클래스 스펙과 일치하는 부작용이없는 것으로 보이는 메소드 호출을 제거합니다. http://proguard.sourceforge.net/index.html#manual/usage.html – chris

1

Proguard 최적화없이 assumenosideeffects을 사용할 수 없습니다.

+0

최적화가 사용 설정되어 있습니다. –

2

여기에 프로 가드 파일은 괜찮지 만, 누락 된 세부 사항이 있습니다. 당신의 Gradle을 파일에서

당신은 아마 이런 일이 :

buildTypes { 
    release { 
     minifyEnabled true 

     proguardFiles getDefaultProguardFile('proguard-android.txt), 'proguard-rules.pro' 
    } 
} 

getDefaultProguardFile('proguard-android') 확인을, 그래서 당신이 의도를 최적화하기 위해, 당신은 getDefaultProguardFile('proguard-android-optimize.txt')로 변경해야합니다.

나는 그것을 깨닫기 위해 약간의 시간을 보냈지 만 질문을 보았지만 내 코드에서 내 Log 호출을 제거 할 수 없었습니다. 그래서 나는 최적화 할 수 있도록 프로 가드 최적화 파일로 변경하는 데 필요한 설명이 링크를 발견했습니다.

https://developer.android.com/tools/help/proguard.html#enabling-gradle

관련 문제