[android] appcompat-v7 v21.0.0으로 인해 Android v4.2.2가 설치된 삼성 기기에서 충돌이 발생 함

appcompat-v7 support지원 액션 바를 활용하고 머티리얼 테마를 지원하기 위해 라이브러리 를 사용하도록 애플리케이션을 변경했습니다 . v21.0.0 of appcompat-v7(및을 사용하면 v21.0.0 of support-v4)이제 Google Play비정상 종료 가 표시되며 삼성 기기의 Crashlytics runningAndroid v4.2.2 작업 . Here is the stack trace from Google Play and the app appears to crash as soon as the표시 줄 만 표시 및 / 또는 무효화됩니다.

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)

v4.2.2를 실행하는 다른 장치 및 에뮬레이터는이 동작을 나타내지 않습니다. 많은 Google 앱이 이미이 새 버전을 사용 appcompat하여 작업 표시 줄을 표시 하고 있다는 것을 알고 있습니다. 이러한 앱이 이러한 장치에서 충돌을보고하지 않는 경우이를 방지 / 해결하는 방법을 아는 것이 도움이 될 것입니다.

나는 이것을 Google에 버그로보고했지만 개발 문제라는 이유로 마감되었습니다. 나는이 사건 될 수있다 동의 할 수 있지만 사람이 현재 사용할 수있는 방법 / 경우, 궁금하네요 appcompat-v7 v21.0.0과의 충돌을 얻을 수 없습니다 Samsung 4.2.2 devices.

업데이트 : Google은 최소한 이에 대한 가능한 해결 방법을 고려하고있는 것 같습니다. 참고 내용은.



답변

여기에서 적절한 해결책을 찾았습니다 : https://stackoverflow.com/a/26641388/1266123

사용하여

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

대신에

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


답변

https://code.google.com/p/android/issues/detail?id=78377의 # 150이 말했듯이

-keep class! android.support.v7.internal.view.menu. **에주의하기 때문입니다. appcompat의 리소스에서 참조되는 여러 클래스가 있습니다.

더 나은 해결책은 다음 줄을 대신 추가하는 것입니다.

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


답변

AppCompat jar Appcompat 23.1.1.internal패키지가 제거 되었기 때문에 .

proguard를 사용하여 업데이트 된 수정 :

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


답변

이 문제가있는 모든 경우 지금까지 해결 방법 만 proguard를 사용하는 것 같습니다. https://code.google.com/p/android/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars&groupby=&sort=&id=78377 에서 체크 아웃 토론


답변

progaurd없이 솔루션을 사용하는 데 관심이있는 사람.

onCreate ()의 setSupportActionBar (toolbar)에 대한 예외를 제공 한 내 앱 중 하나에서 이것을 시도한 링크를 읽으십시오 .

매우 간단합니다. 호출 주위에 try catch 블록을 추가합니다.

try {

 setSupportActionBar(toolbar);

} catch (Throwable t) {

 // WTF SAMSUNG!

}


답변

Tecno P9에서 동일한 문제가 발생했지만 빌드 도구 24를 사용하고 지원 라이브러리에 24.2.0을 사용한 후 해결되었습니다.


답변

프로젝트의 Compile Sdk 버전을 “API 18 : (JellyBean)”로 변경합니다.

기본값은 “Lollipop”으로 설정되어 있습니다.

지금까지 Qmobile i9에서 내 문제를 해결했습니다.

단계

  1. 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 모듈 설정 열기를 선택하거나 F4를 누릅니다.
  2. 속성 탭에서 컴파일 된 SDK 버전