appcompat-v7 v21.0.0 gây ra lỗi trên các thiết bị Samsung chạy Android v4.2.2


79

Chúng tôi vừa thay đổi ứng dụng của mình để sử dụng appcompat-v7 supportthư viện nhằm tận dụng thanh tác vụ hỗ trợ và hỗ trợ các chủ đề Material. Khi sử dụng v21.0.0 of appcompat-v7(và v21.0.0 of support-v4), chúng tôi hiện đang thấy sự cố Google Playvà thanh tác vụ Crashlytics chỉ từ thiết bị Samsung runningAndroid . Here is the stack trace from Google Play and the app appears to crash as soon as thev4.2.2` được hiển thị và / hoặc bị vô hiệu.

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)

Các thiết bị và trình giả lập khác chạy v4.2.2 không có hành vi này. Tôi hiểu 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ẽ rất hữu ích nếu bạn biết cách tránh / khắc phục lỗi này.

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

Cập nhật: Có vẻ như Google ít nhất đang xem xét các giải pháp thay thế có thể cho việc này. Xem điều này để biết chi tiết.



Đây có thể là một vấn đề liên quan, nhưng nó dường như 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 con quay trong thanh tác vụ và tôi không gặp trường hợp đó. Tôi chỉ đang sử dụng các món trong thực đơn.
Erik Pedersen

Tôi cũng gặp vẫn đề này. Ứng dụng đang được sản xuất và nhận được lỗi từ samsung với 4.2.2. thiết bị
Martin Vandzura

1
Tôi cũng không có spinner trong Action Bar của mình và tôi đang nhận được điều này từ các thiết bị không phải của Samsung chạy Android 4.2.2: Qmobile I9 và Wiko (kiểu máy không xác định).
Jürgen 'Kashban' Wahlmann

1
@Devashish: Giải pháp proguard trong câu trả lời thứ hai đã hiệu quả với tôi. Tôi đã kiểm tra thiết bị Samsung bị ảnh hưởng với appthwack.com và sau khi áp dụng cấu hình proguard, tôi không còn gặp lỗi nào nữa.
Jürgen 'Kashban' Wahlmann

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

1
Tôi nghĩ rằng bạn có thể tiết kiệm thêm dung lượng bằng cách sử dụng "-keepnames" thay vì "-keep".
Justin

Như đã lưu ý trong cuộc thảo luận từ code.google.com/p/android/issues/detail?id=78377 , việc 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 đã hoạt động 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à được chấp nhận.
Erik Pedersen

tôi nên viết dòng này ở đâu?
Lỗi xảy ra

@BugsHappen, điều này sẽ có trong tệp xây dựng Gradle của bạn. Bạn có thể đọc thêm về ProGuard đây: developer.android.com/tools/help/proguard.html
Dick Lucas

7

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

Vì hãy cẩn thận với -keep class! Android.support.v7.internal.view.menu. **. Có một số lớp trong đó được tham chiếu từ tài nguyên của appcompat.

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

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

Trong các thử nghiệm của tôi, dựa trên việc xem xét các tập tin bản đồ Proguard tạo, Proguard cấu hình đề nghị này không dẫn đến Obfuscating tên lớp MenuBuilder, mặc dù nó SubMenuBuilder xáo trộn
Andy Dennie

Tìm ra; xem câu trả lời của tôi.
Andy Dennie

Này Andy, tôi gặp vấn đề tương tự, MenuBuilder không bị rối nhưng những người khác thì có, hãy cho tôi biết bạn đã giải quyết nó như thế nào? cảm ơn
Qing

6

Kể từ khi Appcompat 23.1.1các .internalgói trong lọ AppCompat đã được gỡ bỏ.

Đã cập nhật bản sửa lỗi bằng cách 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.* { *; }


1

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

Đọc liên kết mà tôi đã thử điều này trong một trong các ứng dụng của tôi, điều này đã đưa ra ngoại lệ trên setSupportActionBar (thanh công cụ) trong onCreate ().

Nó khá đơn giản chỉ cần thêm khối thử bắt xung quanh cuộc gọi

try {

 setSupportActionBar(toolbar);

} catch (Throwable t) {

 // WTF SAMSUNG!

}

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, sự cố đã được khắc phục.


-2

Thay đổi Phiên bản biên dịch Sdk của dự án của bạn thành "API 18: (JellyBean)"

Giá trị mặc định được đặt thành "Lollipop"

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

CÁC BƯỚC

  1. Nhấp chuột phải vào dự án của bạn và chọn Mở Cài đặt Mô-đun (hoặc nhấn F4)
  2. Trong tab thuộc tính Phiên bản Sdk đã biên dịch

-3

Thay thế AppCompatActivity bằng Hoạt động

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


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

Tôi nghĩ, có lẽ bài đăng tồi tệ đến mức bị phản đối, nếu ai đó đồng ý với lý do được đặt tên bởi Sufian. Nhưng không đến nỗi bị xóa.
Gangnus

-3

Thay thế

public class class_name extends AppCompatActivity
{

.........

}

Với

public class class_name extends Activity
{

.........

}

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


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.
Sufian
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.