Proguard на Android сломан? - PullRequest
       34

Proguard на Android сломан?

1 голос
/ 15 ноября 2011

Раньше я мог следовать руководству здесь , чтобы без проблем установить и запустить Proguard как часть сборки. Однако после обновления до последней версии инструментов ADT у меня возникли проблемы. Первая проблема, с которой я сталкиваюсь:

BUILD FAILED
/home/myhome/projects/myapp/add-proguard-release.xml:14:
/home/myhome/projects/myapp/${out.classes.dir} does not exist.

Так что в итоге мне приходится определять $ {out.classes.dir} вручную в local.properties или project.properties. Не конец света, но немного боли.

Вторая, более радикальная проблема связана с внешними банками. У меня есть небольшой класс во внешней банке. Когда приложение запускается на устройстве, оно вылетает:

11-15 18:35:30.090: E/AndroidRuntime(28258): java.lang.NoClassDefFoundError: com.mysoftware.informaltimeprovider.InformalTimeProvider
11-15 18:35:30.090: E/AndroidRuntime(28258):    at com.mysoftware.pagemonitor.PrintableTimeProvider.getInformalTime(PrintableTimeProvider.java:14)

Сбой при попытке создать экземпляр InformalTimeProvider, но, судя по выводу logcat, этот класс не был запутан, поэтому я не знаю, почему возникает проблема.

При сборке появляется предупреждение:

[proguard]   Copying resources from program jar [/home/myhome/projects/pagemonitor/libs/InformalTimeProvider.jar]
[proguard] Warning: can't write resource [META-INF/MANIFEST.MF] (Duplicate zip entry [InformalTimeProvider.jar:META-INF/MANIFEST.MF])

Это всего лишь предупреждение - я не ожидал бы крушения.

Любая помощь с благодарностью получена.

Barry

1 Ответ

1 голос
/ 15 ноября 2011

Минимизированные Proguard приложения в основном не работают "из коробки". В большинстве случаев вам нужно вручную указать дополнительные классы, которые необходимо сохранить.

В вашем случае я бы начал с добавления строки конфигурации

-keep class com.mysoftware.informaltimeprovider.InformalTimeProvider

Это явно говорит Proguard, что этот класс является обязательным и не может быть удален. Если впоследствии ваше приложение пропустит другой класс, попросите proguard также сохранить его.

Шаг за шагом вы приблизитесь к полностью работающему приложению. Я знаю, что такой метод проб и ошибок не очень хорош, но оптимизация Java-приложений не так проста, как его можно полностью автоматизировать. Особенно классы загрузки Strings и другие трюки во время выполнения сталкиваются с Proguard.

...