2013-09-05 17 views
49

Po kilku zmianach w Menedżerze Android SDK próbuję zrobić podpisaną apk i uzyskać w ten sposób:ProGuard: nie można odnaleźć odwołuje klasę 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. 

Jeśli ustawione -dontwarn com.google.android.gms.** kompilacja jest OK. Ale po uruchomieniu otrzymuję komunikat o błędzie wiele takich raportów (z wielu urządzeń):

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

Na moich urządzeniach wszystko w porządku. Przed aktualizacją nie mam ostrzeżeń ProGuard i wszystkie działają idealnie. Jak to naprawić?

Odpowiedz

29

Musisz zignorować, tak jak kompilujesz, ale musisz także zachować klasę, aby mogła znaleźć ją podczas uruchamiania.

Dodaj te dwie linie do pliku konfiguracyjnego PROGUARD:

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

To zdecydowanie za dużo. – rds

+0

@rds Oczywiście używa on symbolu wieloznacznego i możesz wybrać, co chcesz, zapewniając bardziej szczegółowe nazewnictwo klas. Gdy zaczniesz wycinać klasy GMS, możesz napotkać wiele nieoczekiwanych problemów z wypadkami użytkowników. – Codeversed

+0

czy powinniśmy używać keep with dontwarn w ogóle dla ostrzeżenia, które chcemy zignorować? – batmaci

1

natknąłem się na podobny problem i ostatecznie odkrył, że miałem zaktualizowane Usługi Google Play moduł jednak ja nie ponownie dodany moduł do mój główny moduł w Android Studio. Dodanie tego z powrotem rozwiązało moje problemy.

97

Mimo że dodanie tego do pliku proguard-project.txt działa, zachowuje wszystkie klasy.

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

Wolę to, co sprawia, że ​​rozmiar pliku apk znacznie mniejszy:

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

pamiętać również aktualne Google Play PROGUARD zgłoszenie tutaj: 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

Pomógł mi zapisać kilka Mb z drugą sugestią. Dzięki! – palvarez89

+0

uratowałeś mnie po 5 dniach zmagań i krwawych oczu dzięki – Alok

+1

czy to nadal ma znaczenie? sekcja proguardów gier mówi, że nie jest wymagana żadna specjalna konfiguracja. – AsafK

2

Jeśli używasz ProGuard, musisz zachować niektóre klasy GMS (Usługi Google Play). Mam nadzieję, że są one opatrzone przypisami z @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