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의 버그/제한 사항입니까? 아니면 내가 어떻게 작동하는지 이해하지 못하는 것입니까?
프로 가드 해킹을 피하고 그냥 상수를 사용하는 것이 좋습니다. http://stackoverflow.com/questions/4199563/android-util-log-when-publishing-what-can-i-do-not-do If 그런 다음 상수 proguard를 사용하여 == false 일 때 코드 행을 제거합니다. – Blundell
이것은 사실 해킹이고 추한 것이지만, 모든면에서'if (DEBUG)'를 사용하는 것보다 낫다고 생각합니다. 결과 코드가 더 깨끗하고 내 보낸 응용 프로그램에서 결과가 동일합니다. 또한 디버그 상수가 거짓 인 경우 어떤 이유로 Eclipse는 데드 코드에 대해 징징 대고 있습니다. 생각해 줘서 고마워. :) –
기본 데이터 형식을 전달하면 여전히 불완전한 코드가있을 수 있습니다. Proguard는 기본 데이터 형식을 상응하는'Object' 변환으로 제거하지 않습니다. 예 : Proguard는'int'를 전달하면'Integer.valueOf (someVar);' – crazymaik