Pull to refresh

Comments 17

Столкнулся с проблемой обфускации: все Annotation style библиотеки (тот же ButterKnife) просят добавлять исключения для Proguard. В итоге после обфускации все инжектируемые поля и bindable методы не переименовываются, а это способствует RE. Кто-нибудь знает, как с этим бороться?
Никак. Сгенерированные в процессе компиляции классы, используются рефлексией в рантайме. Кстати, хак со встраиванием класса в иерархию наследования решает эту проблему, ProGuard спокойно может обфусцировать все что можно =)
Proguard это не обфускатор, а минификатор. Минификация усложняет RE незначительно.
Огромное спасибо за статью. Буквально в прошлом месяце заинтересовался аннотациями, но так и не смог найти ни чего вразумительного кроме однотипных туториалов.
Статей на английском достаточно много + есть записи докладов Вортона и других людей + можно изучать исходники библиотек, которые используют Annotation Processing.
«Классная» идея заюзать полуприватный, недокументированный апи компилятора (который может менятся в любом апдейте JDK) и менять существующий код ради ооочень слабого профита в виде private поля, еще и в иерархию наследования вклиниваться.

Что может пойти не так?)
Пример в статье — лишь малая часть тех возможностей, которые можно получить. А вообще, да, это хороший способ выстрелить себе в ногу, о чем я, собственно, упомянул в заключении.
Отличная лекция на droidcon и её перевод в текстовый вариант, спасибо!
Напрягает выпиливание private. Ведь если в соседнем классе обратиться к этому приватному филду, то, несмотря на ругань ide, все скомпилируется. Вопрос: зачем вообще убирать private? Почему нельзя обойтись setAccessible(true) чтобы убрать проверку доступа не везде, а только где это необходимо.
setAccessible — это фича рефлексии. Мы же от рефлексии пытаемся уйти.
Для этого уже написан apt-plugin, можно еще посмотреть AspectJ для андроида.
Безусловно, придумано уже много чего. Но APT, который появился фактически вместе с релизом аннотаций, объявлен ораклом как устаревший инструмент. А aspectJ работает схожим образом: модификация кода. Только использовать надо кастомный компилятор. Ещё ASM есть, lombok и еще куча всего.
Я неправильно выразился, apt-plugin — вспомогательный инструмент для библиотек, которые используют компайл-тайм аннотации и кодогенераторы, apt не значит, что используется депрекейтед апи, это просто аббревиатура. Сами библиотеки(android annotations, dagger и, кстати, lombok) используют новое апи компилятора, как и написанов статье.

По уровню магии меня с большего устраивает android annotations, поэтому я передумал делать что-то свое, хотя первое время очень хотелось. Скоро в android annotations добавят возможность подключать свои плагины, а значит можно будет добавлять поддержку библиотек по желанию и с минимумом усилий. В идеале хотелось бы, чтобы магия была полностью скрыта — никаких классов с underscore в конце.

AspectJ хорош тем, что не нужно велосипедить, все уже написано, подключай и используй, если необходимо. Последний пример как раз неплохо ложится на аспекты.

ASM и lombok врядли популярны на андроиде.
Sign up to leave a comment.