proguard hell - nie można znaleźć klasy, której dotyczy odwołanie


125

Tak, mam PRÓBA zwolnić niektóre programy, ale Proguard daje mi ból głowy.

Kiedy próbuję wyeksportować za pomocą proguard, otrzymuję wiele ostrzeżeń, np. „Nie mogę znaleźć klasy, do której się odwołuje”

Na przykład:

[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.
[ 

Ostrzeżenia wydają się być związane z simpleframework, więc w moim pliku konfiguracyjnym proguard dodałem:

-libraryjars pathtoprojecttolibs\simple-xml-2.4.jar

Gdzie pathtoprojecttolibsjest ścieżka do słoików, do których odwołuje się mój projekt.

To nie ma znaczenia.

Jeśli simpleframework odwołuje się do javax, czy mogę powiedzieć programowi proguard, aby to również ignorował?

Jakieś pomysły?


1
Czy używasz programu Proguard tylko do wykonywania treeshaking? Jeśli tak, czy sprawdziłeś rozmiar pliku bez jego używania? Możesz uzyskać superwierd błędy, gdy proguard wyrzuci coś, do czego można uzyskać dostęp, na przykład za pomocą refleksji, czego nie znajdziesz, dopóki nie zepsuje działania, więc bądź naprawdę, bardzo pewny, że tego potrzebujesz.
alun

Naprawdę używałem go tylko po to, aby tak łatwo zabezpieczyć kod, który został zraniony? Czy uważasz, że warto?
iasksillyquestions

3
@ListenToRick Proguard jest całkowicie w porządku, jeśli działa z odpowiednią konfiguracją, a wynikowa aplikacja została poprawnie przetestowana. Jestem prawie pewien, że Google nawet zaleca jego użycie. Google udostępnia wiele przewodników / przykładów używania Proguard z aplikacjami na Androida.
CrackerJack9,

Proguard to dobre narzędzie, ale Google poleca go prawdopodobnie co najmniej tak samo ze względu na dość dziwne ograniczenie rozmiaru w formacie dex, jak cokolwiek innego. (Zobacz code.google.com/p/android/issues/detail?id=7147 )
alun

5
@alun, to nie jest powód. Ci z nas, którzy nie chcą, aby nasze aplikacje były poddawane inżynierii wstecznej lub którzy korzystają z licencji, aby „próbować” zapobiegać piractwu, powinni skorzystać z takiego narzędzia do zaciemniania, aby utrudnić to hakerom. Sprawienie, że Twoja aplikacja zajmuje mniej miejsca, jest również korzyścią dla użytkownika końcowego, a także optymalizacje wprowadzone przez te narzędzia ... kolejna korzyść.
Christopher Perry,

Odpowiedzi:


128

org.simpleframework.xml.stream.StreamReaderw twoim kodzie odnosi się do javax.xml.stream.events.XMLEvent. Ta ostatnia klasa jest częścią środowiska uruchomieniowego Java ( rt.jar), ale nie jest częścią środowiska uruchomieniowego systemu Android ( android.jar), więc ProGuard ostrzega, że ​​coś może być zepsute. Jeśli masz pewność, że Twoja aplikacja i tak działa, możesz określić

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

Piekło ProGuard?


15
To mi nie -dontwarn javax.xml.**
pomogło

8
Dodanie -libraryjars <java.home>/lib/rt.jarrozwiązało problem dla mnie.
Gautam,

3
Dostałem dodatkowe ostrzeżenia o np. Javax.xml.stream.XMLInputFactory, więc użyłem-dontwarn javax.xml.stream.**
spatialist

1
Jak mogę ustawić -dontwarnśpiewanie GUI?
Tomáš Zato - Przywróć Monikę

2
Proguard piekło trwa, po prostu obedrzyj mnie i skończ z tym bólem.
Josh,


5

Ten błąd występuje, ponieważ używane biblioteki zależą od innych bibliotek, które nie są w rzeczywistości używane, ale Proguard ich szuka.
Dodaj swoje linie -dontwarn do pliku proguard-rules.pro w projekcie Androida, aby wyłączyć te ostrzeżenia.

wprowadź opis obrazu tutaj

Możesz znaleźć zależności, które musisz dodać do swojego proguard-rules.pro w śladzie stosu swojego błędu.


2

Powinieneś to uwzględnić w swojej konfiguracji Proguard:

-dontskipnonpubliclibraryclasses

Cóż, wtedy mi się to udało ... ~ 4 lata temu ... od tamtego czasu wszystko mogło się zmienić :) Wydawało się, że i tak pracował dla co najmniej 2 innych osób.
CrackerJack9

Domyślny proguard-android.txt ma już tę linię.
Cristina De Rito,

1
@Ultimecia, które zatwierdzenie pochodzi z 2013 roku, ten post powstał w 2011 roku
CrackerJack9

2

Mój magiczny klucz, który rozwiązał moje godziny wyszukiwania: Dodaj to do progruard-android.txt

-dontskipnonpubliclibraryclassmembers

0

Hmm. Czytając to ostrzeżenie, wydaje się, że biblioteka, której próbujesz użyć, jest zależna od javax.xml.stream.events. Nie sądzę, żeby przestrzeń nazw w ogóle była zawarta w Androidzie. (Zobacz Indeks pakietów ).

Spróbuj wdrożyć go na emulatorze bez korzystania z programu Proguard i sprawdź, czy działa. Domyślam się, że nie, jeśli to ostrzeżenie jest dokładne.


Witam czy pracuje w emulatorze bez proguarda to znaczy ostrzeżenia są niedokładne? Próbuję dowiedzieć się, dlaczego otrzymałem tego rodzaju podobne ostrzeżenia. Nie chcę po prostu tłumić ostrzeżeń.
Michelle Shieh

0

Myślę, że to skrajny przypadek, ale w moim przypadku musiałem całkowicie wyczyścić folder kompilacji na moim proguardzie Jenkinsa, próbując pracować ze starym kodem, którego już nie było - na wypadek, gdyby ktoś miał ten sam problem.


0

W moim przypadku nic nie zmieniłem i zaczęło się pojawiać ostrzeżenie. Problem dotyczył zepsutych pamięci podręcznych gradle. Sprawdź moją drugą odpowiedź . Dzielę się tym, ponieważ znalezienie problemu zajęło mi 2 godziny:]


0

Dodaj tę linię do swojego proguard-rules.pro pliku w katalogu skryptów gradle:

-dontwarn package.class.name.**

gdzie package.class.name jest nazwą pakietu z nazwą klasy dołączonego pliku jar.

Na przykład:

-dontwarn com.myexternalclass.utils.**
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.