How to define MultiDex and ProGuard rules in order to prevent "NoClassDefFoundError" in Android using GooglePlus login?

Viewed 135

My game has an GooglePlus button to let users login with Google. After pressing the button, it shows a popup that contains user's Google accounts. After selecting one of them, app crashes.

This crash shows up after I upgraded all Google Play dependencies from version 10.2.1 to 16.0.0. My game uses both MultiDex and ProGuard.

Probably, I need to add rules in multidex's keep and proguard's config files. I tried my best but couldn't find a solution.

Here are logs:

Fatal Exception: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/gms/plus/internal/zzg;
       at com.google.android.gms.plus.internal.zzh.createServiceInterface(Unknown Source)
       at com.google.android.gms.common.internal.BaseGmsClient$zzf.zzm(Unknown Source:17)
       at com.google.android.gms.common.internal.BaseGmsClient$zza.zza(Unknown Source:12)
       at com.google.android.gms.common.internal.BaseGmsClient$zzc.zzo(Unknown Source:11)
       at com.google.android.gms.common.internal.BaseGmsClient$zzb.handleMessage(Unknown Source:48)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:154)
       at android.app.ActivityThread.main(ActivityThread.java:6316)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:872)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:762)

Caused by java.lang.ClassNotFoundException: com.google.android.gms.plus.internal.zzg
       at java.lang.VMClassLoader.findLoadedClass(VMClassLoader.java)
       at java.lang.ClassLoader.findLoadedClass(ClassLoader.java:742)
       at java.lang.ClassLoader.loadClass(ClassLoader.java:362)
       at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
       at com.google.android.gms.plus.internal.zzh.createServiceInterface(Unknown Source)
       at com.google.android.gms.common.internal.BaseGmsClient$zzf.zzm(Unknown Source:17)
       at com.google.android.gms.common.internal.BaseGmsClient$zza.zza(Unknown Source:12)
       at com.google.android.gms.common.internal.BaseGmsClient$zzc.zzo(Unknown Source:11)
       at com.google.android.gms.common.internal.BaseGmsClient$zzb.handleMessage(Unknown Source:48)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:154)
       at android.app.ActivityThread.main(ActivityThread.java:6316)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:872)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:762)

Caused by java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/gms/internal/plus/zza;
       at com.google.android.gms.plus.internal.zzh.createServiceInterface(Unknown Source)
       at com.google.android.gms.common.internal.BaseGmsClient$zzf.zzm(Unknown Source:17)
       at com.google.android.gms.common.internal.BaseGmsClient$zza.zza(Unknown Source:12)
       at com.google.android.gms.common.internal.BaseGmsClient$zzc.zzo(Unknown Source:11)
       at com.google.android.gms.common.internal.BaseGmsClient$zzb.handleMessage(Unknown Source:48)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:154)
       at android.app.ActivityThread.main(ActivityThread.java:6316)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:872)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:762)


Caused by java.lang.ClassNotFoundException: Didn't find class "com.google.android.gms.internal.plus.zza" on path: DexPathList[[zip file "/data/app/com.example.mobile.example.android-2/base.apk"],nativeLibraryDirectories=[/data/app/com.example.mobile.example.android-2/lib/arm, /data/app/com.example.mobile.example.android-2/base.apk!/lib/armeabi-v7a, /system/lib, /vendor/lib]]
       at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
       at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
       at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
       at com.google.android.gms.plus.internal.zzh.createServiceInterface(Unknown Source)
       at com.google.android.gms.common.internal.BaseGmsClient$zzf.zzm(Unknown Source:17)
       at com.google.android.gms.common.internal.BaseGmsClient$zza.zza(Unknown Source:12)
       at com.google.android.gms.common.internal.BaseGmsClient$zzc.zzo(Unknown Source:11)
       at com.google.android.gms.common.internal.BaseGmsClient$zzb.handleMessage(Unknown Source:48)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:154)
       at android.app.ActivityThread.main(ActivityThread.java:6316)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:872)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:762)

Google's documentation says that below:

Note: ProGuard directives are included in the Play services client libraries to preserve the required classes. The Android Plugin for Gradle automatically appends ProGuard configuration files in an AAR (Android ARchive) package and appends that package to your ProGuard configuration. During project creation, Android Studio automatically creates the ProGuard configuration files and build.gradle properties for ProGuard use. To use ProGuard with Android Studio, you must enable the ProGuard setting in your build.gradle buildTypes. For more information, see the ProGuard guide.

Any suggestions?

0 Answers
Related