9

güncelleştirildikten sonra 4.2.2 telefonlar ile bu sorun için https://code.google.com/p/android/issues/detail?id=78377 listelenen birçok çözümden birini uygulamıştım ama şimdi 23 numaralı araçları desteklemeye güncelledim, sorun geri geldi. Bu sorun raporuna bakarsanız, güncellemeden bu yana aynı sorunu olan birçok insan olduğunu görürsünüz.Bir kez daha java.lang.NoClassDefFoundError alma: android.support.v7.internal.view.menu.i Destek Araçları 23

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

Herhangi çözümleri:

java.lang.NoClassDefFoundError: android.support.v7.internal.view.menu.i 
     at android.support.v7.widget.ActionMenuView.getMenu(ActionMenuView.java:643) 
     at android.support.v7.widget.Toolbar.ensureMenu(Toolbar.java:876) 
     at android.support.v7.widget.Toolbar.getMenu(Toolbar.java:847) 
     at android.support.v7.internal.widget.ToolbarWidgetWrapper.getMenu(ToolbarWidgetWrapper.java:702) 
     at android.support.v7.internal.app.ToolbarActionBar.getMenu(ToolbarActionBar.java:583) 
     at android.support.v7.internal.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.java:441) 
     at android.support.v7.internal.app.ToolbarActionBar$1.run(ToolbarActionBar.java:65) 
     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:776) 
     at android.view.Choreographer.doCallbacks(Choreographer.java:579) 
     at android.view.Choreographer.doFrame(Choreographer.java:547) 
     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:762) 
     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(Method.java) 
     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(NativeStart.java) 

Benim proguard bu vardır: bunlar https://code.google.com/p/android/issues/detail?id=78377

geldiği için NoClassDefFoundError: android.support.v7.internal.view.menu.MenuBuilder üzerine çözümler de bu alıyorum istisna değildir çalışmaz? Kullanıcılardan çok sayıda şikayet almak.

+0

beni bunu ekledikten sonra hala aynı sorunu yaşıyor. 4.2.2 çalışan cihazlar – Mikey

cevap

5

Hedeflenen sınıflar artık gizlenmediğinden, ProGuard'ınızın "sınıfı tut" kuralının güncellenmesi gerekir. Destek araçlarının 23 sürümünde, Google menü ile ilgili sınıfları dahili paketin dışına taşıdı. Aşağıdaki ProGuard kurallarının, Android 4.2.2'yi çalıştıran belirli Samsung cihazlarında görülen NoClassDefFoundError uygulamasını elimine ettiğini doğrulayabilirim.

# Workaround for conflict with certain OEM-modified versions of the Android appcompat 
# support libs, especially Samsung + Android 4.2.2 
# See this thread for more info: 
# https://code.google.com/p/android/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars&groupby=&sort=&id=78377 
-keepattributes ** 
# Keep all classes except the ones indicated by the patterns preceded by an exclamation mark 
-keep class !android.support.v7.view.menu.**,!android.support.design.internal.NavigationMenu,!android.support.design.internal.NavigationMenuPresenter,!android.support.design.internal.NavigationSubMenu,** {*;} 
# Skip preverification 
-dontpreverify 
# Specifies not to optimize the input class files 
-dontoptimize 
# Specifies not to shrink the input class files 
-dontshrink 
# Specifies not to warn about unresolved references and other important problems at all 
-dontwarn ** 
# Specifies not to print notes about potential mistakes or omissions in the configuration, such as 
# typos in class names or missing options that might be useful 
-dontnote ** 

şiddetle dex2jar kullanmak ve istenen gizleme oldu (: https://stackoverflow.com/a/10191338/315702 Burada anlatılan) onaylamak için jd önerilir. Maalesef, paketlerin taşınması veya yeniden adlandırılması durumunda, destek araçlarını her yükselttiğinizde bu yapılmalıdır.

Google, "iç" paketin dışındaki sınıfları, bunun NoClassDefFoundError'a neden olan sınıf yolu çakışmasını önleyeceğini umarak taşındı. Chris Banes Bu hata (https://code.google.com/p/android/issues/detail?id=78377) için parçacığı üzerinde gerekli olduğu hallerde, bunlar düzeltmeyi doğrulamak için değil test yaptım - ve bir sürü insan beri görüyorsanız aynı kazasında bildirmiştir:

Right, we've decided to do a one-time rename of the internal classes which should fix this. I have done no testing on those devices though, and don't plan on doing any either.

İlgili konular