ProGuard:找不到引用类com.google.android.gms.R

在Android SDKpipe理器中进行了一些更新之后,

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. 

如果设置-dontwarn com.google.android.gms.**编译是可以的。 但运行后,我得到许多这样的报告(来自许多设备)的错误:

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

在我的设备上一切正常。 更新之前,我没有ProGuard的警告,所有的工作都很完美。 它如何修复?

尽pipe将此添加到proguard-project.txt文件中,它将保留所有类。

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

我更喜欢这个,这使得apk文件的大小要小得多:

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

此外,请注意Google Play Proguard的最新通知: 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; } 

你需要忽略像你正在编译,但你也需要保持这个类,以便它可以在运行时find它。

将这两行添加到您的proguardconfiguration文件中:

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

如果你使用proguard,你需要保留一些GMS(Google Play Services)类。 希望他们用@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 

我遇到了类似的问题,最终发现我已经更新了Google Play服务模块,但是我没有将模块重新添加到Android Studio的主模块中。 添加回来解决我的问题。