Proguard сохраняет общедоступные классы, поля и методы

Я использую Kotlin, и у меня много внутренних классов. Я хочу запутать и сжать все, кроме всех public классов.

Правила Proguard:

-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose

-optimizationpasses 5
-overloadaggressively
-repackageclasses ''
-allowaccessmodification

-keep public class * {
    public <methods>;
    public <fields>;
}

К сожалению, -keep public class * ведет себя оборонительно и сохраняет все имена, в том числе и для внутренних классов.


person Diolor    schedule 29.01.2018    source источник


Ответы (1)


Ваши правила слишком широки.

  1. Одиночный "-keep" с вложенными правилами является более широким по сравнению с комбинацией правил "-keepmembers" и "-keepclasseswithmembers".
  2. Полное правило «-keep» означает «никогда не изменять байт-код этого метода»
  3. Классы, на которые ссылаются сохраненные классы и методы, не могут быть удалены, переименованы или переупакованы.

Эта строка в ваших правилах сохраняет все ваши классы и интерфейсы:

-keep public class * {

Я имею в виду ВСЕХ. Есть ли у них публичные участники или нет.

Вместо этого используйте -keepclasseswithmembers!

Из-за этих строк

{
    public <methods>;
    public <fields>;
}

все ваши общедоступные методы останутся нетронутыми, а это означает, что переупаковка и переименование методов, на которые ссылаются ваши общедоступные методы, не могут быть выполнены!

Если вы хотите, чтобы была произведена хотя бы некоторая переупаковка, обязательно разрешите оптимизацию (поскольку переупаковка выполняется как часть этапа оптимизации):

-keepmembers,allowoptimization public class * {
    public <methods>;
    public <fields>;
}

Помимо переупаковки, это также позволит встраивать (что, в свою очередь, помогает удалять классы, которые предоставляют встроенные методы).

Кроме того, с приложениями Android вам намного лучше переупаковывать их в свой основной пакет (пакет приложения или пакет с наибольшим количеством ваших неподвижных классов) вместо пустого пакета (''). Это связано с тем, что некоторые «экспортированные» классы (Activity, Views, Services, другие вещи, на которые есть ссылки из файлов xml) не могут быть перемещены за пределы своего пакета с помощью Proguard, - aapt динамически генерирует специальные правила для предотвращения этого. Часть процесса оптимизации, которая изменяет режимы доступа с публичного на защищенный / частный, становится более эффективной, чем больше классов можно разместить вместе в одном пакете.

Я хочу запутать и сжать все, кроме всех общедоступных классов.

Плохая идея. Вам действительно следует попытаться как можно больше запутать, особенно общедоступные классы. Если вы ограничиваете обфускацию, переупаковка также ограничивается! Он бы их переименовал !!

Стремитесь к максимально конкретным правилам.

Если вы хотите предотвратить усадку:

-keep,allowoptimization,allowobfuscation public class com.example.Example

Если вы хотите предотвратить переименование, но разрешить удаление неиспользуемых классов:

-keep,allowoptimization,allowshrinking public class com.example.*

В общем, избегайте правил с подстановочными знаками (голые *) и -keep правил: предпочитайте правила для определенных классов и _10 _ / _ 11_


Правильные подходы к обфускации приложений и библиотек совершенно разные, но у них есть кое-что общее - вам не нужно заботиться о публичных методах / классах; просто запутывайте / сжимайте / переупаковывайте как можно больше, пока это не сломается.

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

Для библиотек - не применяйте Proguard к самой библиотеке (если только вы не пытаетесь добиться безопасности путем скрытности). Используйте функцию формата aar - потребительские файлы proguard - что позволяет предоставлять «сегменты» правил, которые должны соблюдаться во время окончательной обфускации приложения. .

person user1643723    schedule 30.01.2018