10

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.

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!

Trả lời

-4

Thx cho Szymon Klimaszewski cho sự giúp đỡ! Ở đây tệp proguard hoạt động cho tôi:

-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.* { *; } 
+8

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

5

Tôi đang theo dõi tương tự thread và đấu tranh với việc tìm giải pháp, nhưng tôi không có thiết bị.

Căn cứ vào ý kiến ​​nhân dân tôi đã thêm sau vào Proguard cấu hình build loại:

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.** { *; } 

Ông có thể thử với các cấu hình sau đây? Tôi có một số nghi ngờ về giải pháp này, bởi vì khi tôi có các lớp chưa được tạo ra, tôi vẫn có NavigationMenuView trong cùng một gói.Nó đã không được di chuyển vì nó là mối quan hệ truy cập gói. Vì vậy, điều có thể giúp là thêm một cờ khác vào cấu hình proguard-project.txt, khá rủi ro:

-allowaccessmodification 

Đó có thể là một khởi đầu tốt để thử khắc phục vấn đề.

Vì vậy, trong Proguard dự án trường hợp của bạn sẽ trông như thế này:

-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.** { *; } 
+0

Thx cho câu trả lời của bạn. Tôi đã thử giải pháp của bạn. Tôi không có ngoại lệ NoClassDefFoundError nhưng tôi có ngoại lệ khác như: '' ' Gây ra bởi: java.lang.NoSuchMethodException: [lớp java.lang.String, int] tại java.lang.Class.getConstructorOrMethod (Lớp .java: 460) tại java.lang.Class.getDeclaredConstructor (Class.java WEBC88) tại com.smartnsoft.droid4me.cache.Persistence.getInstance (Persistence.java:460) '' ' Bạn có biết giải pháp khắc phục ngoại lệ NoClassDefFoundError và trong đó một trong những bạn không phải thêm quy tắc cho mỗi thư viện được sử dụng trong dự án? – rolandl

+0

repackageclasses phá vỡ hầu hết các phản ánh được sử dụng trong mã của bạn. Bạn sẽ cần phải thêm vào [config] (http://proguard.sourceforge.net/manual/usage.html#keep): -keep class your.package.name. ** {*; } –

+0

Thx! Dường như nó hoạt động. Tôi sẽ đăng toàn bộ tập tin proguard như một câu trả lời. – rolandl

0

Tôi sẽ thực hiện việc này. Tôi đã không thử nó chưa, vì tôi không có bất kỳ các thiết bị bị ảnh hưởng:

-keep class !android.support.design.internal.NavigationMenu,!android.support.design.internal.NavigationMenuPresenter,!android.support.design.internal.NavigationSubMenu 

Mà đi ngoài quy tắc này giúp nhiều thiết bị Samsung (xem http://goo.gl/ywG1c4):

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

-

-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.** { *; } 
-1

Kiểm tra com.android.support:appcompat version. Ví dụ: thay vì com.android.support:appcompat-v7:23.1.1 cố gắng sử dụng com.android.support:appcompat-v7:23.0.1

Các vấn đề liên quan