Может ли ProGuard изменить модификаторы доступа на package-private?

Можно ли с помощью ProGuard переместить все запутанные классы в именованный пакет и изменить их общедоступные или защищенные методы или переменные-члены на защищенный пакет?

Я знаю, что вы можете использовать -repackageclasses для перемещения классов, но, похоже, -allowaccessmodification меняет модификаторы доступа на общедоступные. Цель состоит в том, чтобы запретить пользователям моей библиотеки использовать что-либо, кроме открытого общедоступного API. Любая помощь приветствуется.

Изменить: я имел в виду частный пакет, а не защищенный пакетом.


person agent8261    schedule 10.03.2016    source источник
comment
Может быть, стоит создать проект Hello World с включенным ProGuard и поделиться им на GitHub? Это уменьшит трения, чтобы помочь, поскольку люди могут раскошелиться и попробовать свои идеи?   -  person Mark    schedule 11.03.2016


Ответы (1)


Я не думаю, что вы можете, и я не думаю, что вы должны. Когда классы скомпилированы и код не изменится, ослабление квалификаторов объекта/метода не изменит схемы доступа; другими словами, объект, который успешно вызвал метод/объект protected, по-прежнему будет иметь к нему доступ, если квалификатор изменится на public. Обратное неверно; объект/метод public, который превращается в protected, может внезапно стать невидимым/недоступным для вызывающего объекта, что приведет к отображению плохо скомпилированного кода. Я использовал ProGuard раньше, но мой ответ основан на логике, а не на экспериментах.

person mohsenmadi    schedule 10.03.2016
comment
Я имел в виду, что пакет-частный не защищен. Я предполагаю (могу ошибаться), что мы могли бы создать аар, который был бы запечатан, как банка. Если бы это было так, то любые классы, не входящие в aar, не могли бы получить доступ к членам package-private. - person agent8261; 14.03.2016