Как стать автором
Обновить

Комментарии 8

Пишете в комментариях что вы думаете об этом способе
я правильно понял, что Вы из ~800 килобайт библиотек удалили лишние классы и получили 522 байта? и все работает?)
Да, proguard удаляет неиспользуемые классы(методы и переменные), а так как они не используются то все работает
что же входит в 522 байта?
Да, извиняюсь, забыл поставить одну звездочку и proguard удалил все кроме одного класса
keep 'class com.CasualSoftware.classloader.library.**' — должно быть так
Теперь библиотека весит 50кб
Мы можем положить зависимости рядом с нашим jar. Но тогда неизбежны конфликты библиотек разных версий, например, если мы используем одну версию support library, а в самом приложении другая. Тогда придется руками одну из них удалять.

А разве в этом случае нам не нужно просто положить support library с последней версией которую используют другие библиотеки или наше приложение? Там же нет чего-либо ломающего обратную совместимость со старыми версиями.

Вообще идея интересная, но не совсем понятно на счет неиспользуемых классов во фреймворках. Прогард может провести агрессивную оптимизацию, например если библиотека инстанциирует объекты через рефлекшн и потом в райнтайме упадет ClassNotFoundException в стороннем sdk.
А разве в этом случае нам не нужно просто положить support library с последней версией которую используют другие библиотеки или наше приложение? Там же нет чего-либо ломающего обратную совместимость со старыми версиями.

Ну да, в случае support library, можно просто положить новую версию. Но не факт что другие библиотеки поддерживают обратную совместимость.

А на счет reflection, там не все так плохо
Does ProGuard handle Class.forName calls?

Yes. ProGuard automatically handles constructs like Class.forName(«SomeClass») and SomeClass.class. The referenced classes are preserved in the shrinking phase, and the string arguments are properly replaced in the obfuscation phase.
With variable string arguments, it's generally not possible to determine their possible values. They might be read from a configuration file, for instance. However, ProGuard will note a number of constructs like "(SomeClass)Class.forName(variable).newInstance()". These might be an indication that the class or interface SomeClass and/or its implementations may need to be preserved. The developer can adapt his configuration accordingly.
Уберите статью из хаба «Android», пожалуйста. Те, кому эта статья может пригодится, и так её увидят, потому что подписаны на хаб «Разработка под Android»
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории