Search code examples
androidproguardgoogle-vision

ClassNotFound GoogleApiAvailability when proguard is used


I am creating an android aar in which I am using google's vision API. To check if Play Services are available or not I have added check using GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context).

For excluding this from obfuscation I have added

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

I am getting this error when obfuscated:

07-11 00:36:50.970 26184-26184/com.example.anujakothekar.myapplication 

I/zygote: Rejecting re-init on previously-failed class java.lang.Class<com.example.textscan.scanner.camera.b>: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/gms/vision/Detector$Processor;
07-11 00:36:50.970 26184-26184/com.example.anujakothekar.myapplication I/zygote:     at java.lang.Object java.lang.Class.newInstance() (Class.java:-2)
07-11 00:36:50.970 26184-26184/com.example.anujakothekar.myapplication I/zygote:     at android.app.Activity android.app.Instrumentation.newActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent) (Instrumentation.java:1173)
07-11 00:36:50.970 26184-26184/com.example.anujakothekar.myapplication I/zygote:     at android.app.Activity android.app.ActivityThread.performLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent) (ActivityThread.java:2708)
07-11 00:36:50.970 26184-26184/com.example.anujakothekar.myapplication I/zygote:     at void android.app.ActivityThread.handleLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:2892)
07-11 00:36:50.970 26184-26184/com.example.anujakothekar.myapplication I/zygote:     at void android.app.ActivityThread.-wrap11(android.app.ActivityThread, android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:-1)
07-11 00:36:50.970 26184-26184/com.example.anujakothekar.myapplication I/zygote:     at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1593)
07-11 00:36:50.970 26184-26184/com.example.anujakothekar.myapplication I/zygote:     at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:105)
07-11 00:36:50.972 26184-26184/com.example.anujakothekar.myapplication I/zygote:     at void android.os.Looper.loop() (Looper.java:164)
07-11 00:36:50.972 26184-26184/com.example.anujakothekar.myapplication I/zygote:     at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6540)
07-11 00:36:50.972 26184-26184/com.example.anujakothekar.myapplication I/zygote:     at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:-2)
07-11 00:36:50.972 26184-26184/com.example.anujakothekar.myapplication I/zygote:     at void com.android.internal.os.Zygote$MethodAndArgsCaller.run() (Zygote.java:240)
07-11 00:36:50.972 26184-26184/com.example.anujakothekar.myapplication I/zygote:     at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:767)
07-11 00:36:50.972 26184-26184/com.example.anujakothekar.myapplication I/zygote: Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.android.gms.vision.Detector$Processor" on path: DexPathList[[zip file "/data/app/com.example.anujakothekar.myapplication-tunZSOorubmtNQccOZwWPw==/base.apk", zip file "/data/app/com.example.anujakothekar.myapplication-tunZSOorubmtNQccOZwWPw==/split_lib_dependencies_apk.apk", zip file "/data/app/com.example.anujakothekar.myapplication-tunZSOorubmtNQccOZwWPw==/split_lib_slice_0_apk.apk", zip file "/data/app/com.example.anujakothekar.myapplication-tunZSOorubmtNQccOZwWPw==/split_lib_slice_1_apk.apk", zip file "/data/app/com.example.anujakothekar.myapplication-tunZSOorubmtNQccOZwWPw==/split_lib_slice_2_apk.apk", zip file "/data/app/com.example.anujakothekar.myapplication-tunZSOorubmtNQccOZwWPw==/split_lib_slice_3_apk.apk", zip file "/data/app/com.example.anujakothekar.myapplication-tunZSOorubmtNQccOZwWPw==/split_lib_slice_4_apk.apk", zip file "/data/app/com.example.anujakothekar.myapplication-tunZSOorubmtNQccOZwWPw==/split_lib_slice_5_apk.a
07-11 00:36:50.972 26184-26184/com.example.anujakothekar.myapplication I/zygote:     at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:93)
07-11 00:36:50.972 26184-26184/com.example.anujakothekar.myapplication I/zygote:     at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:379)
07-11 00:36:50.972 26184-26184/com.example.anujakothekar.myapplication I/zygote:     at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312)
07-11 00:36:50.972 26184-26184/com.example.anujakothekar.myapplication I/zygote:     at java.lang.Object java.lang.Class.newInstance() (Class.java:-2)
07-11 00:36:50.972 26184-26184/com.example.anujakothekar.myapplication I/zygote:     at android.app.Activity android.app.Instrumentation.newActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent) (Instrumentation.java:1173)
07-11 00:36:50.972 26184-26184/com.example.anujakothekar.myapplication I/zygote:     at android.app.Activity android.app.ActivityThread.performLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent) (ActivityThread.java:2708)
07-11 00:36:50.972 26184-26184/com.example.anujakothekar.myapplication I/zygote:     at void android.app.ActivityThread.handleLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:2892)
07-11 00:36:50.972 26184-26184/com.example.anujakothekar.myapplication I/zygote:     at void android.app.ActivityThread.-wrap11(android.app.ActivityThread, android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:-1)
07-11 00:36:50.972 26184-26184/com.example.anujakothekar.myapplication I/zygote:     at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1593)
07-11 00:36:50.972 26184-26184/com.example.anujakothekar.myapplication I/zygote:     at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:105)
07-11 00:36:50.972 26184-26184/com.example.anujakothekar.myapplication I/zygote:     at void android.os.Looper.loop() (Looper.java:164)
07-11 00:36:50.972 26184-26184/com.example.anujakothekar.myapplication I/zygote:     at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6540)
07-11 00:36:50.972 26184-26184/com.example.anujakothekar.myapplication I/zygote:     at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:-2)
07-11 00:36:50.972 26184-26184/com.example.anujakothekar.myapplication I/zygote:     at void com.android.internal.os.Zygote$MethodAndArgsCaller.run() (Zygote.java:240)
07-11 00:36:50.972 26184-26184/com.example.anujakothekar.myapplication I/zygote:     at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:767)

Update: When I am using playservices dependency in project where this aar is also imported, then my code is working perfectly. Is there any way, to avoid adding playservices dependency in project and just use it from aar?


Solution

  • The directive

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

    makes ProGuard keep all classes in the com.google.android.gms.vision but not interfaces like com.google.android.gms.vision.Detector$Processor.

    Adding a second rule to keep interfaces:

    -keep interface com.google.android.gms.vision.** { *; }
    -keep interface com.google.android.gms.common.** { *; }
    

    should fix the problem.