2013-05-31 5 views
0

После экспорта подписанного пакета из eclipse приложение начало сбой при вызове одного из видов деятельности.java.lang.NoClassDefFoundError после proguard obfuscation

05-30 23:05:43.814: E/AndroidRuntime(11578): FATAL EXCEPTION: main 
05-30 23:05:43.814: E/AndroidRuntime(11578): java.lang.NoClassDefFoundError: com.encryptomatic.alockbin.ItemListActivity 

Я полностью исключил этот класс из обфускации со всеми членами, и я вижу его в списке seeds.txt.

Единственное отличие от других видов деятельности заключается в том, что этот вариант распространяется на SherlockFragmentActivity. я исключил зависимости в целом с использованием:

-keep class android.support.v4.app.** { *; } 
-keep interface android.support.v4.app.** { *; } 
-keep class com.actionbarsherlock.** { *; } 
-keep interface com.actionbarsherlock.** { *; } 
-keepattributes *Annotation* 

Что может быть не так? Как я могу проверить, действительно ли мой класс закончился в apk?

+0

Попробуйте с' -keep public class * extends package_of_SherlockFragmentActivity.SherlockFragmentActivity' –

+0

Это старый проект, и вы недавно обновили свой Android-разработчик инструменты? Попробуйте, что произойдет, если вы отключите ProGuard. – Robert

ответ

0

андроид-поддержка-v4.jar не был установлен на экспорт под Java Build Path в свойствах проекта:

правой кнопкой мыши по проекту -> Свойства -> Java Построить Путь -> Заказ и экспорт -> Проверить флажок " Отдельные библиотеки Android "(узел, где android-support-v4.jar находится на вкладке Library)

+0

Это решение проблемы? Если у кого-то еще такая же проблема, этот ответ не поможет, поскольку это непонятно. – Robert

+0

Это сработало для меня: Один из моих классов простирается от android.support.v4.app.FragmentActivity, после проверки «частных библиотек Android». Оно работает. – shily

1

Быстрый ответ: ProGuard не смог обнаружить, что класс com.encryptomatic.alockbin.ItemListActivity используется вашим кодом и поэтому удалил его. Это может произойти, если оно загружается динамически или другим необычным способом.

Поэтому, если вы используете ProGuard вы должны просто добавить упомянутый класс как класс, чтобы «держать»:

-keep class com.encryptomatic.alockbin.ItemListActivity { public *; } 

Затем вновь построить APK и попробовать его. Проверьте все функции вашего приложения, поскольку, скорее всего, существуют другие классы, которые необходимо настроить для сохранения. Если вы определили, что все классы также проверяют предупреждения ProGuard, поскольку они обычно содержат другие классы, которые могут быть разумными.

+0

Итак, классы, загруженные таким образом: Цель намерения = новое намерение (это, ItemListActivity.class); не обнаружены proguard? Позвольте мне попробовать быстро и вернуться к вам. –

+0

Нет, что не работает. Когда я смотрю proguard cfg, я уже сохранил этот класс с помощью: -keep public class * extends com.actionbarsherlock.app.SherlockFragmentActivity {*;} и, как я уже сказал, он указан в семенах, что означает, что он не обрабатывается. Есть также 3 действия до этого, которые загружаются таким же образом через намерение. –

+0

Если вы уже настроили это, почему вы не пишете это в своем вопросе? Представленная конфигурация ProGuard не содержит ничего подобного. – Robert

Смежные вопросы