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


79

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은 최소한 이에 대한 가능한 해결 방법을 고려하고있는 것 같습니다. 참고 내용은.



이것은 관련 문제 일 수 있지만 약간 다른 예외 인 것 같습니다. 다른 질문에 게시 된 최근 솔루션 중 하나는 작업 표시 줄에 스피너가있는 것과 관련이 있으며 해당 상황이 없습니다. 메뉴 항목을 사용하고 있습니다.
Erik Pedersen 2014 년

나도이 문제가있다. 앱이 생산 중이며 4.2.2에서 삼성에서 충돌이 발생합니다. 장치
Martin Vandzura 2014

1
내 Action Bar에도 스피너가 없으며 Android 4.2.2를 실행하는 삼성이 아닌 기기 : Qmobile I9 및 Wiko (알 수없는 모델)에서이 정보를 얻습니다.
Jürgen 'Kashban'Wahlmann

1
@Devashish : 두 번째 답변의 proguard 솔루션이 저에게 효과적이었습니다. appthwack.com의 영향을받는 삼성 장치에 대해 테스트했으며 proguard 구성을 적용한 후 더 이상 오류가 발생하지 않았습니다.
Jürgen 'Kashban'Wahlmann

답변:


15

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

사용하여

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

대신에

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

1
"-keep"대신 "-keepnames"를 사용하면 더 많은 공간을 절약 할 수 있다고 생각합니다.
Justin

code.google.com/p/android/issues/detail?id=78377 의 토론에서 언급 했듯이이 특정 솔루션을 사용하면 appcompat 라이브러리 내의 리소스 참조로 인해 문제가 발생할 수 있습니다. 그러나 이것은 우리의 특정 앱에서 작동하고 있으므로이 답변을 수락 된 것으로 표시하고 있습니다.
Erik Pedersen

이 줄을 어디에 써야합니까?
Bugs Happen 2015 년

@BugsHappen, 이것은 Gradle 빌드 파일에 저장됩니다. 현재 ProGuard에서에 대한 자세한 내용을보실 수 있습니다 : developer.android.com/tools/help/proguard.html
딕 루카스

7

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

이 난독 SubMenuBuilder을 수행하지만 생성 된 난독 매핑 파일의 검토를 실시하고이를 근거로 내 시험에서,이 제안 난독의 설정은 MenuBuilder는 클래스 이름을 난독 발생하지 않습니다
앤디 Dennie

그것을 알아 냈습니다. 내 대답을 참조하십시오.
Andy Dennie 2015 년

안녕 Andy 나도 같은 문제가 있습니다. MenuBuilder는 난독 화되지 않았지만 다른 사람들은 어떻게 해결했는지 알려주시겠습니까? 감사합니다
Qing

6

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


1

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

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

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

try {

 setSupportActionBar(toolbar);

} catch (Throwable t) {

 // WTF SAMSUNG!

}

0

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


-2

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

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

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

단계

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

-3

AppCompatActivity를 활동으로 바꾸기

이것은 나를 도왔다.


저렴한 수정. 그는 API <11 등을 지원하기를 원하기 때문에 AppCompat를 사용하고있을 수 있습니다. 이것은 그 생각을 깨뜨릴 것입니다.
Sufian 2015

누군가가 Sufian이 명명 한 이유에 동의한다면 비추천 할만한 게시물 일 수 있습니다. 그러나 그렇게 나쁘지는 않습니다.
Gangnus 2015

-3

바꾸다

public class class_name extends AppCompatActivity
{

.........

}

public class class_name extends Activity
{

.........

}

이것은 나를 도왔다.


이 같은 질문에 대한 답변을 중복하지 마십시오.
Sufian 2015
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.