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


71

在Android SDK Manager中进行一些更新后,我尝试使签名的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警告,并且一切正常。如何解决?


Answers:


141

尽管将其添加到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;
}

1
您的第二个建议是帮助我节省了一些Mb。谢谢!
palvarez89 '16

1
你以后奋斗的5天,血腥的眼睛感谢救了我
阿洛克

8
这仍然有意义吗?Play服务的Proguard部分说不需要特殊配置。
AsafK '18

我删除了这两行,APK的生成完全没有问题。Firebase Analytics&Invites工作正常,还没有尝试过其他任何方法。
标记

我仍然不断收到Didn't find class "com.google.android.gms.measurement.AppMeasurementInstallReferrerReceiver" on path DexPathList有关Xamarin的崩溃报告,所以我将实现这些内容,看看是否对我
Pierre

42

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

将这两行添加到您的proguard配置文件中:

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

9
这太过分了。
rds 2013年

@rds显然,它使用通配符,您可以通过提供更具体的类命名来选择所需内容。当您开始删除GMS类时,您可能会遇到很多用户崩溃的意外问题。
经过编解码

我们是否应该将keep with dontwarn用作一般我们要忽略的警告?
埃米尔(Emil)

2

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


2

如果使用proguard,则需要保留一些GMS(Google Play服务)类。希望他们用注释@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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.