2011-08-17 4 views
20

가능한 중복 기록되고 제거되지 않습니다 :
Removing unused strings during ProGuard optimisation
제거 로깅 문자열이

내가 로깅 문 수십 안드로이드 응용 프로그램이 있습니다. 나는 그들이 릴리스 버전에 나타나지 않습니다 선호하는 것, 그래서 proguard.cfg 파일에서이 같은 뭔가 Proguard와 사용 :

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

그러나 문제는, Log.d("something is " + something)이 많이 있다는 것입니다 그리고 Log.d()하지만 문이 바이트 코드에서 제거되면 문자열이 여전히 있습니다.

그래서, this 대답을 다음, 나는의 라인을 따라 간단한 래퍼 클래스, 뭔가를 만들어 :

public class MyLogger { 
    public static void d(Object... msgs) { 
     StringBuilder log = new StringBuilder(); 
     for(Object msg : msgs) { 
      log.append(msg.toString()); 
     } 
     Log.d(TAG, log.toString()); 
    } 
} 

그럼 내가 편집을 내 proguard.cfg :

-assumenosideeffects class my.package.MyLogger { 
    public static *** d(...); 
} 

그러나 문자열은 아직 발견 생성 된 바이트 코드에서!

이외에도 Android SDK에서 제공하는 proguard.cfg 표준을 사용하고 있습니다. 내가 뭔가 잘못하고 있는거야?


편집는 : 생성 된 바이트 코드를 검사 한 후, 나는 문자열이 있다고보고,하지만 생각만큼 그들은 다른 하나를 추가하지되었다. 배열에 저장된 입니다. 왜? 내 매개 변수로 매개 변수로 전달하기. ProGuard를 그렇게 좋아하지 않는 것 같습니다, 그래서 나는 이런 내 로거 클래스를 수정 :

public static void d(Object a) { 
    log(a); 
} 

public static void d(Object a, Object b) { 
    log(a, b); 
} 

(... I had to put like seven d() methods ...) 

private static void log(Object... msgs) { 
    (same as before) 
} 

그것은 추한,하지만 지금은 문자열이 바이트 코드에가 없습니다.

ProGuard의 버그/제한 사항입니까? 아니면 내가 어떻게 작동하는지 이해하지 못하는 것입니까?

+0

프로 가드 해킹을 피하고 그냥 상수를 사용하는 것이 좋습니다. http://stackoverflow.com/questions/4199563/android-util-log-when-publishing-what-can-i-do-not-do If 그런 다음 상수 proguard를 사용하여 == false 일 때 코드 행을 제거합니다. – Blundell

+2

이것은 사실 해킹이고 추한 것이지만, 모든면에서'if (DEBUG)'를 사용하는 것보다 낫다고 생각합니다. 결과 코드가 더 깨끗하고 내 보낸 응용 프로그램에서 결과가 동일합니다. 또한 디버그 상수가 거짓 인 경우 어떤 이유로 Eclipse는 데드 코드에 대해 징징 대고 있습니다. 생각해 줘서 고마워. :) –

+0

기본 데이터 형식을 전달하면 여전히 불완전한 코드가있을 수 있습니다. Proguard는 기본 데이터 형식을 상응하는'Object' 변환으로 제거하지 않습니다. 예 : Proguard는'int'를 전달하면'Integer.valueOf (someVar);' – crazymaik

답변