proguard hell - не вдається знайти посилається клас


125

Отже, я НАМАГАЮСЯ випустити деякий програмне забезпечення , але 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шлях до банок, на який посилається мій проект.

Це не має ніякої різниці.

Якщо посилання simpleframework javax, чи можу я сказати proguard ігнорувати це?

Будь-які ідеї?


1
Ви використовуєте proguard просто для того, щоб робити обрізку дерев? Якщо так, чи перевіряли ви розмір файлу, не використовуючи його? Ви можете отримати надзвичайні помилки, коли proguard викидає те, до чого звертається, наприклад, за допомогою відображення, яке ви не знайдете, поки воно не порушить час виконання, тому будьте справді, дуже впевнені, що вам це потрібно.
alun

Я насправді лише використовував його, щоб спробувати захистити код, що його нік так просто? Ви вважаєте, чи варто того?
iasksillyquestions

3
@ListenToRick Proguard ідеально підходить, якщо він працює з належними конфігураціями та ваш тестовий додаток перевірений належним чином. Я впевнений, що Google навіть рекомендує його використовувати. Google надає безліч посібників / прикладів використання Proguard з додатками Android.
CrackerJack9

Proguard - це хороший інструмент, але Google рекомендує його, мабуть, принаймні стільки ж через досить відмінне обмеження розміру у форматі dex, як і все інше. (Див code.google.com/p/android/issues/detail?id=7147 )
Alun

5
@alun, це не причина. Ті з нас, хто не хоче, щоб наші додатки були спроектовані на зворотній основі, або які використовують ліцензування, щоб "намагатися" запобігти піратству, повинні використовувати такий інструмент обфускування, як цей, щоб зробити його складніше хакерам. Зробити менше, ніж у вашій програмі, також є користь для кінцевого користувача, а також є оптимізація, зроблена цими інструментами ... ще одна перевага.
Крістофер Перрі

Відповіді:


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вирішило проблему для мене.
Гаутам

3
Я отримав додаткові попередження про, наприклад, javax.xml.stream.XMLInputFactory, тому я використав-dontwarn javax.xml.stream.**
просторіст

1
Як я можу налаштувати -dontwarnспівати GUI?
Томаш Зато - Відновіть Моніку

2
Пекло прогуарда триває, просто кинь мене і покінчи з цим болем.
Джош


5

Ця помилка виникає через те, що використовувані вами залежать від інших, які не використовуються, але Proguard шукає їх.
Додайте рядки -dontwarn до файлу proguard-rules.pro у проекті Android, щоб відключити ці попередження.

введіть тут опис зображення

Ви можете дізнатись, які залежності потрібно додати до свого proguard-rules.pro, в стекті вашої помилки.


2

Ви повинні включити це в налаштування Proguard:

-dontskipnonpubliclibraryclasses

Що ж, це було для мене в той час ... ~ 4 роки тому ... все може змінитися з тих пір :) Здається, працювали щонайменше для двох інших людей.
CrackerJack9

У цьому рядку вже є прогуар-android.txt .
Крістіна Де Ріто

1
@Ultimecia, яку здійснюють з 2013 року, це повідомлення було зроблено в 2011 році
CrackerJack9

2

Мій магічний ключ, який вирішив мої години пошуку: додайте це до progruard-android.txt

-dontskipnonpubliclibraryclassmembers

0

Хм. Читаючи це попередження, схоже, що бібліотека, яку ви намагаєтеся використовувати, залежить від javax.xml.stream.events. Я не думаю, що простір імен насправді взагалі включений в android. (Див. Індекс упаковки ).

Спробуйте розгорнути його до емулятора, не використовуючи proguard, і подивіться, чи працює він. Моя здогадка була б ні, якби це попередження було точним.


Привіт, якщо він працює в емуляторі без захисту, це означає, що попередження є неточними? Я намагаюся з'ясувати, чому у мене були подібні попередження. Я не хочу просто придушувати попередження.
Мішель Шие

0

Я думаю, що це кращий випадок, але в моєму випадку мені довелося повністю стерти папку збірки на моєму прогуаді Дженкінса, намагаючись працювати зі старим кодом, якого більше не було - про всяк випадок, якщо хтось має таку ж проблему.


0

У моєму випадку я нічого не змінив, і попередження почало надходити. Проблема була у зламаних кешах gradle. Перевірте іншу мою відповідь . Я поділяюсь цим, бо знадобилося дві години, щоб знайти проблему:]


0

Додайте цей рядок у свій proguard-rules.proфайл у каталозі скриптів gradle:

-dontwarn package.class.name.**

де package.class.nameназва пакету із доданим ім'ям файлу jar.

Наприклад:

-dontwarn com.myexternalclass.utils.**
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.