지옥을 보호-참조 클래스를 찾을 수 없습니다


125

그래서, 난 TRYING 일부 소프트웨어를 해제하지만 Proguard와 나에게 두통을주고있다.

proguard를 사용하여 내보내려고 할 때 경고가 많이 발생합니다. "참조 된 클래스를 찾을 수 없습니다"

예를 들면 다음과 같습니다.

[2011-08-07 17:44:37 - GAME] Warning: org.simpleframework.xml.stream.StreamReader: can't find referenced class javax.xml.stream.events.XMLEvent
[2011-08-07 17:44:37 - GAME] Warning: there were 52 unresolved references to classes or interfaces.
[2011-08-07 17:44:37 - GAME]          You may need to specify additional library jars (using '-libraryjars'),
[2011-08-07 17:44:37 - GAME]          or perhaps the '-dontskipnonpubliclibraryclasses' option.
[2011-08-07 17:44:37 - GAME] java.io.IOException: Please correct the above warnings first.
[ 

경고는 간단한 프레임 워크와 관련이있는 것으로 보이므로 proguard 구성 파일에서 다음을 추가했습니다.

-libraryjars pathtoprojecttolibs\simple-xml-2.4.jar

pathtoprojecttolibs내 프로젝트에서 참조하는 jar의 경로는 어디에 있습니까 ?

이것은 아무런 차이가 없습니다.

간단한 프레임 워크가 javax를 참조하면 proguard에게 이것을 무시하도록 지시 할 수 있습니까 ??

어떤 아이디어?


1
트리 쉐이킹을하기 위해 proguard를 사용하고 있습니까? 그렇다면 파일 크기를 사용하지 않고 확인 했습니까? proguard가 런타임을 중단 할 때까지 찾을 수없는 리플렉션을 사용하여 액세스 한 무언가를 버릴 때 superwierd 버그를 얻을 수 있으므로 실제로 꼭 필요합니다.
alun

실제로 코드를 쉽게 흠집을 내기 위해 사용하고 있었습니까? 그만한 가치가 있다고 생각하십니까?
iasksillyquestions

3
@ListenToRick Proguard는 적절한 구성으로 실행되고 결과 앱이 올바르게 테스트되면 완벽하게 좋습니다. 나는 구글이 그것의 사용을 추천한다고 확신한다. Google은 Android 앱에서 Proguard를 사용하기위한 많은 안내서 / 예를 제공합니다.
CrackerJack9

Proguard는 좋은 도구이지만 Google은 dex 형식의 크기 제한이 다른 것보다 훨씬 크기 때문에 권장합니다. ( code.google.com/p/android/issues/detail?id=7147 참조 )
alun

5
@alun, 그 이유가 아닙니다. 앱의 리버스 엔지니어링을 원하지 않거나 불법 복제를 방지하기 위해 '시도'를 위해 라이센스를 사용하는 사용자는 해커가되기 어려운 난독 화 도구를 사용해야합니다. 응용 프로그램의 공간을 적게 차지하는 것은 최종 사용자에게도 도움이되며 이러한 도구를 사용하여 최적화 한 것 또한 또 다른 이점입니다.
Christopher Perry

답변:


128

org.simpleframework.xml.stream.StreamReader귀하의 코드에서을 참조하십시오 javax.xml.stream.events.XMLEvent. 후자의 클래스는 Java 런타임 ( rt.jar)의 일부이지만 Android 런타임 ( android.jar) 의 일부가 아니므로 ProGuard는 무언가가 손상되었을 수 있다고 경고합니다. 어쨌든 응용 프로그램이 작동한다고 확신하면 지정할 수 있습니다

-dontwarn javax.xml.stream.events.**

프로 가드 지옥?


15
나를 위해 그것을 해결되지 않았다, 그러나 이것은 한-dontwarn javax.xml.**
여수 룬

8
추가 -libraryjars <java.home>/lib/rt.jar하면 문제가 해결되었습니다.
Gautam

3
내가 사용하는, 그래서 내가, 예를 들어 javax.xml.stream.XMLInputFactory에 대한 추가 경고를 받았습니다-dontwarn javax.xml.stream.**
spatialist

1
-dontwarnGUI를 노래로 설정 하려면 어떻게 해야합니까?
Tomáš Zato-복원 모니카

2
지옥을 계속 지키고, 나를 욕하고이 고통을 끝내십시오.
Josh


5

이 오류는 사용하는 라이브러리가 실제로 사용되지 않는 다른 라이브러리에 의존하지만 Proguard에서 찾고 있기 때문에 발생합니다. 이 경고를 비활성화 하려면 -dontwarn 행을 Android 프로젝트 의 proguard-rules.pro 파일에
추가하십시오 .

여기에 이미지 설명을 입력하십시오

오류의 스택 추적에서 proguard-rules.pro에 추가해야 할 종속성을 찾을 수 있습니다.


2

이를 Proguard 구성에 포함시켜야합니다.

-dontskipnonpubliclibraryclasses

글쎄, 그것은 ~ 4 년 전 ... 나를 위해 그때 그때 일이 바뀌었을 수도 있습니다 :) 어쨌든 적어도 2 명의 다른 사람들을 위해 일한 것 같습니다.
크래커 잭 9

기본 proguard-android.txt 에는 이미이 줄이 있습니다.
Cristina De Rito

1
커밋은 2013 년부터 @Ultimecia,이 게시물은 2011 년에 이루어졌습니다
CrackerJack9


0

흠. 경고를 읽으면 사용하려는 라이브러리가 javax.xml.stream.events에 의존하는 것처럼 보입니다. 네임 스페이스가 실제로 안드로이드에 전혀 포함되어 있다고 생각하지 않습니다. ( 패키지 색인 참조 )

proguard를 사용하지 않고 에뮬레이터에 배포하고 작동하는지 확인하십시오. 그 경고가 정확하다면 내 추측은 아니오입니다.


안녕하세요, proguard없이 에뮬레이터에서 작업하는 경우 경고가 정확하지 않다는 것을 의미합니까? 왜 이런 종류의 비슷한 경고가 있었는지 알아 내려고 노력 중입니다. 경고 만 표시하고 싶지 않습니다.
Michelle Shieh

0

나는 이것이 엣지 케이스라고 생각하지만 제 경우에는 Jenkins proguard에서 빌드 폴더를 완전히 닦아야했지만 더 이상 존재하지 않는 오래된 코드로 작업하려고했습니다.


0

내 경우에는 아무것도 변경하지 않았으며 경고가 표시되기 시작했습니다. 문제는 깨진 gradle 캐시와 관련이 있습니다. 다른 답변을 확인하십시오 . 문제를 찾는 데 2 ​​시간이 걸렸기 때문에 이것을 공유합니다.]


0

proguard-rules.progradle scripts 디렉토리 의 파일에 다음 행을 추가하십시오 .

-dontwarn package.class.name.**

어디 package.class.name jar 파일의 클래스 이름이 추가 된 패키지 이름입니다.

예를 들면 다음과 같습니다.

-dontwarn com.myexternalclass.utils.**
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.