Разоблачение внутренних классов при запутывании с ProGuard
Я запутываю библиотеку с помощью ProGuard, используя задачу Ant.
Я сохраняю определенные имена классов и имена их методов, когда они имеют определенную аннотацию (@ApiAll), и я прошу сохранить атрибут InnerClasses:
<keepattribute name="InnerClasses" />
<keep annotation="com.example.ApiAll"/>
<keepclassmembers annotation="com.example.ApiAll">
<constructor access="public protected"/>
<field access="public protected"/>
<method access="public protected"/>
<constructor access="protected"/>
</keepclassmembers>
Если я проверю выходной файл сопоставления, то увижу, что мой внутренний класс с аннотацией и его членами не изменяет своих имен. Однако, когда я смотрю в сгенерированный файл JAR, я не могу найти класс.
Я что-то пропустил? Почему картография говорит мне, что он держит этот класс, когда это не так?
2 ответа
Вам нужно указать, что вы хотите сохранить внутренний класс, используя правильные обозначения. На языке Proguard это означает -keep class my.outer.Class$MyInnerClass
, Ключ здесь использует знак доллара ($
) как разделитель между внутренним и внешним классом.
Для этого вам также нужно указать -keepattributes InnerClasses
, так что имя MyInnerClass
не запутывается. Эти две настройки вместе должны позволить вашим внутренним классам быть сохраненными.
Опция keepclassmembers
сохраняет только указанные члены класса (и их имена).
Вы, вероятно, хотите более распространенный вариант keep
, который сохраняет указанные классы и члены класса (и их имена).
ЧФР. Руководство по ProGuard> Использование> Обзор параметров хранения