ClassNotFound使用proguard时的GoogleApiAvailability

时间:2017-07-11 01:50:16

标签: android proguard google-vision

我正在创建一个Android平板电脑,我正在使用谷歌的视觉API。要检查Play服务是否可用,我已使用GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context)添加了检查。

为了从混淆中排除这一点,我添加了

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

我在混淆时收到此错误:

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)

更新 当我在项目中使用playservices依赖项时,这个aar也被导入,那么我的代码工作正常。 有没有办法,避免在项目中添加playservices依赖项,只是从aar中使用它?

1 个答案:

答案 0 :(得分:0)

指令

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

让ProGuard保留com.google.android.gms.vision中的所有类,但不保留com.google.android.gms.vision.Detector$Processor之类的接口。

添加第二条规则以保持接口:

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

应该解决问题。