Что такое обфускация кода и зачем она нужна
Что проверяют
Понимаете ли вы, что в Android обфускация это часть сборки релиза, а не отдельная мера защиты. Спрашивают обычно, чтобы выяснить, настраивали ли вы правила сокращения кода сами и что делали, когда после включения приложение падало только в релизной сборке.
Как отвечать
Начните с того, что в современной сборке этим занимается один инструмент, R8, и делает он три разные вещи сразу: удаляет недостижимый код и ресурсы, переименовывает классы, методы и поля в короткие имена, встраивает и оптимизирует. Включается всё это флагом сокращения в конфигурации релизной сборки, правила лежат в файле проекта.
Что обфускация даёт на практике: размер приложения заметно падает, читаемость декомпилированного кода падает ещё сильнее. Чего не даёт: защиты секретов. Ключ, зашитый в код, после переименования никуда не девается и достаётся из пакета простым поиском строк, а закрывают эту дыру серверные проверки, не обфускация.
Дальше говорите про правила, это рабочая часть темы. Всё, к чему обращаются не по имени из кода, надо явно сохранять:
классы, создаваемые рефлексией, и поля, по которым библиотека сериализации сопоставляет JSON;
точки входа из манифеста и всё, что дёргает нативный слой;
имена, на которые завязаны сторонние SDK.
И обязательно про карту переименования: файл соответствия имён нужно сохранять для каждой сборки и загружать в систему сбора падений, иначе релизные стектрейсы нечитаемы, а восстановить их задним числом уже нечем.
Где спотыкаются
Включают сокращение перед самым релизом. Падения из-за рефлексии и сериализации вылезают только в релизной конфигурации, поэтому гонять её надо теми же тестами и заранее, а не в день публикации.
Пишут правило, сохраняющее весь пакет приложения целиком. Формально сборка чинится, фактически от оптимизации не остаётся ничего, и честнее найти конкретный класс, которому нужна защита от переименования.
Считают обфускацию защитой от реверс-инжиниринга. Она замедляет чтение кода, но не мешает перехватить трафик, подменить ответ или снять данные с устройства, поэтому всё, что должно быть проверено, проверяется на сервере.