web-dev-qa-db-ja.com

ProGuard:参照クラスcom.google.Android.gms.Rが見つかりません

Android SDK manager

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.**コンパイルはOKです。しかし、実行後、次のような多くのレポートでエラーが発生します(多くのデバイスから)。

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

私のデバイスではすべて大丈夫です。更新する前に、ProGuardの警告は表示されず、すべて正常に動作します。修正方法

69
Bred P.

これを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;
}
135
trante

コンパイル中のように無視する必要がありますが、実行時にクラスを見つけられるようにクラスを保持する必要もあります。

次の2行をproguard構成ファイルに追加します。

-keep class com.google.Android.gms.** { *; }
-dontwarn com.google.Android.gms.**
40
Codeversed

私は同様の問題に遭遇し、最終的にGoogle Play Servicesモジュールを更新したことを発見しましたが、Android Studio。でメインモジュールにモジュールを再追加していない。私の問題。

2
drspaceboo

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
2
rds