Как Proguard обфусцирует код?

Посмотреть в Telegram: @AndroidSobes/173
Обфускация кода – это переименование пакетов, классов, методов, полей и переменных, что позволяет усложнить исследование исходного кода программы после декомпиляции.

Proguard запускает обфускацию после удаления неиспользуемого кода. Переименовываются все компоненты программы, кроме тех, что были явно исключены в файле Proguard-правил.

После обфускации кода Proguard генерирует файл mapping.txt, который содержит маппинг новых имен к старым. Этот файл используется для декодирования обфусцированных стектрейсов. Обычно его загружают на сервис крэш-репортов (например Crashlytics), который автоматически декодирует логи.
Для ручного декодирования используется инструмент Retrace.

Proguard использует новые обфусцированные имена при каждом следующем билде. Поэтому, во-первых, надо сохранять файл mapping.txt для каждой версии программы. Во-вторых, нельзя использовать динамические имена классов как ключи для сохранения данных в персистентном хранилище.

Также обфускация делает невозможным обращение к членам класса через Reflection.
Для сохранения имен используется правило -keep.