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

在 Android SDK 管理器中进行了一些更新之后,我尝试制作一个带签名的 apk,得到如下结果:

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 警告和所有工作完美。它如何修复?

58311 次浏览

您需要像编译一样忽略这个类,但是您还需要保留这个类,以便它能够在运行时找到它。

将以下两行添加到前卫配置文件:

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

我遇到了一个类似的问题,最终发现我已经更新了 Google Play Services 模块,但是我没有将该模块重新添加到 Android Studio 的主模块中。把它加回去解决了我的问题。

尽管将此类添加到 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.**

此外,请注意最新的谷歌发挥前卫通知在这里: 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;
}

如果你使用前卫,你需要保留一些 GMS (谷歌播放服务)类。希望他们与 @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