NoClassDefFoundError: android.support.v7.intern.view.menu.MenuBuilder


170

স্যামসাং ডিভাইসগুলিতে অ্যান্ড্রয়েড ৪.২ চালিত অ্যান্ড্রয়েড অ্যাপকম্প্যাট ভি 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)

এটি কাস্টমএ্যাকটিভিটি.জভা 215 লাইনের লাইন:

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

ক্র্যাশগুলি ডিভাইসের একটি অ্যারে থেকে আসে, তবে সর্বদা স্যামসাং এবং সর্বদা অ্যান্ড্রয়েড 4.2।

একটি দ্রুত ওয়েব অনুসন্ধান আমাকে বিশ্বাস করতে পরিচালিত করে যে অনেকের একই সমস্যা রয়েছে, আমি সমস্যাটি সমাধান করার চেষ্টা করেছি এমন কয়েকটি পদক্ষেপ হ'ল:

  • অ্যান্ড্রয়েড প্রকল্পের বৈশিষ্ট্যগুলি পরীক্ষা করুন, অ্যাপকম্প্যাট লাইব্রেরিটি সঠিকভাবে যুক্ত হয়েছে তা নিশ্চিত করুন।
  • জাভা বিল্ড পাথ অর্ডার এবং এক্সপোর্ট প্রকল্পের বৈশিষ্ট্যগুলি পরীক্ষা করুন, অ্যান্ড্রয়েড নির্ভরতা এবং অ্যান্ড্রয়েড বেসরকারী লাইব্রেরিগুলি চেক করা আছে তা নিশ্চিত করুন।
  • ক্লাবটি গ্রন্থাগারে অন্তর্ভুক্ত রয়েছে তা নিশ্চিত করুন (android.support.v7.internal.view.menu.MenuBuilder)।
  • কনফার্ম আর.জাভা অ্যানড্রইড.সুপুরপোর্ট.ভি 7.appcompat এর জন্য জেন ডিরেক্টরিতে অবস্থিত।
  • নিশ্চিত করুন অ্যাপকম্প্যাট থিমটি ম্যানিফেস্ট.এক্সএমএল ক্রিয়াকলাপের অন্তর্ভুক্ত।
  • প্রকল্পটি পরিষ্কার এবং পুনর্নির্মাণ করুন।

এই পদক্ষেপগুলি সত্ত্বেও, এবং এটি অন্যান্য সমস্ত ডিভাইস এবং অ্যান্ড্রয়েড সংস্করণে কাজ করেও ক্র্যাশ প্রতিবেদনগুলি এখনও আসে।


4
দ্রষ্টব্য: আমি কিউমোবাইল এক্স 25 এও ঘটতে দেখেছি যা পাকিস্তানের বাইরে একটি নিম্ন প্রান্তের ফোন। সুতরাং দেখে মনে হচ্ছে অয়েথাররা ব্যর্থ স্যামসাং রমের মতো একই পদ্ধতি বা একই রম নিয়েছে।
উইলিয়াম

যেহেতু গুগল এবং স্যামসাং উভয়ই এই বিশাল সমস্যাটি সমাধানে সহায়ক নয়, তাই কেউ কি এমন কোনও সমাধানের কথা ভাবতে পারেন যা প্রগার্ডকে জড়িত না করে (যা অন্যান্য সমস্যা উত্থাপন করে)?
চেকলিস্ট

গুগল এটি সম্পর্কে কিছুই করতে যাচ্ছে না যেহেতু এটি স্যামসুং বলে মনে হয় যে গ্রন্থাগারগুলির মধ্যে নাম সংঘর্ষের কারণে অতিরিক্ত পরিবর্তন হয়েছে। প্রগার্ড সংঘর্ষ এড়ায়। অ্যান্ড্রয়েড ইস্যু ট্র্যাকার ফোরামে কোনও ভাল সমাধান দেখেনি ।
ম্যাট কে

আমি পাকিস্তানের বাইরেও কিউমোবাইল এ 290 যুক্ত করতে পারি।

2
একই ইস্যু [কিউমোবাইল এক্স 30 - অ্যান্ড্রয়েড 4.4.2]
শানরাইশান

উত্তর:


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

ক্রেডিট # 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
@ জ্যারেডবুরোস আপনি লাইব্রেরিটি সরাবেন না, আপনি কেবলমাত্র এটিকে অ্যান্ড্রয়েড.সুপারপোর্টের আওতায় অ্যান্ড্রয়েড.সুফোর্টের আওতাধীন সমস্ত বিষয় উপেক্ষা করে ডিফল্টরূপে এটিকে অগ্রাহ্য করার জন্য অগ্রগামীকে বলেছেন
একত্রিত করুন

2
আমি কয়েক মাস ধরে এই সমস্যাটির প্রতিবেদনটি থেকে সমাধানটি ব্যবহার করছি এবং হঠাৎ করে সর্বশেষ সমর্থন লাইব্রেরিগুলিতে আপডেট করার পরে এবং এসডিকে 23 আমি ক্র্যাশলিটিক্সের উপর এই নতুন প্রতিবেদনটি পাওয়া শুরু করেছি:java.lang.NoClassDefFoundError: android.support.v7.internal.view.menu.i
ক্যাসলর্জ

3
দ্বিতীয়টি অ্যাপকোম্প্যাট ভি 23 এ আপগ্রেড করার পরে সমস্যাটি আমার অ্যাপে ফিরে এসেছে returned আমি অ্যাপকম্প্যাট v.23.1.1 জার ফাইলটি বিশ্লেষণ করে দেখেছি যে তারা ভি 7-র ভিতরে "অভ্যন্তরীণ" ডিরেক্টরিটি সরিয়ে ফেলেছে, সুতরাং মনে হচ্ছে প্রগার্ড নির্দেশিকা লাইনটি এখনই হওয়া উচিত: [-কোর্ড! Android.support.v7.view। মেনু। **, android.support। ** {*;}] সমস্যাটি ঘটেছিল এমন কোনও সত্যিকারের ডিভাইসে পরীক্ষার থেকে এখনও আমার কাছে নিশ্চিতকরণ নেই। এই জাতীয় ডিভাইস সহ যে কেউ এটি পরীক্ষা করতে পারে? অথবা হতে পারে 'অভ্যন্তরীণ' দির অপসারণ আসলেই এই সমস্যার সমাধান এবং আমাদের আর প্রগার্ড ক্লাসের নতুন নামকরণের সাথে গণ্ডগোল করার দরকার নেই?
গ্রেগকো

7
আপনার অগ্রগামী সেটিংসে এটি যুক্ত করুন, এটি সমস্যার সমাধান করবে: অ্যাপক্যাম্প্যাট ২৩.১.১: -র জন্য ক্লাস করুন! Android.support.v7.view.menu । keep -কিফার ইন্টারফেস android.support.v7। * { ; APP পুরানো অ্যাপকোম্যাট সংস্করণটির জন্য: -রক্ষক শ্রেণি! Android.support.v7.intern.view.menu। * মেনুবিল্ডার , android.support.v7। ** { ; keep -কিফার ইন্টারফেস android.support.v7। * {*; }
Andrea Bellitto

26

হিসাবে # 150 Google Groups থেকে বললেন

কারণ কিপেন ক্লাসের সাথে সাবধান! Android.support.v7.intern.view.menu। **। সেখানে বেশ কয়েকটি ক্লাস রয়েছে যা অ্যাপকম্পটের সংস্থান থেকে রেফারেন্স করা হয়েছে।

আরও ভাল সমাধান পরিবর্তে নিম্নলিখিত লাইন যুক্ত করা হয়:

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

আমার পরীক্ষাগুলিতে, উত্পন্ন উত্সাহীন ম্যাপিং ফাইলটির পর্যালোচনার উপর ভিত্তি করে, প্রস্তাবিত এই অগ্রগতি কনফিগারেশনের ফলে মেনুবিল্ডার শ্রেণীর নামটি অস্পষ্ট হয় না, যদিও এটি সাবমেনু বিল্ডারকে অস্পষ্ট করে।
অ্যান্ডি ড্যানি

3
@ উইলিয়াম কেউ এটি মুছে ফেলেছে, কেন তা জানি না। যাইহোক, এখানে আমার সমাধান: -keep class !android.support.v7.internal.view.menu.* implements android.support.v4.internal.view.SupportMenu, android.support.v7.** {*;}
অ্যান্ডি ডেনি

3
এটি আমার জন্য কাজ করেছিল যেখানে অ্যাপ কমপ্যাটটির ভি 23 নিয়ে -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 সমর্থন গ্রন্থাগার উপর অভ্যন্তরীণ প্যাকেজ পাথ পরিবর্তন করা হয়েছে, তাই এখন সঠিক proguard সেটিং হল: -keep বর্গ android.support.v7.view.menu * MenuBuilder *, android.support.v7 ** {।। ; keep -কিফার ইন্টারফেস android.support.v7। * {*; }
Andrea Bellitto

23

আপনি কোন ডিভাইসে এই সমস্যার মুখোমুখি? (স্যামসাং / এইচটিসি ইত্যাদি)

যদি এটি স্যামসং হয়,

বিভিন্ন স্যামসাং ফোন ফ্রেমওয়ার্ক বা ক্লাসপাথে অ্যান্ড্রয়েড সমর্থন লাইব্রেরির পুরানো সংস্করণ অন্তর্ভুক্ত করা হয়েছে। আপনি যদি নতুন উপাদান সমর্থন লাইব্রেরি ব্যবহার করেন তবে আপনি এই ক্র্যাশটি সেই স্যামসাং ডিভাইসে দেখতে পাবেন:

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

এটি ঠিক করতে, আপনাকে অবশ্যই এই শ্রেণীর নাম পরিবর্তন করতে হবে। এটি করার সহজ উপায় হ'ল অগ্রগতি চালানো। আপনি যদি আপত্তি জানাতে না চান, তবে আপত্তিজনক শ্রেণির নামকরণের জন্য এখানে 1 টি লাইনার রয়েছে:

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

এই সমস্যাটি ট্র্যাক করার ক্ষেত্রে একটি সমস্যা রয়েছে, তবে এটি যেহেতু সত্যই এটি একটি স্যামসাং বাগ, এটি কখনই তাদের শেষের দিকে স্থির হতে পারে না। গুগল / এওএসপি সাইডে এটি ঠিক করার একমাত্র উপায় হল এই অভ্যন্তরীণ ক্লাসগুলির নামকরণ।

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


আপনি সমর্থন ভি 4 জন্য অগ্রসর ব্যবহার করেন?
জ্যারেড বুরোজ

@ জারেডবুরোস আমি ভি 7 সমর্থন করার চেষ্টা করেছি। তবে ভি 4 এর জন্যও এটি কাজ করবে।
গণেশ এবি - অ্যান্ড্রয়েড

2
@ অ্যান্ড্রয়েড 77:: বাস্তবে যে কাজ করে তার চারপাশে নির্দেশ করার জন্য আপনাকে ধন্যবাদ। তবে, কেউ বুটক্লাসপাথে পুরানো অ্যান্ড্রয়েড সাপোর্ট লাইব্রেরি এম্বেড করে থাকা দোষী রমগুলি কেন এই ব্যতিক্রম ঘটায় তা অনুধাবন করতে সক্ষম বলে মনে হচ্ছে না "android.support.v7.internal.view.menu.MenuBuilder" ক্লাসটি অনুপস্থিত রয়েছে। অ্যাপ্লিকেশনটির ডেক্স কোড যা এই সমস্যাটিতে ভুগছে। আপনার হাতে এমন কোনও পয়েন্টার রয়েছে যা ব্যাখ্যা করে যে কীভাবে অ্যান্ড্রয়েড রানটাইম বুটক্লাসপাথ জার / ডেক্স ফাইল এবং অ্যাপ্লিকেশনগুলির থেকে নেওয়া ক্লাসগুলি লোড করে? বা কোন সঠিক ব্যাখ্যা, দয়া করে?
ডার্ড মার্সিয়ার 21

@ OudouardMercier দেরিতে জবাবের জন্য দুঃখিত। বর্তমানে আপনার প্রশ্নের উত্তর আমার কাছে নেই তবে আমি শীঘ্রই আপনার কাছে ফিরে আসব। :)
গণেশ এবি - অ্যান্ড্রয়েড

আপনাকে ধন্যবাদ @ অ্যান্ড্রয়েড 700
ouডার্ড মার্সিয়ার

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.**সাবমেনু বিল্ডার
জ্যারেডব্যানইয়ার্ড

12

বাগ-রিপোর্টের সর্বশেষ পোস্ট অনুসারে, সমর্থন লাইব্রেরির নতুন সংস্করণে এটি নির্ধারণ করা উচিত (24.0.0): https://code.google.com/p/android/issues/detail?id=78377 # c374

কেউ এমনকিএটি স্থির করে দাবি করেছেন।

এই সংস্করণটি গত মাস থেকে উপলব্ধ , সুতরাং আপনার এটি আপডেট করা উচিত।


আমাদের পরীক্ষাটি নিশ্চিত করে যে 24.0.0 সমস্যাটি সমাধান করে। আমরা সমর্থন লাইব্রেরিটিকে ২৪.০.০ (আলফা নয়) এ আপগ্রেড করেছি, আমরা যে কাজটি পুরোপুরিভাবে ব্যবহার করছি তা অপসারণ করেছি এবং স্যামসাং টেস্ট ডিভাইসে কোনও ক্র্যাশ দেখা যায়নি যেখানে আমরা এর আগে ক্রাশটি দেখেছি।
মার্ক ম্যাককেলল্যান্ড 21

4

হ্যাঁ. স্যামসুং ইতিমধ্যে এই সমস্যাটি সম্পর্কে জানে । আমি আপনাকে গিটহাব থেকে পপআপ একই বাস্তবায়ন ব্যবহার করার চেষ্টা করার পরামর্শ দিতে পারি । এটি সেরা উপায় নয়, তবে কাজ হবে।


1
হ্যাঁ আমি সেগুলি স্যামসাং ফোরামে দেখেছি তবে মনে হয় না যে তারা আগ্রহী কারণ তাদের কোন প্রতিনিধি বা সমর্থন জবাব দেয়নি।
ম্যাট কে

4

আমি ইউএসবি ডিবাগিং মোডে পাওয়া যায় না এই মেনুবিল্ডার ক্লাস একই সমস্যা ছিল। আমি কেবল সেটিং দ্বারা এই সমস্যার সমাধান 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" ব্যবহার করে পুনঃস্থাপন করতে হতে পারে


দেখে মনে হচ্ছে এটি ফোরামের বেশিরভাগ মানুষের জন্য কাজ করছে না। অ্যাপকম্প্যাট -২০ এ ফিরে যাওয়ার মতো আরও নির্ভরযোগ্য বিকল্প।
ম্যাট কে

এটি সম্ভবত v23.1.1 সমর্থনে সমাধান করা হয়েছে
টিম

0

অ্যান্ড্রয়েড স্টুডিওর মাধ্যমে আমার স্যামসং গ্যালাক্সি ট্যাব 3 ট্যাবলেটে 'হ্যালো ওয়ার্ল্ড' অ্যাপটি চালানোর চেষ্টা করার সময় আমি একই ত্রুটি পেয়েছি। অ্যাপ্লিকেশনটি চালু হতে পারে এবং তারপরে এটি তাত্ক্ষণিকভাবে ক্র্যাশ হবে এবং সেই ত্রুটিটি অ্যান্ড্রয়েড স্টুডিওতে কনসোলে প্রদর্শিত হবে। আমি ট্যাবলেটে একটি সিস্টেম আপডেট করেছি এবং এখন আমি 'হ্যালো ওয়ার্ল্ড' অ্যাপটি চালাতে সক্ষম হয়েছি এবং আমি আর ত্রুটি পাচ্ছি না। আমি আশা করি এটি কারও সমস্যা সমাধানে সহায়তা করবে।

দ্রষ্টব্য: আমি ট্যাবলেটে যে সিস্টেম আপডেট করেছি তা অ্যান্ড্রয়েড ওএস সংস্করণ আপডেট করে নি, কারণ এটি এখনও বলে যে সংস্করণটি 4.2.2।


-4

আপনার প্রকল্পের কমপাইল এসডিকে সংস্করণটি "এপিআই 18: (জেলিবিয়ান)" এ পরিবর্তন করুন

ডিফল্টটি "ললিপপ" তে সেট করা আছে

STEPS টি

  1. আপনার প্রকল্পে ডান ক্লিক করুন এবং মডিউল সেটিংস খুলুন নির্বাচন করুন (বা F4 টিপুন)
  2. বৈশিষ্ট্য ট্যাবে সংকলিত এসডিকে সংস্করণ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.