2011-01-17 4 views
3

최근에 이클립스 안드로이드 프로젝트 용 ProGuard를 활성화했습니다. 외부 libs 및 동적으로 참조 된 클래스를 proguard.cfg에 추가 한 후에 apk를 빌드 할 때 오류가 발생하지 않습니다. 그러나 설치된 응용 프로그램을 시작하려고하면 NoSuchMethodError가 발생합니다.안드로이드 : Proguard NoSuchMethodError

주 활동의 onCreate 메서드에서 호출 된 특정 메서드로 범위를 좁혔습니다. 일을 단순화하기 위해, 여기에 클래스와 메소드가 어떻게 생겼는지입니다 (내가 코드를 많이 남겨,하지만 난이 그것을 설명해야한다고 생각) : 다음과 같이

public class TestMain extends TabActivity implements OnSharedPreferenceChangeListener{ 
    ... 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ... 
     testMethod(); 
    } 
} 

testMethod()가 정의된다

private void testMethod() { 
    int charsLeft = maxPostMessageLength - someEditText.length(); 
    ... 
} 

"someEditText.length()"부분을 제거하면 앱이 시작됩니다. 그래서, 내가 볼 수있는 방법, 찾을 수없는 메서드는 EditText.length() 메서드입니다. 내가 제거 testMethod에서 "someEditText.length()"과에서 onCreate 방법에 직접 넣을 때 이상하게도하지만, 응용 프로그램도 시작합니다

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     test = someEditText.length(); 
     testMethod(); 
    } 

사람이 내가이 오류를 제거 할 수있는 방법을 알고 있나요 왜 onCreate 메서드에서 someEditText.length()를 직접 호출 할 수 있지만 onCreate 메서드에서 호출하는 메서드에서는 호출 할 수 없습니다. Proguard를 사용하지 않으면 앱이 정상적으로 작동합니다.

편집 : proguard.cfg에서 -dontshrink, -dontobfuscate 및 -dontoptimzie 옵션을 시도했습니다. -dontptimize를 사용하면 오류없이 앱이 시작됩니다. 여전히이 특정 오류의 원인은 무엇입니까?

답변

1

실수로 가능한 해결책을 찾았습니다. 글쎄, 내 경우에는 완전히 작동하기 때문에 이것은 원래의 문제에 대한 해결책이다 : 오늘, @Override 어노테이션으로 약간의 코드를 구현했다. 처음에는 작동하지 않았다. 난 항상 -dontoptimize하지 않고, 왜 다시 ProGuard에서 시도하지 전에 자바 레벨 1.5을 사용하는 경우 I는, 음, 생각, 지금 'Must Override a Superclass Method' Errors after importing a project into Eclipse

: 다행히도, 다른 사람이 이미 같은 문제와 쉬운 이클립스 관련 솔루션을했다 옵션으로, 1.6으로 설정했습니다. 아프지 않아 ...

그리고 무엇을 말할 수 있습니까? 이제 응용 프로그램이 시작되고 EditText.length()가 메서드에서 호출되면 이상한 오류가 발생하지 않습니다.

1

ProGuard 설명서에는 "ProGuard 도구는 사용하지 않는 코드를 제거하고 클래스 이름을 바꾸어 코드를 축소, 최적화 및 난독 화합니다."라고 명시되어 있습니다.

글쎄, 난 당신이 설명하는 것처럼 런타임 오류가 발생 후 그것의 '축소'부분을 포기. 나는 루틴은 파일 usage.txt을 검사하여 코드에서 삭제 된 사용자가 볼 수있는 proguard.cfg

에 선

-dontshrink 

을 추가했다. 저는 항상 내 프로젝트에서 코드가 모호하지만 아무 것도 제거되지 않았다는 것을 알게되어 기쁩니다. 지금 런타임 오류가 발생하지 않습니다.

+0

나를 지적 해 주셔서 감사합니다. -dontshrink 옵션을 시도했지만 오류는 여전히 동일합니다. 그러나 -dontoptimize를 사용하면 앱이 아무런 오류없이 시작됩니다. 나는 그에 따라 나의 질문을 편집했다. – Manuel

0

옵티마이 저는 메서드에 부작용이 없다는 결론에 도달하면 메서드 호출과 메서드를 제거 할 수 있습니다. 일관성없는 코드를 작성해서는 안되며, 이와 같은 문제점을 인식하지 못합니다. ProGuard의 최신 버전으로 유지되는지 확인해야합니다. 그렇지 않으면 ProGuard 사이트에 버그 리포트를 제출해야합니다. 문제를 설명하는 작은 예제를 포함하는 것이 좋습니다.

0

나는 OP와 비슷한 문제가있어서 프로 기어 구성 옵션으로 설정했는데 -allowaccessmodification을 설정하여이 문제를 해결했습니다.

관련 문제