2013-05-30 1 views
3

ProGuard가 스레드를 동기화하는 데 사용한 .wait() 호출을 제거한 것을 발견했습니다. 이는 경쟁 디버깅의 날로 이어지는 경쟁 조건으로 이어집니다 :) 어쨌든 ... Proguard가 내 Object.wait()를 먹었습니다.

나는 난독 구성의 조각을 다음에 그것을 아래로 추적 :

-assumenosideeffects public class android.util.Log { 
    <methods>; 
} 

내가 이런 일이 이해하고 싶다. Log 클래스를 제거해도 부작용이 없다고 가정하면 다른 클래스/객체에서 .wait()를 제거하게됩니다.

나는 Eric이 그런 일이 일어날 수 있다고 설명하는 ProGuard optimization also remove #wait() calls을 보았습니다. 그러나 그는 이유를 설명하지 않습니다.

또한 여기에서 로그를 제거하는 방법을 발견했습니다 (http://proguard.sourceforge.net/index.html#manual/examples.html). 그래서, 나는 구성의 프로 가드 (proguard of configuration)를 대체 할 수 있습니다 (그러나이 질문의 요지는 아닙니다).

+0

질문 있습니다 ... 왜 ProGuard를 사용하고 있습니까? 무엇 때문에? –

+0

@AdamStelmaszczyk : 주로 난독 화 코드입니다. 그러나 로그 제거는 전반적인 응용 프로그램 난독 화에 대한 좋은 추가 사항입니다. 왜 묻는거야? –

+0

나는 그럴 가치가 없다고 생각하기 때문에. ProGuard (decompile apk)에 의해 생성 된 코드를 확인하십시오. "난독 화"버전을 쉽게 읽을 수 있습니다. 간단한'boolean DEBUG = false' 플래그로 로그를 제거 할 수 있습니다. 나는 ProGuard를 버렸습니다. ProGuard는 이익보다 더 많은 문제를 안고 있기 때문입니다. –

답변

4

원래 구성은 Object # wait()를 포함한 모든 Log 메소드 (명시 적 또는 상속)와 일치합니다. ProGuard는 wait() 메서드에 부작용이없고 프로그램을 손상시키지 않고 제거 할 수 있다고 알려줍니다. 이는 분명히 사실이 아닙니다. -assumenosideeffects를 사용하면 항상 제거 할 수있는 메소드를 명시 적으로 나열해야합니다.

+0

이것은 구성이 ";" 클래스에 정의 된 경우 동기화를 중단 할 수 있습니까? –

+0

예, 응용 프로그램 코드에서 wait(), notify() 및 notifyAll() 호출이 모두 제거되므로 동기화가 중단 될 가능성이 큽니다. –

+0

이 클래스에 정의 된 경우 오류가 발생했다고 생각하십니까? 그것은 인터페이스가 아닌 것처럼 보입니다 - 단지 문제를 묻습니다. –

관련 문제