NoClassDefFoundError: android.support.design.internal.NavigationMenu on Android 4.2.2 (wiko)
NoClassDefFoundError: android.support.design.internal.NavigationMenu on Android 4.2.2 (wiko)
我正在尝试使用 Android 支持设计库(版本 23.0.1)和 class NavigationMenu
(我将此 class 作为 XML 标记到布局中)。
当我在 Android 4.3 的三星或 Android 5.x 或 6.0 的 Nexus 上执行我的应用程序时一切正常,但是当我在 Wiko 上执行应用程序时Android 4.2.2 上的 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 和三星手机上使用 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.access0(ActionBarActivityDelegateBase.java:79)
at android.support.v7.app.ActionBarActivityDelegateBase.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)
解决方案是在项目中使用以下混淆文件:
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-dontobfuscate
-dontoptimize
-keep class !android.support.v7.internal.view.menu.**, ** { *; }
这个解决方案很棒,因为我不必为我使用的其他库(如 Jackson)添加特定规则(只需一些 -dontwarn
行)或为 android 组件添加特定规则。
因为 NavigationMenu
class 继承了 MenuBuilder
class,我认为我们可以像这样修改 proguard 文件来解决问题:
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-dontobfuscate
-dontoptimize
-keep class !android.support.design.internal.**, ** { *; }
不幸的是,它不起作用...所以我尝试了另一种解决方案:
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-dontobfuscate
-dontoptimize
-keep class !android.support.v7.internal.view.menu.*MenuBuilder*, android.support.v7.** { *; }
这个解决方案 有效 但是...事实上,我不再有 NoClassDefFoundError
异常,但我还有其他异常(发生在所有 Android 版本)如:
- 一些缺少的构造函数与反射一起使用;
- Jackson 对象或
Fragment
. 上缺少一些空构造函数
所以,你知道一个解决方案吗?它允许我在 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,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,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.** { *; }
感谢 Szymon Klimaszewski 的帮助!这是对我有用的 proguard 文件:
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-dontobfuscate
-dontoptimize
-repackageclasses ''
#Jackson
-dontwarn com.fasterxml.jackson.databind.**
#View Pager Indicator
-dontwarn com.viewpagerindicator.**
#Android
-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.** { *; }
#droid4me
-keep class com.smartnsoft.** { *; }
#my app
-keep class my.app.package.** { *; }
#Critercism
-keep public class com.crittercism.**
-keepclassmembers public class com.crittercism.* { *; }
我要这样做。我还没有尝试过,因为我没有任何受影响的设备:
-keep class !android.support.design.internal.NavigationMenu,!android.support.design.internal.NavigationMenuPresenter,!android.support.design.internal.NavigationSubMenu
这条规则对许多三星设备都有帮助(请参阅 http://goo.gl/ywG1c4):
-keep class !android.support.v7.view.menu.**,android.support.** {*;}
-
-keep class !android.support.v7.internal.view.menu.**,** {*;}
-keep class android.support.v4.** { *; }
-keep interface android.support.v4.** { *; }
-keep class android.support.v7.** { *; }
-keep interface android.support.v7.** { *; }
检查 com.android.support:appcompat 版本。例如,
而不是 com.android.support:appcompat-v7:23.1.1 尝试使用 com.android.support:appcompat-v7:23.0.1
我正在尝试使用 Android 支持设计库(版本 23.0.1)和 class NavigationMenu
(我将此 class 作为 XML 标记到布局中)。
当我在 Android 4.3 的三星或 Android 5.x 或 6.0 的 Nexus 上执行我的应用程序时一切正常,但是当我在 Wiko 上执行应用程序时Android 4.2.2 上的 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 和三星手机上使用 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.access0(ActionBarActivityDelegateBase.java:79)
at android.support.v7.app.ActionBarActivityDelegateBase.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)
解决方案是在项目中使用以下混淆文件:
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-dontobfuscate
-dontoptimize
-keep class !android.support.v7.internal.view.menu.**, ** { *; }
这个解决方案很棒,因为我不必为我使用的其他库(如 Jackson)添加特定规则(只需一些 -dontwarn
行)或为 android 组件添加特定规则。
因为 NavigationMenu
class 继承了 MenuBuilder
class,我认为我们可以像这样修改 proguard 文件来解决问题:
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-dontobfuscate
-dontoptimize
-keep class !android.support.design.internal.**, ** { *; }
不幸的是,它不起作用...所以我尝试了另一种解决方案:
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-dontobfuscate
-dontoptimize
-keep class !android.support.v7.internal.view.menu.*MenuBuilder*, android.support.v7.** { *; }
这个解决方案 有效 但是...事实上,我不再有 NoClassDefFoundError
异常,但我还有其他异常(发生在所有 Android 版本)如:
- 一些缺少的构造函数与反射一起使用;
- Jackson 对象或
Fragment
. 上缺少一些空构造函数
所以,你知道一个解决方案吗?它允许我在 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,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,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.** { *; }
感谢 Szymon Klimaszewski 的帮助!这是对我有用的 proguard 文件:
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-dontobfuscate
-dontoptimize
-repackageclasses ''
#Jackson
-dontwarn com.fasterxml.jackson.databind.**
#View Pager Indicator
-dontwarn com.viewpagerindicator.**
#Android
-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.** { *; }
#droid4me
-keep class com.smartnsoft.** { *; }
#my app
-keep class my.app.package.** { *; }
#Critercism
-keep public class com.crittercism.**
-keepclassmembers public class com.crittercism.* { *; }
我要这样做。我还没有尝试过,因为我没有任何受影响的设备:
-keep class !android.support.design.internal.NavigationMenu,!android.support.design.internal.NavigationMenuPresenter,!android.support.design.internal.NavigationSubMenu
这条规则对许多三星设备都有帮助(请参阅 http://goo.gl/ywG1c4):
-keep class !android.support.v7.view.menu.**,android.support.** {*;}
-
-keep class !android.support.v7.internal.view.menu.**,** {*;}
-keep class android.support.v4.** { *; }
-keep interface android.support.v4.** { *; }
-keep class android.support.v7.** { *; }
-keep interface android.support.v7.** { *; }
检查 com.android.support:appcompat 版本。例如, 而不是 com.android.support:appcompat-v7:23.1.1 尝试使用 com.android.support:appcompat-v7:23.0.1