NoClassDefFoundError: android.support.v7.internal.view.menu.MenuBilder


170

एंड्रॉइड 4.2 चलाने वाले सैमसंग उपकरणों पर एंड्रॉइड ऐप्पोमैट वी 7 लाइब्रेरी के साथ एक समस्या है। मैं अपने डेवलपर कंसोल में निम्नलिखित स्टैक ट्रेस के साथ क्रैश प्राप्त कर रहा हूं:

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);

क्रैश उपकरणों की एक सरणी से आते हैं, लेकिन हमेशा सैमसंग, और हमेशा Android 4.2।

एक त्वरित वेब खोज मुझे विश्वास दिलाती है कि बहुत से लोगों के पास एक ही मुद्दा है, मैंने जिन मुद्दों को हल करने की कोशिश की है उनमें से कुछ चरण हैं:

  • Android प्रोजेक्ट गुणों की जाँच करें, सुनिश्चित करें कि Appcompat लाइब्रेरी ठीक से जोड़ी गई है।
  • जावा बिल्ड पाथ ऑर्डर और एक्सपोर्ट प्रोजेक्ट गुणों की जांच करें, सुनिश्चित करें कि एंड्रॉइड डिपेंडेंसी और एंड्रॉइड प्राइवेट लाइब्रेरी चेक की गई है।
  • पुस्‍तकालय में पुस्‍तकालय (Android.support.v7.internal.view.menu.MenuBuilder) की पुष्टि करें।
  • R.java की पुष्टि करें Android.support.v7.appcompat के लिए सामान्य निर्देशिका में स्थित है।
  • AppCompat विषय की पुष्टि करें Manifest.xml गतिविधि में शामिल है।
  • स्वच्छ और पुनर्निर्माण परियोजना।

इन चरणों के बावजूद, और इसके बावजूद अन्य सभी उपकरणों और एंड्रॉइड संस्करणों पर काम करने के बावजूद क्रैश रिपोर्ट अभी भी आते हैं।


4
नोट: मैंने इसे QMobile X25 पर भी देखा है जो पाकिस्तान से बाहर कम दूरी का फोन है। तो ऐसा लगता है कि ओयर्स ने एक ही दृष्टिकोण या एक ही रॉम को असफल सैमसंग रॉम के रूप में लिया है।
विलियम

चूँकि Google और Samsung दोनों ही इस विशाल मुद्दे को हल करने में सहायक नहीं हैं, क्या कोई ऐसा समाधान सोच सकता है जिसमें Proguard शामिल नहीं है (जो अन्य मुद्दों को उठाता है)?
चेकलिस्ट

Google इसके बारे में कुछ नहीं करने जा रहा है क्योंकि ऐसा लगता है कि सैमसंग ने पुस्तकालयों के बीच नाम की टक्कर के कारण अतिरिक्त संशोधन किए हैं। प्रोग्रेस टकराव से बच जाती है। एंड्रॉइड इश्यू ट्रैकर फोरम पर कोई बेहतर समाधान नहीं देखा है ।
मैट के

मैं QMobile A290 को जोड़ सकता हूं, साथ ही पाकिस्तान से बाहर भी।
sstn

2
वही मुद्दा [QMobile X30 - एंड्रॉइड 4.4.2]
shanraisshan

जवाबों:


100

संपादित करें:

इसे बदलने के लिए मेरे लिए जो समाधान काम किया गया था (प्रोगार्ड का उपयोग करके):

-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

पुराना उत्तर (अस्थायी वर्कअराउंड): यह एक प्रोजेक्ट में होता है जहां मैं एक्शनबार में स्पिनर का उपयोग करता हूं । मेरा समाधान उन स्थितियों की जाँच करना और ऐप के प्रवाह को बदलना था:

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");
}

फिर गतिविधि की चालू विधि में:

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

जैसा कि बताया गया है कि यह एक निश्चित समाधान नहीं है, यह उपयोगकर्ताओं को सीमित कार्यक्षमता तक पहुंच प्रदान करने का एक तरीका है जबकि एक अधिक स्थायी समाधान पाया जाता है।


2
किसी और को इस जवाब को सत्यापित कर सकते हैं? मेरे पास सैमसंग की पहुंच नहीं है और जिस ऐप पर मैं काम कर रहा था वह अब सक्रिय नहीं है इसलिए मैं इसका परीक्षण नहीं कर सकता।
मैट के

3
@JaredBurrows आप पुस्तकालय को नहीं निकालते हैं, तो आप सिर्फ, डिफ़ॉल्ट रूप से यह अनदेखी करने के लिए ठीक से ProGuard बताओ तुम्हें android.support.v7.internal.view.menu के अलावा android.support के अंतर्गत सब कुछ उपेक्षा
यूनिफाई

2
मैं महीनों से उस समस्या रिपोर्ट के समाधान का उपयोग कर रहा हूं और अचानक नवीनतम समर्थन पुस्तकालयों में अद्यतन करने के बाद अचानक और 23 एसकेडी मैंने दुर्घटनाग्रस्त होने पर इस नई रिपोर्ट को प्राप्त करना शुरू कर दिया है:java.lang.NoClassDefFoundError: android.support.v7.internal.view.menu.i
कासोर्ल्ज़

3
जब II Apppatpat v23 में अपग्रेड हुआ तो यह समस्या मेरे ऐप में वापस आ गई। मैंने AppCompat v.23.1.1 जार फ़ाइल का विश्लेषण किया, और देखा कि उन्होंने v7 के अंदर "आंतरिक" डायरेक्टरी को हटा दिया है, इसलिए ऐसा लगता है कि Proguard निर्देश पंक्ति अब होनी चाहिए: [--class वर्ग! Android.support.v7.view। मेनू। **, android.support। ** {*;}] मेरे पास अभी भी एक वास्तविक डिवाइस पर परीक्षणों से पुष्टि नहीं है जहां समस्या हुई। क्या इस तरह के उपकरण से कोई भी इसका परीक्षण कर सकता है? या हो सकता है कि 'आंतरिक' डायर को हटाना वास्तव में इस मुद्दे के लिए तय है और हमें अब नाम बदलने वाले प्रोगार्ड वर्ग के साथ गड़बड़ करने की आवश्यकता नहीं है?
ग्रैग्को

7
इसे अपनी प्रहरी सेटिंग में जोड़ें, यह समस्या को हल करेगा: APPCOMPAT 23.1.1 के लिए: -की टैक्सी; android.support.v7.view.menu। * MenuBuilder *, android.support.v7। ** { ; } -की इंटरफ़ेस android.support.v7। * { ; } OLDER APPCOMPAT संस्करण के लिए: -की क्लास! Android.support.v7.internal.men.menu। * मेनूब्यूलर , android.support.v7। ** { ; } -की इंटरफ़ेस android.support.v7। * {*; }
एंड्रिया बेलितो

26

जैसा कि google समूहों से # 150 ने कहा था

क्योंकि-क्लास क्लास के साथ सावधान! Android.support.v7.internal.view.menu। **। वहाँ कई कक्षाएं हैं जो एपकॉम के संसाधनों से संदर्भित हैं।

बेहतर समाधान इसके बजाय निम्नलिखित पंक्तियों को जोड़ रहा है:

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

मेरे परीक्षणों में, जेनरेटेड प्रोगार्ड मैपिंग फ़ाइल की समीक्षा के आधार पर, यह सुझाव दिया गया कि प्रॉपगार्ड कॉन्फिगर मेनूब्यूलेर क्लास नाम को बाधित करने का नतीजा नहीं है, हालाँकि यह सबमेन्यूब्यूस्ट को बाधित करता है।
एंडी डेनी

3
@William किसी ने इसे हटा दिया, पता नहीं क्यों। वैसे भी, यहाँ मेरा समाधान है: -keep class !android.support.v7.internal.view.menu.* implements android.support.v4.internal.view.SupportMenu, android.support.v7.** {*;}
एंडी डेनी

3
इसने मेरे लिए काम किया जहाँ मैं एप्‍लिकेशन के v23 के -keep class !android.support.v7.internal.view.menu.**,** {*;} साथ काम नहीं कर रहा था ।
क्वेंटिन क्लेन

1
-keep class !android.support.v7.internal.view.menu.*MenuBuilder*, android.support.v7.** { *; } -keep interface android.support.v7.** { *; }उत्तर के रूप में :)
क्वेंटिन क्लेन

2
23.1.1 समर्थन पुस्तकालय में आंतरिक पैकेज पथ को संशोधित किया गया था, इसलिए अब सही प्रूफ़ सेटिंग है: -की क्लास! android.support.v7.view.menu। * MenuBuilder *, android.support.v7। ** { ; } -की इंटरफ़ेस android.support.v7। * {*; }
एंड्रिया बेलितो

23

आप किस डिवाइस पर इस समस्या का सामना कर रहे हैं? (सैमसंग / एचटीसी आदि)

अगर यह सैमसंग है,

विभिन्न सैमसंग फोन फ्रेमवर्क या क्लासपाथ में एंड्रॉइड सपोर्ट लाइब्रेरी के पुराने संस्करणों में शामिल हैं। यदि आप नई सामग्री समर्थन लाइब्रेरी का उपयोग करते हैं, तो आप उन सैमसंग उपकरणों पर यह क्रैश देखेंगे:

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


क्या आप समर्थन v4 के लिए प्रोगार्ड का उपयोग करते हैं?
जारेड बुर

@JaredBurrows मैंने समर्थन v7 के लिए प्रयास किया है। लेकिन v4 के लिए भी यह काम करेगा।
गणेश एबी - Android

2
@ Android007: उस कार्य को इंगित करने के लिए धन्यवाद, जो वास्तव में काम करता है। हालांकि, कोई भी यह समझाने में सक्षम नहीं हो पाता है कि दोषपूर्ण रोम अपने बूटक्लासपैथ में पुराने एंड्रॉइड सपोर्ट लाइब्रेरी को एम्बेड करने का कारण क्यों बनता है, क्योंकि यह अपवाद "Android.support.v7.internal.view.menu.MenuBuilder" श्रेणी में उपलब्ध है। एपीके का DEX कोड जो इस समस्या से ग्रस्त है। क्या आपके पास कोई संकेतक होगा जो बताता है कि एंड्रॉइड रनटाइम बूटक्लासपैथ जार / डेक्स फाइलों से ली गई कक्षाओं और एप्लिकेशन के लिए कैसे लोड करता है, कृपया? या कोई सटीक स्पष्टीकरण, कृपया?
atdouard Mercier

@ LatedouardMercier देर से जवाब के लिए क्षमा करें। वर्तमान में मेरे पास आपके प्रश्न का कोई उत्तर नहीं है, लेकिन मैं जल्द ही आपके पास वापस आऊंगा। :)
गणेश एबी - एंड्रॉइड

धन्यवाद @ Android007, किसी भी प्रोग्रामर के रूप में, मुझे बहुत ज्यादा जादू टोना पसंद नहीं है;) एक संकेत: क्या एम्बेडेड बूटक्लासपाठ में "सील" .jar / .dex होगा, जो व्यवहार के लिए जिम्मेदार होगा?
atdouard Mercier

15

यह मुद्दा वापस आ गया AppCompat 23.1.1जहां .internalपैकेज को लाइब्रेरी जार से हटा दिया गया था।

जैसा कि ऊपर की टिप्पणियों में सुझाया गया है (जो लोगों ने इसे वहां सुझाया है) को श्रेय दिया, अब प्रॉपगार्ड कॉन्फ़िगरेशन को भी बदलना होगा।

ऊपर दिए गए उत्तर को फिर से काम करने के लिए, इन पंक्तियों को अपनी प्रॉपर फ़ाइलों में जोड़ने का प्रयास करें:

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

!android.support.v7.view.menu.**SubMenuBuilder
JaredBanyard

12

बग-रिपोर्ट के अंतिम पदों के अनुसार, यह समर्थन लाइब्रेरी के नए संस्करण (24.0.0) पर तय किया जाना चाहिए: https://code.google.com/p/android/issues/detail?id=78377 # c374

किसी ने यह भी दावा किया कि यह तय है।

यह संस्करण पिछले महीने से उपलब्ध है , इसलिए आपको इसे अपडेट करना चाहिए।


हमारा परीक्षण इस बात की पुष्टि करता है कि 24.0.0 समस्या को हल करता है। हमने सपोर्ट लाइब्रेरी को 24.0.0 (अल्फा नहीं) में अपग्रेड किया है, हम जो वर्कअराउंड के रूप में उपयोग कर रहे थे उसे हटा दिया और सैमसंग टेस्ट डिवाइस पर कोई क्रैश नहीं देखा, जहां हमने पहले क्रैश देखा है।
मार्क मैक्लेलैंड

4

हाँ। सैमसंग पहले से ही इस समस्या के बारे में जानता है। मेरा सुझाव है कि आप GitHub से पॉपअप के समान कार्यान्वयन का उपयोग करने का प्रयास कर सकते हैं । यह सबसे अच्छा तरीका नहीं है, लेकिन काम करेगा।


1
हां मैंने सैमसंग फोरम पर देखा था लेकिन ऐसा नहीं लगता कि वे रुचि रखते हैं क्योंकि उनके किसी प्रतिनिधि या समर्थन ने जवाब नहीं दिया है।
मैट के

4

मैं USB मेनू डीबगिंग मोड में नहीं मिला इस MenuBuilder वर्ग की एक ही समस्या थी। मैं बस की स्थापना करके इस समस्या का समाधान minifyEnabled को सच दोनों रिहाई और डिबग में buildTypes के ब्लॉक build.gradle । इस तरह:

buildTypes {

    debug {

        minifyEnabled true
    }

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

मैं सेट minifyEnabled में सच करने के लिए डिबग एक जीवित हैंडसेट के लिए USB डीबगिंग के माध्यम से दुर्घटनाग्रस्त से एप्लिकेशन को रोकने के लिए लिखें।


0

मैंने एक ग्रहण परियोजना के साथ प्रदान की गई डिफ़ॉल्ट प्रॉपगार्ड गुणों के साथ प्रोगार्ड को सक्षम किया और समस्या मेरे लिए तय की गई। कुछ टिप्पणियों के आधार पर यहां https://code.google.com/p/android/issues/detail?id=78377 , कुछ लोगों को: -repackageclasses "android.support.v7" का उपयोग करके फिर से भेजना पड़ सकता है।


ऐसा लगता है कि फोरम के अधिकांश लोगों के लिए यह काम नहीं कर रहा है। Appcompat-20 में वापस जाने जैसा लगता है एक अधिक विश्वसनीय विकल्प है।
मैट के

यह कथित रूप से v23.1.1 के समर्थन में हल किया गया है
टिम

0

एंड्रॉइड स्टूडियो के माध्यम से मेरे सैमसंग गैलेक्सी टैब 3 टैबलेट पर 'हैलो वर्ल्ड' ऐप चलाने की कोशिश करते समय मुझे वही त्रुटि मिली। ऐप लॉन्च होता दिखाई देगा और फिर यह तुरंत क्रैश हो जाएगा और यह त्रुटि एंड्रॉइड स्टूडियो में कंसोल में दिखाई देगी। मैंने टैबलेट पर एक सिस्टम अपडेट किया और अब मैं 'हैलो वर्ल्ड' ऐप चलाने में सक्षम हूं और मुझे अब कोई त्रुटि नहीं मिल रही है। मुझे उम्मीद है कि इससे किसी को अपने मुद्दे को हल करने में मदद मिलेगी।

नोट: मैंने टैबलेट पर जो सिस्टम अपडेट किया, उसने एंड्रॉइड ओएस संस्करण को अपडेट नहीं किया, क्योंकि यह अभी भी कहता है कि संस्करण 4.2.2 है।


-4

अपनी परियोजना के संकलित एसडीके संस्करण को "एपीआई 18: (जेलीबीन)" में बदलें

डिफ़ॉल्ट "लॉलीपॉप" पर सेट है

कदम

  1. अपनी परियोजना पर राइट क्लिक करें और ओपन मॉड्यूल सेटिंग्स चुनें (या F4 दबाएं)
  2. गुण टैब में संकलित Sdk संस्करण
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.