programing

NoClassDefFoundError: 안드로이드.support.v7.internal.view.메뉴판메뉴빌더

bestcode 2022. 8. 19. 20:51
반응형

NoClassDefFoundError: 안드로이드.support.v7.internal.view.메뉴판메뉴빌더

Android 4.2를 실행하는 삼성 장치의 Android 앱 호환성 v7 라이브러리에 문제가 있습니다.Developer Console에서 다음과 같은 스택트레이스를 실행하면 크래시가 계속 발생합니다.

java.lang.NoClassDefFoundError: android.support.v7.internal.view.menu.MenuBuilder
    at android.support.v7.widget.PopupMenu.<init>(PopupMenu.java:66)
    at com.[my-package-name].CustomActivity$5.onClick(CustomActivity.java:215)
    at android.view.View.performClick(View.java:4222)
    at android.view.View$PerformClick.run(View.java:17620)
    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)
    at dalvik.system.NativeStart.main(Native Method)

Custom Activity.java의 215행은 다음과 같습니다.

PopupMenu popup = new PopupMenu(CustomActivity.this, mImageViewMenu);

크래시는 다양한 기기에서 발생하지만 항상 삼성에서 발생하며 항상 안드로이드 4.2에서 발생합니다.

간단한 웹 검색을 통해 많은 사람들이 같은 문제를 가지고 있다고 생각됩니다.이 문제를 해결하기 위해 제가 시도한 몇 가지 단계는 다음과 같습니다.

  • Android 프로젝트 속성을 확인하고 앱 호환 라이브러리가 올바르게 추가되었는지 확인합니다.
  • Java 빌드 경로 순서 및 내보내기 프로젝트 속성을 확인하고 Android 종속성 및 Android 개인 라이브러리가 선택되어 있는지 확인합니다.
  • 클래스가 라이브러리에 포함되어 있는지 확인합니다(안드로이드).support.v7.internal.view.메뉴판메뉴 빌더).
  • R.java가 안드로이드용 gen 디렉토리에 있는지 확인합니다.support.v7.appcompat을 참조해 주세요.
  • AppCompat 테마가 Manifest.xml 액티비티에 포함되어 있는지 확인합니다.
  • 프로젝트를 청소하고 재구축합니다.

이러한 단계에도 불구하고, 그리고 다른 모든 기기 및 안드로이드 버전에서 작동함에도 불구하고, 크래시 리포트는 여전히 전달된다.

편집:

이 문제를 해결하기 위한 솔루션은 (Proguard를 사용하여)였습니다.

-keep class android.support.v4.** { *; } 
-keep interface android.support.v4.** { *; }

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

다음과 같이 입력합니다.

# Allow obfuscation of android.support.v7.internal.view.menu.**
# to avoid problem on Samsung 4.2.2 devices with appcompat v21
# see https://code.google.com/p/android/issues/detail?id=78377
-keep class !android.support.v7.internal.view.menu.**,android.support.** {*;}

공적은 구글 그룹 #138에게 돌아간다.

오래된 답변(임시 회피책):이것은 ActionBar에서 스피너를 사용하는 프로젝트에서 발생합니다.저의 솔루션은 이러한 조건을 확인하고 앱 플로우를 변경하는 것이었습니다.

public static boolean isSamsung_4_2_2() {
    String deviceMan = Build.MANUFACTURER;
    String deviceRel = Build.VERSION.RELEASE;
    return "samsung".equalsIgnoreCase(deviceMan) && deviceRel.startsWith("4.2.2");
}

그런 다음 활동의 onCreate 메서드에서 다음을 수행합니다.

if (isSamsung_4_2_2()) {
    setContentView(R.layout.activity_main_no_toolbar);
} else {
    setContentView(R.layout.activity_main);
}

이것은 최종적인 솔루션이 아닙니다만, 보다 영속적인 솔루션을 발견하면서, 유저가 한정된 기능에 액세스 할 수 있도록 하는 것에 지나지 않습니다.

구글 그룹의 #150이 말했듯이

왜냐하면 - keep class! 안드로이드를 조심하기 때문이다.support.v7.internal.view.메뉴판**. 앱호환 리소스에서 참조되는 클래스가 많이 있습니다.

대신 다음 행을 추가하는 것이 좋습니다.

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

어떤 기기에서 이 문제가 발생합니까? (삼성/HTC 등)

삼성이라면

다양한 삼성 폰은 프레임워크 또는 클래스 경로에 이전 버전의 안드로이드 지원 라이브러리를 포함하고 있습니다.새로운 재료 지원 라이브러리를 사용하는 경우 이러한 삼성 기기에서 다음과 같은 충돌이 발생합니다.

java.lang.NoClassDefFoundError: android.support.v7.internal.view.menu.MenuBuilder

이 문제를 해결하려면 해당 클래스의 이름을 변경해야 합니다.가장 쉬운 방법은 proguard를 실행하는 것입니다.난독화하지 않을 경우 위반 클래스만 이름을 변경할 수 있는1개의 라이너를 다음에 나타냅니다.

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

이 문제를 추적하는 데 문제가 있지만, 실제로 삼성의 버그이기 때문에 그들 측에서는 절대 수정이 되지 않을 것입니다.Google/AOSP 측에서 수정하는 유일한 방법은 이러한 내부 클래스의 이름을 변경하는 것입니다.

https://code.google.com/p/android/issues/detail?id=78377

는 이이문 in in in in에서 되었습니다.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.* { *; }

기존 수정 대신:

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

버그 리포트의 마지막 투고에 의하면, 이 문제는 새로운 버전의 서포트 라이브러리(24.0.0)로 수정될 것입니다.https://code.google.com/p/android/issues/detail?id=78377#c374

누군가가 고쳤다고 주장하기까지 했어요.

이 버전은 지난달부터 사용 가능하므로 업데이트해야 합니다.

네. 삼성은 이미 이 문제에 대해 알고 있습니다.GitHub에서 Poppup을 구현해 보는 것을 추천합니다.그것은 최선의 방법은 아니지만 효과가 있을 것이다.

USB 디버깅 모드에서 찾을 수 없는 이 MenuBuilder 클래스의 동일한 문제가 발생했습니다.이 문제를 해결하려면 릴리스 빌드와 디버깅빌드 모두에서 minifyEnabled를 true로 설정하기만 하면 됩니다.build.gradle의 블록을 다음과 같이 입력합니다.

buildTypes {

    debug {

        minifyEnabled true
    }

    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

디버깅 타입에서는 minifyEnabled를 true로 설정하여 라이브 핸드셋에 USB 디버깅을 통해 앱이 크래시되는 것을 방지합니다.

이클립스 프로젝트에서 제공되는 기본 프로가드 속성으로 프로가드를 활성화하여 문제를 해결했습니다.https://code.google.com/p/android/issues/detail?id=78377 의 코멘트에 근거해, -repackage classes "package classes" 를 사용해 재패키지 할 필요가 있는 사람도 있습니다.지원.v7"

Android Studio를 통해 삼성 갤럭시 탭 3 태블릿에서 '헬로 월드' 앱을 실행하려고 할 때도 같은 오류가 발생했습니다.앱이 실행되어 즉시 크래시되며 Android Studio 콘솔에 오류가 표시됩니다.태블릿에서 시스템 업데이트를 했더니 'Hello World' 앱을 실행할 수 있게 되어 오류가 발생하지 않게 되었습니다.나는 이것이 누군가가 그들의 문제를 해결하는 데 도움이 되기를 바란다.

주의: 태블릿에서 실행한 시스템 업데이트에서는 Android OS 버전이 4.2.2로 되어 있기 때문에 업데이트가 되지 않았습니다.

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

기본값은 '롤리팝'으로 설정되어 있습니다.

순서

  1. 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 Open Module Settings(모듈 설정 열기)를 선택합니다(또는 F4 키를 누릅니다).
  2. 속성 탭에서 컴파일된 Sdk 버전

언급URL : https://stackoverflow.com/questions/24809580/noclassdeffounderror-android-support-v7-internal-view-menu-menubuilder

반응형