Подтвердить что ты не робот

ProGuard: невозможно найти ссылочный класс com.google.android.gms.R

После некоторых обновлений в Android SDK manager я попытаюсь сделать подписанный apk и получить следующее:

ProGuard: [] Warning: com.google.android.gms.auth.GoogleAuthUtil: 
  can't find referenced class com.google.android.gms.R
ProGuard: [] Warning: com.google.android.gms.auth.GoogleAuthUtil: 
  can't find referenced class com.google.android.gms.R$string
...
etc.

Если set -dontwarn com.google.android.gms.** компиляция в порядке. Но после запуска я получаю ошибку для многих отчетов вроде этого (со многих устройств):

Caused by: android.view.InflateException: Binary XML file line #32: 
  Error inflating class com.google.android.gms.common.SignInButton

На моих устройствах все нормально. Перед обновлением у меня нет предупреждений ProGuard, и все работает отлично. Как это исправить?

4b9b3361

Ответ 1

Хотя добавление этого файла в файл proguard-project.txt работает, он сохраняет все классы.

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

Я предпочитаю это, что делает размер файла apk намного меньше:

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

Также обратите внимание на уведомление Google Play Proguard: http://developer.android.com/google/play-services/setup.html#Proguard

-keep class * extends java.util.ListResourceBundle {
    protected Object[][] getContents();
}

-keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable {
    public static final *** NULL;
}

-keepnames @com.google.android.gms.common.annotation.KeepName class *
-keepclassmembernames class * {
    @com.google.android.gms.common.annotation.KeepName *;
}

-keepnames class * implements android.os.Parcelable {
    public static final ** CREATOR;
}

Ответ 2

Вам нужно игнорировать, как вы компилируете, но вам также нужно сохранить класс, чтобы он мог найти его во время выполнения.

Добавьте эти две строки в конфигурационный файл proguard:

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

Ответ 3

Если вы используете proguard, вам нужно сохранить некоторые классы GMS (Google Play Services). Надеемся, что они аннотируются с помощью @com.google.android.gms.common.annotation.KeepName.

# Proguard config for project using GMS

-keepnames @com.google.android.gms.common.annotation.KeepName class
    com.google.android.gms.**,
    com.google.ads.**

-keepclassmembernames class
    com.google.android.gms.**,
    com.google.ads.** {
    @com.google.android.gms.common.annotation.KeepName *;
}

# Called by introspection
-keep class
    com.google.android.gms.**,
    com.google.ads.**
    extends java.util.ListResourceBundle {
    protected java.lang.Object[][] getContents();
}


# This keeps the class name as well as the creator field, because the
# "safe parcelable" can require them during unmarshalling.
-keepnames class
    com.google.android.gms.**,
    com.google.ads.**
    implements android.os.Parcelable {
    public static final ** CREATOR;
}

# com.google.android.gms.auth.api.signin.SignInApiOptions$Builder
# references these classes but no implementation is provided.
-dontnote com.facebook.Session
-dontnote com.facebook.FacebookSdk
-keepnames class com.facebook.Session {}
-keepnames class com.facebook.FacebookSdk {}

# android.app.Notification.setLatestEventInfo() was removed in
# Marsmallow, but is still referenced (safely)
-dontwarn com.google.android.gms.common.GooglePlayServicesUtil

Ответ 4

Я столкнулся с подобной проблемой и, в конце концов, обнаружил, что обновил модуль Google Play Services, но не добавил модуль в свой основной модуль в Android Studio. Добавив это в разрешенные проблемы.