Proguard и com.google.android.gms.common.api.internal.BasePendingResult $ ReleasableResultGuardian - PullRequest
2 голосов
/ 01 июня 2019

play-services-base-16.0.1.aar ( mvnrepository ) имеет proguard.txt со следующим содержанием:

# b/35135904 Ensure that proguard will not strip the mResultGuardian.
-keepclassmembers class com.google.android.gms.common.api.internal.BasePendingResult {
  com.google.android.gms.common.api.internal.BasePendingResult$ReleasableResultGuardian mResultGuardian;
}

Но в classes.jar вы можете видеть, что тип mResultGuardian уже запутан до BasePendingResult.zaa. Я думаю, именно поэтому я получаю

Note: the configuration refers to the unknown class 'com.google.android.gms.common.api.internal.BasePendingResult$ReleasableResultGuardian'

Как это должно работать? Я новичок в Proguard и имею только очень базовое понимание того, что происходит, поэтому, пожалуйста, сделайте ваши ответы простыми:)

Детали проекта:

gradlew version: 5.4
build plugin: com.android.tools.build:gradle:3.2.0

К сожалению, сейчас я не могу обновить плагин gradle до 3.3.* или 3.4.*, потому что некоторые скрипты несовместимы и требуют значительного рефакторинга.

app/proguard.txt (из рекомендаций, которые я видел):

-keep class com.google.android.gms.analytics.** { *; }
-keep class com.google.android.gms.gcm.** { *; }
-dontwarn com.google.android.gms.**

Но это не помогает.

UPD

Я заканчиваю тем, что обновляюсь до com.android.tools.build:gradle:3.4.1 (некоторые изменения API должны были быть адаптированы), что решило проблему, но я все еще не понимаю, как это должно работать с такими правилами.

1 Ответ

0 голосов
/ 19 июня 2019

«Если proguard настроен в вашем проекте, он выполняет некоторые задачи для нас в процессе сборки: минификация, запутывание, переупаковка и оптимизация.Включить его просто, если вы используете gradle, просто установите для minifyEnabled значение true для вашего выпуска buildType в build.gradle и передайте набор правил оптимизации для Android по умолчанию.

Это поможет уменьшить, ускорить и защититьваше приложение.Однако в основном он работает, удаляя код, который никогда не вызывается, и переименовывая то, что осталось.Это все хорошо, пока не встретишь отражение.Reflection позволяет вам писать код, который может искать и выполнять другой код на основе его имени (помимо прочего) »*

« Вы также можете использовать ProGuard, если вы или любая из библиотек в вашем приложении используете отражение, здесь выукажите правила, относительно которых классы, методы и другие части вашего приложения ProGuard должны оставлять в покое.Вы можете перечислить все эти правила в файле и передать их ProGuard через метод proguardFiles обратно в свой build.gradle.Общее соглашение заключается в том, чтобы этот файл назывался proguard-rules.pro »

Эти doc1 , doc2 предоставляют вам дополнительную информацию о том, как работать с правилами

...