web-dev-qa-db-ja.com

NoClassDefFoundError:Android.support.v7.internal.view.menu.MenuBuilder

Android 4.2を実行しているSamsungデバイスのAndroid appcompat v7ライブラリに問題があります。開発者コンソールの次のスタックトレースでクラッシュが発生し続けます。

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)

これは、CustomActivity.Javaの215行目です。

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

クラッシュはさまざまなデバイスから発生しますが、常にSamsungであり、常にAndroid 4.2です。

簡単なWeb検索では、多くの人が同じ問題を抱えていると思い込んでいます。

  • Androidプロジェクトプロパティを確認し、appcompatライブラリが正しく追加されていることを確認します。
  • Java Build Path OrderとExport projectプロパティを確認し、Android DependenciesとAndroid Private Librariesがチェックされていることを確認してください。
  • クラスがライブラリ(Android.support.v7.internal.view.menu.MenuBuilder)に含まれていることを確認します。
  • R.JavaがAndroid.support.v7.appcompatのgenディレクトリにあることを確認します。
  • AppCompatテーマがManifest.xmlアクティビティに含まれていることを確認します。
  • プロジェクトをクリーンにして再構築します。

これらの手順にも関わらず、他のすべてのデバイスとAndroidバージョンで動作しているにもかかわらず、クラッシュレポートは引き続き送信されます。

169
Matt K

編集:

私のために働いた解決策は、これを置き換えることでした(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.** {*;}

クレジットは googleグループ、#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);
}

指摘したように、これは決定的なソリューションではなく、より永続的なソリューションが見つかったときにユーザーが制限された機能にアクセスできるようにするための単なる方法です。

100
unify

Googleグループの#15 のように

-keep class!Android.support.v7.internal.view.menu。**に注意してください。 appcompatのリソースから参照される多くのクラスがあります。

より良い解決策は、代わりに次の行を追加することです。

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

どのデバイスでこの問題に直面していますか? (サムスン/ HTCなど)

サムスンの場合、

さまざまなサムスンの携帯電話には、フレームワークまたはクラスパスにAndroidサポートライブラリの古いバージョンが含まれています。新しいマテリアルサポートライブラリを使用すると、これらのSamsungデバイスでこのクラッシュが発生します。

Java.lang.NoClassDefFoundError: Android.support.v7.internal.view.menu.MenuBuilder

これを修正するには、そのクラスの名前を変更する必要があります。それを行う最も簡単な方法は、プロガードを実行することです。難読化したくない場合は、問題のあるクラスの名前を変更するための1つのライナーがあります。

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

この問題を追跡する問題がありますが、それは本当にサムスンのバグなので、彼らの側で修正されることは決してありません。 Google/AOSP側で修正する唯一の方法は、これらの内部クラスの名前を変更することです。

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

23

この問題はAppCompat 23.1.1で返され、.internalパッケージはライブラリjarから削除されました。

上記のコメントで示唆されているように(そこで提案した人々の功績)、今ではプロガードの構成も変更する必要があります。

上記の提案された答えが再び機能するようにするには、これらの行を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.* { *; }
15
RWIL

バグ報告の最後の投稿によると、これはサポートライブラリの新しいバージョン(24.0.0)で修正する必要があります。 https://code.google.com/p/Android/issues/detail ?id = 78377#c374

誰か 偶数クレーム それはそれを修正しました。

このバージョンは利用可能です 先月から ですので、更新する必要があります。

12

USBデバッグモードでは見つからない、このMenuBuilderクラスの同じ問題がありました。リリースとデバッグの両方でminifyEnabledtrueに設定するだけでこの問題を解決しましたbuildTypes block of build.gradle 。このような:

buildTypes {

    debug {

        minifyEnabled true
    }

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

debugタイプでminifyEnabledをtrueに設定して、ライブハンドセットへのUSBデバッグを介したアプリのクラッシュを防ぎます。

4
FAQi

はい。 Samsungはすでに this の問題を知っています。 GitHub から同じPopupの実装を使用することをお勧めします。それは最善の方法ではありませんが、うまくいくでしょう。

4
Eldar Miensutov

Eclipseプロジェクトで提供されているデフォルトのproguardプロパティでproguardを有効にし、問題は修正されました。ここのいくつかのコメントに基づいて https://code.google.com/p/Android/issues/detail?id=78377 、一部の人々は以下を使用して再パッケージ化する必要があります:-repackageclasses "Android.support.v7 」

0
u2tall

Android St​​udioを介してSamsung Galaxy Tab 3タブレットで「Hello World」アプリを実行しようとすると、同じエラーが発生しました。アプリが起動したように見えるとすぐにクラッシュし、そのエラーがAndroid St​​udioのコンソールに表示されます。タブレットでシステムアップデートを行ったところ、「Hello World」アプリを実行できるようになりましたが、エラーはもう発生していません。これが誰かの問題解決に役立つことを願っています。

注:タブレットで実行したシステムアップデートでは、Android OSバージョンは更新されませんでした。バージョンがまだ4.2.2であると表示されているためです。

0
JulianDavid