ProGuard: ne peut pas trouver la classe référencée com.google.android.gms.R

Après quelques mises à jour dans le gestionnaire SDK Android, j'essaie de signer signé apk et obtenez 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 le paramètre set -dontwarn com.google.android.gms.** compilation est OK. Mais après la sortie, j'obtiens une erreur de nombreux rapports comme celui-ci (à partir de plusieurs appareils):

  • Android - Impossible de trouver des informations sur les fournisseurs pour com.google.settings dans l'exemple MapView
  • Supprimer le rembourrage du texte dans la vue des boutons
  • Afficher la mise en cache des en-têtes et des pieds de page dans une vue de liste
  • Test automatique pour Cordova / Phonegap Webview sur Android
  • TextView - comment faire la deuxième ligne indentée
  • Comment réparer Html.fromHtml link focus visibility problems (dans ICS et Honeycomb)?
  •  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 cela fonctionne-t-il?

  • Android Imageview complète l'épaisseur de l'écran
  • Comment un AsyncTask utilise-t-il encore une Activité si l'utilisateur a déjà navigué loin de là?
  • Comment tester la classe d'application avec Robolectric?
  • Problèmes avec ContactsContract.CommonDataKinds.StructuredName
  • Erreur: l'attribut "thème" a déjà été défini
  • Différences entre Jar, Android Library et Android Library Project
  • 4 Solutions collect form web for “ProGuard: ne peut pas trouver la classe référencée com.google.android.gms.R”

    Bien que l'ajout de ceci 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 la notification à jour Google Play Proguard 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; } 

    Vous devez ignorer comme vous compilez, mais vous devez également garder la classe afin 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.** 

    Si vous utilisez Proguard, vous devez suivre certaines classes GMS (Google Play Services). J'espère 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 

    J'ai rencontré un problème similaire et j'ai finalement découvert que j'avais mis à jour le module Google Play Services, mais je n'avais pas encore ajouté le module à mon module principal dans Android Studio. En ajoutant cela dans les problèmes résolus.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.