2013-09-05 19 views
49

Dopo alcuni aggiornamenti a Android SDK Manager provo fare apk firmato e ottenere questo:ProGuard: impossibile trovare la classe di riferimento com.google.android.gms.R

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. 

Se impostato -dontwarn com.google.android.gms.** compilazione è OK. Ma dopo l'esecuzione ottengo errore molti rapporti come questo (da molti dispositivi):

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

Sui miei dispositivi tutto ok. Prima dell'aggiornamento non ho avvisi ProGuard e tutto funziona perfettamente. Come si risolve?

risposta

29

È necessario ignorare come si sta compilando, ma è anche necessario mantenere la classe in modo che possa trovarla durante il runtime.

Aggiungere queste due righe al file di configurazione Proguard:

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

Questo mantiene troppo. – rds

+0

@rds Ovviamente utilizza un carattere jolly e puoi scegliere quello che desideri fornendo una denominazione di classe più specifica. Quando inizi a tagliare le classi GMS, puoi incontrare un sacco di problemi inaspettati con gli arresti anomali dell'utente. – Codeversed

+0

dovremmo usare tenere con dontwarn in generale per qualsiasi avviso che vogliamo ignorare? – batmaci

1

mi sono imbattuto in un problema simile e alla fine ha scoperto che avevo aggiornato il Google Play Services modulo tuttavia non avevo ri-aggiunto il modulo per il mio modulo principale in Android Studio. Aggiungendo questo in risolto i miei problemi.

97

Sebbene l'aggiunta al file proguard-project.txt funzioni, mantiene tutte le classi.

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

preferisco questo, che rende la dimensione del file apk molto più piccole:

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

noti inoltre aggiornato Google Play notifica Proguard qui: 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; 
} 
+1

Mi hai aiutato a risparmiare qualche Mb con il tuo secondo suggerimento. Grazie! – palvarez89

+0

mi hai salvato dopo 5 giorni di lotta e occhi insanguinati, grazie – Alok

+1

è ancora rilevante? la sezione proguard dei servizi di gioco dice che non è necessaria alcuna configurazione speciale. – AsafK

2

Se si utilizza Proguard, è necessario mantenere alcune classi GMS (Google Play Services). Si spera che siano annotati con @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 
Problemi correlati