Что делает восклицательный знак перед путем к классу в ProGuard?

Сейчас я изучаю Proguard, но меня смущает восклицательный знак! перед classpath в настройках, например:

-keep class !android.support.v7.view.menu.{*;}**

что делает это "!" делать? значит ли это, что proguard не сохранит этот класс? но если это так, то зачем нам это нужно, ведь proguard будет запутывать все классы?


person Qing    schedule 23.03.2016    source источник
comment
proguard.sourceforge.net/manual/usage.html#keepoptions   -  person Oleg Estekhin    schedule 23.03.2016


Ответы (1)


Это означает то же самое, что ! означает во многих других языках программирования. Это отрицает последующий выбор. Таким образом, в вашем примере директива keep будет применяться ко всему, что не в следующем выборе пакета/класса.

person Doug Stevenson    schedule 23.03.2016
comment
спасибо, Дуг, значит ли это, что если в моем конфигурационном файле нет ничего, proguard будет запутывать все классы? - person Qing; 23.03.2016
comment
Да, ProGuard попытается запутать настолько, насколько это возможно. Однако в вашем проекте должны быть как минимум правила Android по умолчанию, иначе они, вероятно, не будут работать после обфускации. - person Doug Stevenson; 23.03.2016
comment
спасибо, чувак, последний вопрос к тебе, у меня есть эта строка правил 1.-keep class !android.support.v7.view.menu.**{;} и она запутает класс MenuBuilder в этом пакете, но после добавления этой строки правила #-keep interface android.support.v7.* { *; } класс MenuBuilder не обфусцирован, однако я не вижу здесь конфликта. не могли бы вы объяснить немного больше? Большое спасибо - person Qing; 23.03.2016
comment
Я вообще не понимаю, почему линия имеет значение. Просто удалите его и убедитесь сами, работают ли вещи, использующие MenuBuilder, так, как вы ожидаете. - person Doug Stevenson; 23.03.2016