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?

iasksillyquestions
źródło
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?

Eric Lafortune
źródło
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,
9

W moim przypadku główna przyczyna była tutaj . Ostrzeżenia, które możesz po prostu pominąć:

-dontwarn org.simpleframework.xml.stream.**

Oryginalny Odpowiedź jest tutaj

Jarosław Hawrylowicz
źródło
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.

Yuliia Ashomok
źródło
2

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

-dontskipnonpubliclibraryclasses
CrackerJack9
źródło
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
Ashraf Alshahawy
źródło
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.

alun
źródło
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.

luckyhandler
źródło
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:]

AppiDevo
źródło
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.**
Pedro Marthon
źródło