web-dev-qa-db-fra.com

ProGuard: impossible de trouver la classe référencée com.google.Android.gms.R

Après quelques mises à jour dans le gestionnaire de SDK Android, j'essaie de créer une apk signée et d'obtenir ceci: 

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.

Si défini -dontwarn com.google.Android.gms.** la compilation est OK. Mais après l'exécution, de nombreux rapports comme celui-ci (provenant de nombreux périphériques) sont générés:

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

Sur mes appareils tout va bien. Avant la mise à jour, je n'ai pas les avertissements ProGuard et tout fonctionne parfaitement. Comment ça marche?

64
Bred P.

Bien que l'ajout de cela au fichier proguard-project.txt fonctionne, il conserve toutes les classes.

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

Je préfère cela, ce qui rend la taille du fichier apk beaucoup plus petite:

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

Notez également les notifications Google Play Proguard à jour ici: 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;
}
130
trante

Vous devez ignorer la compilation, mais vous devez également conserver la classe pour qu'elle puisse la trouver pendant l'exécution. 

Ajoutez ces deux lignes à votre fichier de configuration proguard:

-keep class com.google.Android.gms.** { *; }
-dontwarn com.google.Android.gms.**
40
Codeversed

Je suis tombé sur un problème similaire et j'ai finalement découvert que j'avais mis à jour le module de services Google Play, mais je n'avais pas ajouté le module à mon module principal dans Android Studio. L'ajout de cette résolution à résolu mes problèmes.

2
drspaceboo

Si vous utilisez proguard, vous devez conserver certaines classes GMS (services Google Play). Espérons qu'ils sont annotés avec @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
2
rds