NoClassDefFoundError:Android 4.2.2上的android.support.design.internal.NavigationMenu(wiko)

我试图使用 Android支持设计库(版本23.0.1)和类NavigationMenu(我将这个类作为一个XML标签使用到布局中).

当我在Android 4.3或者Android 5.x或6.0上的一个Nexus上执行我的应用程序时,一切都很好,但是当我在Android 4.2.2上的Wiko Rainbow上执行应用程序时,它会崩溃,但出现以下异常:

java.lang.RuntimeException: Unable to start activity ComponentInfo{applicationId/package.MainActivity}: android.view.InflateException: Binary XML file line #11: Error inflating class <unkNown>
[...]
Caused by: android.view.InflateException: Binary XML file line #11: Error inflating class <unkNown> 
Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Constructor.constructNative(Native Method)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
        at android.view.LayoutInflater.createView(LayoutInflater.java:587)
[...]
Caused by: java.lang.NoClassDefFoundError: android.support.design.internal.NavigationMenu
        at android.support.design.widget.NavigationView.<init>(NavigationView.java:99)
        at android.support.design.widget.NavigationView.<init>(NavigationView.java:92)
        at java.lang.reflect.Constructor.constructNative(Native Method)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
        at android.view.LayoutInflater.createView(LayoutInflater.java:587)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
[...]

这个错误让我想起了几个月前类似的开发者,在Android 4.2.2上的一些Wiko和Samsung手机上使用了appcompat-v7库.

错误是:

java.lang.NoClassDefFoundError:   android.support.v7.internal.view.menu.MenuBuilder
at android.support.v7.app.ActionBaractivityDelegateBase.initializePanelMenu(ActionBaractivityDelegateBase.java:914)
at android.support.v7.app.ActionBaractivityDelegateBase.preparePanel(ActionBaractivityDelegateBase.java:964)
at android.support.v7.app.ActionBaractivityDelegateBase.doInvalidatePanelMenu(ActionBaractivityDelegateBase.java:1182)
at android.support.v7.app.ActionBaractivityDelegateBase.access$100(ActionBaractivityDelegateBase.java:79)
at android.support.v7.app.ActionBaractivityDelegateBase$1.run(ActionBaractivityDelegateBase.java:118)
at android.os.Handler.handleCallback(Handler.java:800)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5391)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)

解决方案是在项目中使用以下proguard文件

-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod

-dontobfuscate
-dontoptimize

-keep class !android.support.v7.internal.view.menu.**,** { *; }

这个解决方案是伟大的,因为我不需要为我使用像Jackson这样的其他库添加特定的规则(只是一些-dontwarn行),或者为Android组件添加特定的规则.

因为NavigationMenu类继承了MenuBuilder类,我以为我们可以修改这样的proguard文件解决这个问题:

-keepattributes Exceptions,EnclosingMethod

-dontobfuscate
-dontoptimize

-keep class !android.support.design.internal.**,** { *; }

不幸的是它不工作…所以我尝试了另一个解决方案:

-keepattributes Exceptions,EnclosingMethod

-dontobfuscate
-dontoptimize

-keep class !android.support.v7.internal.view.menu.*MenuBuilder*,android.support.v7.** { *; }

这个解决方案有效,但实际上我没有NoClassDefFoundError异常,但我有其他异常(发生在所有的Android版本),如:

>一些缺少的构造函数用于反射;
>在Jackson对象或片段上缺少一些空构造函数.

那么,你是否知道一个解决方案,让我可以在Android 4.2.2上的Wiko上执行我的应用程序,而我不需要为将来使用或将要使用的每个库添加特定的规则.

预先感谢您的帮助 !

解决方法

我正在关注类似的 thread,并努力寻找解决方案,但是我没有设备.

根据人们的意见,我添加了以下的proguard配置
构建类型:

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),'proguard-project.txt'
    }
}

ProGuard的-project.txt

-repackageclasses ''
-keep class android.support.v4.app.** { *; }
-keep interface android.support.v4.app.** { *; }

-keep class android.support.v7.app.** { *; }
-keep interface android.support.v7.app.** { *; }

-keep class android.support.v13.app.** { *; }
-keep interface android.support.v13.app.** { *; }

你可以尝试使用以下配置吗?
我对这个解决方案有一些疑问,因为当我有未编号的生成类时,我仍然在同一个包中的NavigationMenuView.它没有被移动,因为它是包访问关系.那么什么可能有帮助的是添加一个标志proguard-project.txt配置,相当危险,虽然:

-allowaccessmodification

这可能是一个很好的开始尝试解决问题.

所以在你的情况下,proguard-project应该是这样的:

-keepattributes Exceptions,EnclosingMethod

-dontobfuscate
-dontoptimize
-allowaccessmodification
-repackageclasses ''
-keep class your.package.name.** { *; }
-keep class android.support.v4.app.** { *; }
-keep interface android.support.v4.app.** { *; }

-keep class android.support.v7.app.** { *; }
-keep interface android.support.v7.app.** { *; }

-keep class android.support.v13.app.** { *; }
-keep interface android.support.v13.app.** { *; }

相关文章

这篇“android轻量级无侵入式管理数据库自动升级组件怎么实现...
今天小编给大家分享一下Android实现自定义圆形进度条的常用方...
这篇文章主要讲解了“Android如何解决字符对齐问题”,文中的...
这篇文章主要介绍“Android岛屿数量算法怎么使用”的相关知识...
本篇内容主要讲解“Android如何开发MQTT协议的模型及通信”,...
本文小编为大家详细介绍“Android数据压缩的方法是什么”,内...