77

Chúng tôi vừa thay đổi ứng dụng của mình để sử dụng thư viện appcompat-v7 support để tận dụng lợi thế của thanh tác vụ hỗ trợ và hỗ trợ chủ đề Material. Sử dụng v21.0.0 of appcompat-v7 (và v21.0.0 of support-v4), bây giờ chúng tôi đang nhìn thấy tai nạn trong Google Play và Crashlytics chỉ từ các thiết bị Samsung running v4.2.2 Android . Here is the stack trace from Google Play and the app appears to crash as soon as the actionbar` được hiển thị và/hoặc bị hủy bỏ.appcompat-v7 v21.0.0 gây ra sự cố trên thiết bị Samsung với Android v4.2.2

java.lang.NoClassDefFoundError: android.support.v7.internal.view.menu.MenuBuilder 
at android.support.v7.app.ActionBarActivityDelegateBase.initializePanelMenu(ActionBarActivityDelegateBase.java:991) 
at android.support.v7.app.ActionBarActivityDelegateBase.preparePanel(ActionBarActivityDelegateBase.java:1041) 
at android.support.v7.app.ActionBarActivityDelegateBase.doInvalidatePanelMenu(ActionBarActivityDelegateBase.java:1259) 
at android.support.v7.app.ActionBarActivityDelegateBase.access$100(ActionBarActivityDelegateBase.java:80) 
at android.support.v7.app.ActionBarActivityDelegateBase$1.run(ActionBarActivityDelegateBase.java:116) 
at android.os.Handler.handleCallback(Handler.java:725) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:176) 
at android.app.ActivityThread.main(ActivityThread.java:5299) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869) 
at dalvik.system.NativeStart.main(Native Method) 

thiết bị và giả lập khác chạy v4.2.2 làm Đó là sự hiểu biết của tôi rằng nhiều ứng dụng của Google đã sử dụng phiên bản mới này của appcompat để hiển thị thanh tác vụ.Nếu các ứng dụng này không báo cáo sự cố trên các thiết bị này, sẽ hữu ích khi biết cách tránh/cố định điều này .

Tôi đã báo cáo lỗi này là lỗi của Google nhưng đã đóng cửa với lý do nó là một vấn đề phát triển. Mặc dù tôi đồng ý rằng đây có thể là trường hợp, tôi tự hỏi liệu/có ai đó hiện có thể sử dụng appcompat-v7 v21.0.0 và không gặp sự cố trên Samsung 4.2.2 devices hay không.

Cập nhật: Có vẻ như Google ít nhất đang xem xét cách giải quyết khả thi cho việc này. Xem this để biết chi tiết.

+0

bản sao có thể có của [NoClassDefFoundError: android.support.v7.internal.view.menu.MenuBuilder] (http://stackoverflow.com/questions/24809580/noclassdeffounderror-android-support-v7-internal-view-menu- menubuilder) – Nachi

+0

Đây có thể là một vấn đề liên quan, nhưng nó có vẻ là một ngoại lệ hơi khác. Một giải pháp gần đây được đăng trong câu hỏi khác liên quan đến việc có một spinner trong thanh hành động và tôi không có tình huống đó. Tôi chỉ sử dụng các mục menu. –

+0

Tôi cũng gặp vấn đề này. Ứng dụng đang trong quá trình sản xuất và nhận sự cố từ Samsung với 4.2.2. thiết bị – vandzi

Trả lời

15

Tôi tìm thấy giải pháp thích hợp ở đây: https://stackoverflow.com/a/26641388/1266123

Bằng cách sử dụng

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

thay vì

-keep class android.support.v7.** {*;} 
+0

Tôi nghĩ bạn có thể tiết kiệm nhiều không gian hơn bằng cách sử dụng "-keepnames" thay vì "-keep". – Justin

+0

Như đã lưu ý trong phần thảo luận từ https://code.google.com/p/android/issues/detail?id = 78377, sử dụng giải pháp cụ thể này có thể gây ra sự cố do tham chiếu tài nguyên trong thư viện appcompat. Tuy nhiên, điều này đã được làm việc cho ứng dụng cụ thể của chúng tôi vì vậy tôi đánh dấu câu trả lời này là chấp nhận. –

+0

Tôi nên viết dòng này ở đâu? –

7

Như # 150 từ https://code.google.com/p/android/issues/detail?id=78377 nói

Because careful with -keep class !android.support.v7.internal.view.menu.**. There are a number of classes in there which are referenced from the appcompat's resources.

Giải pháp tốt hơn là thêm các dòng sau thay vào đó:

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

Trong các thử nghiệm của tôi, dựa trên đánh giá của tệp ánh xạ proguard được tạo, cấu hình proguard được đề xuất này không dẫn đến làm xáo trộn tên lớp MenuBuilder, mặc dù nó làm xáo trộn SubMenuBuilder –

+0

Tìm ra nó; xem câu trả lời của tôi –

+0

hey Andy tôi có cùng một vấn đề, MenuBuilder không phải là obfuscated nhưng những người khác, tâm trí cho tôi biết làm thế nào bạn giải quyết nó? cảm ơn – Qing

1

Nếu có ai quan tâm đến việc sử dụng giải pháp không có progaurd.

Đọc số link tôi đã thử điều này trong một trong các ứng dụng của tôi, ngoại trừ setSupportActionBar (thanh công cụ) trong onCreate().

của nó khá đơn giản chỉ cần thêm khối catch xung quanh gọi

try { 

setSupportActionBar(toolbar); 

} catch (Throwable t) { 

// WTF SAMSUNG! 

} 
+6

"WTF SAMSUNG!", Đã phải cười ... –

-2

Thay đổi Compile Phiên bản SDK của dự án của bạn để "API 18: (Jellybean)"

Giá trị mặc định được thiết lập để "Lollipop"

Cho đến nay nó đã giải quyết vấn đề của tôi trên Qmobile i9

BƯỚC

  1. Kích chuột phải vào dự án của bạn và chọn Open Cài đặt mô-đun (hoặc nhấn F4)
  2. Trong tab thuộc tính Biên soạn Phiên bản SDK
-2

Thay AppCompatActivity Với Hoạt động

Điều này đã giúp tôi.

+0

Sửa chữa giá rẻ. Anh ấy có thể đang sử dụng AppCompat vì anh ấy muốn hỗ trợ API <11 hoặc một cái gì đó. Điều này sẽ phá vỡ ý tưởng đó. – Sufian

+0

Tôi nghĩ rằng, nó có thể là bài viết đủ xấu để được downvoted, nếu ai đồng ý với lý do được đặt tên bởi Sufian. Nhưng không quá tệ để bị xóa. – Gangnus

-2

Thay

public class class_name extends AppCompatActivity 
{ 

......... 

} 

Với

public class class_name extends Activity 
{ 

......... 

} 

này đã giúp tôi.

+0

Vui lòng ngừng sao chép câu trả lời của bạn cho cùng một câu hỏi này. – Sufian

6

Kể từ Appcompat 23.1.1 gói .internal trong lọ AppCompat đã bị xóa.

Cập nhật sửa chữa sử dụng Proguard:

#FOR APPCOMPAT 23.1.1: 
-keep class !android.support.v7.view.menu.*MenuBuilder*, android.support.v7.** { *; } 
-keep interface android.support.v7.* { *; } 
0

tôi gặp phải vấn đề tương tự trên Tecno P9, nhưng sau khi sử dụng công cụ xây dựng 24 và cho thư viện hỗ trợ của tôi, tôi sử dụng 24.2.0, nó đã được cố định.

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