Как исключать файлы из обфускации в ProGuard
Что проверяют
Знаете ли вы, что в современных Android-проектах сжатие и обфускацию делает R8, а правила пишутся в синтаксисе ProGuard, и понимаете ли, какой код ломается от переименования. Следом почти всегда спрашивают, как читать краш из релизной сборки.
Как отвечать
Сразу уточните: начиная с AGP 3.4 по умолчанию работает R8, он читает тот же proguard-rules.pro. Включается через isMinifyEnabled = true в buildTypes.release, базовые правила подключает getDefaultProguardFile("proguard-android-optimize.txt"). С AGP 8.0 R8 по умолчанию работает в full mode, и старые правила могут перестать удерживать нужное.
Исключают из обфускации то, к чему обращаются по имени: рефлексия, Gson без кодогенерации, JNI, методы с @JavascriptInterface для WebView. Правила различаются по силе:
-keep: например-keep class com.app.model.** { *; }, пакет не удаляется и не переименовывается вместе со всеми членами;-keepnames: запрещает только переименование, неиспользуемый код R8 всё равно выкинет;-keepclassmembers: сохраняет члены, если сам класс остался, типичный случай для полей моделей;- *`-keepattributes Signature, Annotation`*: без этого Gson теряет дженерики и
@SerializedName; @Keepизandroidx.annotation: точечно на класс или метод, правило для аннотации уже есть в стандартном конфиге;-dontobfuscate: выключает переименование глобально, годится для отладки, но не для релиза.
Библиотека кладёт свои правила в consumerProguardFiles, и они приезжают в приложение сами. Результат проверяют по mapping.txt в build/outputs/mapping/release/ и директивой -whyareyoukeeping. Тот же mapping.txt нужен Play Console и Crashlytics, иначе стектрейсы останутся нечитаемыми.
Где спотыкаются
Пишут -keep class com.app.** { *; } на всё приложение. Краш уходит, но вместе с ним и почти весь смысл сжатия.
Путают -keep и -keepnames и удивляются, почему класс, который создаётся только через рефлексию, исчез из сборки.
Тестируют только debug. Минификация включена в release, и поломка сериализации впервые проявляется у пользователей. Релизную сборку нужно прогнать хотя бы смоук-тестами до выкладки.