Android ProGuard: Самые Агрессивные Оптимизации
официальный Android proguard documentation показывает две основные оптимизации:
- set
minifyEnabled
доtrue
- использовать
proguard-android-optimize.txt
вместоproguard-android.txt
эти две самые агрессивные настройки?
Я пишу библиотеку android и должен убедиться, когда люди используют мою библиотеку, что мой код не ломается. (Я знаю, что есть правила, которые я могу поместить в свою библиотеку, чтобы противостоять конфигурации proguard установите приложение, которое использует библиотеку, но я не хочу этого делать, если мне это не нужно.)
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 fromabcdef
до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 (см. инструкцию должны быть дополнительные информация.)