Android ProGuard: Самые Агрессивные Оптимизации


официальный Android proguard documentation показывает две основные оптимизации:

  • set minifyEnabled до true
  • использовать proguard-android-optimize.txt вместо proguard-android.txt

эти две самые агрессивные настройки?

Я пишу библиотеку android и должен убедиться, когда люди используют мою библиотеку, что мой код не ломается. (Я знаю, что есть правила, которые я могу поместить в свою библиотеку, чтобы противостоять конфигурации proguard установите приложение, которое использует библиотеку, но я не хочу этого делать, если мне это не нужно.)

2 52

2 ответа:

помните, что лучшая конфигурация ProGuard - это конфигурация с минимумом исключений. Под исключениями я понимаю:

 -keepclassmembers class * extends android.content.Context {
    public void *(android.view.View);
    public void *(android.view.MenuItem);
 }

давайте пройдемся по proguard-android-optimize.txt и посмотрите на опции оптимизации/обфускации.

для подробного описания параметров ProGuard я использую этой

-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/* этой - список возможных оптимизации ! значит отрицают, так что такой оптимизации нет используется

-optimizationpasses 5 Указывает количество проходов оптимизации, которые необходимо выполнить. По умолчанию, выполняется один проход. Несколько проходов могут привести к дальнейшим улучшениям. Если после прохождения оптимизации улучшений не обнаружено, оптимизация завершается. Применимо только при оптимизации.
Использование:ОК и похоже, что по умолчанию 5 проходит достаточно

-allowaccessmodification Указывает, что модификаторы доступа классов и членов класса могут быть расширяется во время обработки. Это может улучшить результаты шага оптимизации.
Использование:ОК, да похоже улучшить оптимизацию

-dontpreverify При таргетинге на Android предварительная проверка не требуется, поэтому dontpreverify отключает ее, чтобы немного сократить время обработки. Но эта опция не влияет на неразрывность кода.
Использование:ОК, просто немного reduse время обработки

-dontusemixedcaseclassnames Указывает, что не нужно создание смешанных имен классов при запутывании. По умолчанию запутанные имена классов могут содержать сочетание символов верхнего и нижнего регистра. Это создает совершенно приемлемые и годные к употреблению опарникы.
Использование:сомнения, я не могу найти точную причину, почему эта опция добавлена, но похоже, что имя класса change from abcdef до AbSdEf не делает код нерушимым

-dontskipnonpubliclibraryclasses Указывает, что не следует игнорировать непубличные библиотечные классы. Начиная с версии 4.5, это значение по умолчанию.
Использование:ОК, очень полезным

следующие параметры не включены в proguard-android-optimize.txt:

-mergeinterfacesaggressively Указывает, что интерфейсы могут быть объединены, даже если их реализующие классы не реализуют все методы интерфейса... установка этого параметра может снизить производительность обрабатываемого кода на некоторых JVMs
Использование:плохо, выглядят опасными для Android, не включены в конфиг, сумма запрета класса / слияния / в оптимизациях

-overloadaggressively Указывает на применение агрессивной перегрузки при запутывании. Затем несколько полей и методов могут получить одинаковые имена, если их аргументы и возвращаемые типы различны, как того требует байт-код Java (а не только их аргументы, как того требует язык Java)
Использование:плохо, Google Dalvik VM не может обрабатывать перегруженные статические поля.

-repackageclasses '' Задает переупаковку всех переименованных файлов классов, перемещая их в один данный пакет. Без аргумента или с пустой строкой ("), пакет удаляется полностью. Этот параметр переопределяет параметр-flattenpackagehierarchy.
Использование:ОК, используется Google, так что, похоже, мы по крайней мере нашли вариант, который мы можем добавить в нашу конфигурацию

поэтому я знаю только еще один полезный для обфускации и не опасный вариант:
-repackageclasses ''

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

-renamesourcefileattribute SourceFile 
-keepattributes SourceFile,LineNumberTable

это сохранит номера строк, но заменит имя файла в stacktrace на "SourceFile".

также не забывайте, что ProGuard выглядит уязвимым, потому что он не шифрует строковые ресурсы, поэтому рассмотрите возможность использования DexGuard или шифрования важных строк (например, токенов, URL-адресов).

согласно комментарию из файла оптимизации, оптимизация представляет определенные риски, и если используется, приложение должно быть тщательно протестировано. По моему опыту, необходимо отключить code / simplification / advanced, потому что это вызвало окончательные локальные переменные, которые были инициализированы вне лямбды, являющейся нулем внутри лямбды. Это было очень трудно отладить и найти. Поэтому мои настройки оптимизации следующие:

-оптимизация !код / упрощение / приведение,!код / упрощение / расширенный,!поле/*,!класс / слияние/*,!метод / удаление / параметр,!метод / распространение / параметр

обратите внимание, что код/упрощение/арифметика также должны быть отключены, если вы нацелены на Android 2.0 и ниже (что очень маловероятно). Кроме того, мне также пришлось отключить метод / удаление / параметр и метод / распространение / параметр, потому что они неявно включают код / упрощение / advanced (см. инструкцию должны быть дополнительные информация.)