Tôi đang cố gắng sử dụng thư viện Thiết kế hỗ trợ Android (trong phiên bản 23.0.1) và lớp học NavigationMenu
(Tôi sử dụng lớp này làm Thẻ XML vào bố cục).NoClassDefFoundError: android.support.design.internal.NavigationMenu trên Android 4.2.2 (wiko)
Khi tôi thực hiện ứng dụng trên Samsung trên Android 4.3 hoặc trên Nexus trên Android 5.x hoặc 6.0 mọi thứ hoạt động tốt, nhưng khi tôi chạy ứng dụng trên cầu vồng Wiko trên Android 4.2.2, nó gặp sự cố ngoại lệ sau đây:
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)
[...]
lỗi này làm cho tôi suy nghĩ về một tương tự một nhà phát triển đã có vài tháng trước đây, sử dụng thư viện appcompat-v7 trên một số điện thoại Wiko và Samsung trên Android 4.2.2.
Các lỗi là:
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)
Giải pháp là sử dụng các tập tin Proguard sau vào dự án:
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-dontobfuscate
-dontoptimize
-keep class !android.support.v7.internal.view.menu.**, ** { *; }
Giải pháp này là tuyệt vời bởi vì tôi không có thêm các quy tắc cụ thể (chỉ một số số -dontwarn
dòng) cho các thư viện khác mà tôi sử dụng như Jackson hoặc thêm các quy tắc cụ thể cho các thành phần Android.
Vì NavigationMenu
kế thừa lớp của lớp MenuBuilder
, tôi nghĩ rằng chúng tôi có thể sửa đổi các tập tin Proguard như thế này để khắc phục vấn đề:
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-dontobfuscate
-dontoptimize
-keep class !android.support.design.internal.**, ** { *; }
Đáng tiếc là nó không hoạt động ... Vì vậy, tôi đã cố gắng giải pháp khác :
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-dontobfuscate
-dontoptimize
-keep class !android.support.v7.internal.view.menu.*MenuBuilder*, android.support.v7.** { *; }
này giải pháp làm việc nhưng ... Trong thực tế, tôi không có ngoại lệ NoClassDefFoundError
nữa nhưng tôi có những người khác ngoại lệ (xảy ra trên tất cả các Android phiên bản) như:
- một số nhà thầu còn thiếu sử dụng với sự phản ánh;
- một số nhà thầu trống bị thiếu trên các đối tượng Jackson hoặc trên
Fragment
.
Vì vậy, bạn có biết giải pháp cho phép tôi chạy ứng dụng trên Wiko trên Android 4.2.2 không. Tương lai ?
Cảm ơn bạn trước sự giúp đỡ của bạn!
Có rất nhiều thứ trong tập tin cấu hình này có thể không có gì để làm với vấn đề này. Bạn có thể cụ thể hơn về những gì chính xác là chữa trị vấn đề này với NavigationView? Tôi muốn obfuscation ví dụ và sẽ không tắt nó - Tôi không tin rằng điều này đã làm với vấn đề ... – Zordid