Intereting Posts
Как вы можете динамически обновлять цвет SeekBar? Android Studio не может связываться с локальным 8602 для отладчика Виртуальные сообщения Google – множественное устройство с несколькими учетными записями OpenGL ES – текстура отображает все грани 8 вершинного куба? Поиск AR с библиотекой распознавания изображений Создание неопределенного шага прогресса на ActionBar Загрузить фотографию в галерее в виде растрового объекта в Android Услуга Webservice не работает после переключения между Wi-Fi и 3G или 3G на Wi-Fi Сделайте снимок с html5 Фрагменты Android: когда использовать скрыть / показать или добавить / удалить / заменить? Как войти в исходный код ОС Android при отладке? Android accessibilityservice whan screen off Учебник «Hello, WebView» открывает запрошенный адрес в браузере Android, а не в моем веб-просмотре Интерфейс обновления OkHTTP от обратного вызова очереди Android: нужно изменить цвет фона прядильщика

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

Официальная документация официального сайта Android показывает две основные оптимизации:

  • Set minifyEnabled to true
  • Используйте proguard-android-optimize.txt вместо proguard-android.txt

Являются ли эти две наиболее агрессивными возможными настройками?

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

Помните, что лучшая конфигурация 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/* This – список возможных вариантов оптимизации! Означает отрицание, поэтому эта оптимизация не используется

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

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

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

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

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

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

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

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

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

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

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

 -renamesourcefileattribute SourceFile -keepattributes SourceFile,LineNumberTable 

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

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

Согласно комментарию из файла оптимизации, оптимизации приводят к определенным рискам, и если они используются, приложение должно быть тщательно протестировано. Согласно моему опыту, необходимо отключить код / ​​упрощение / расширенный, поскольку он вызвал конечные локальные переменные, которые были инициализированы вне лямбда, которые были NULL внутри лямбда. Было очень сложно отлаживать и находить. Поэтому мои настройки оптимизации следующие:

-optimizations! Code / simplification / cast,! Code / simplification / advanced,! Field / * ,! class / merging / * ,! метод / удаление / параметр,! Метод / распространение / параметр

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