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?
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;
}
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.**
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.
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