9

Zaimplementowałem jedno z wielu rozwiązań wymienionych na https://code.google.com/p/android/issues/detail?id=78377 dla tego problemu z telefonami 4.2.2 ale teraz, gdy zaktualizowałem, aby obsługiwać narzędzia 23, problem powrócił. Jeśli spojrzysz na ten raport o problemie, zobaczysz, że od czasu aktualizacji jest wiele osób z tym samym problemem. Rozwiązania dotyczące NoClassDefFoundError: android.support.v7.internal.view.menu.MenuBuilder również nie działają, ponieważ pochodzą one z https://code.google.com/p/android/issues/detail?id=78377Po raz kolejny uzyskanie informacji java.lang.NoClassDefFoundError: android.support.v7.internal.view.menu.i po zaktualizowaniu do narzędzi pomocy technicznej 23

Jest to wyjątek Dostaję:

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) 

Moja PROGUARD ma to:

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

Wszelkie rozwiązania? otrzymywanie wielu skarg od użytkowników.

+0

mnie też po tym, że nadal ma ten sam problem. urządzenia działające 4.2.2 – Mikey

Odpowiedz

5

Twoja reguła ProGuard "keep class" musi zostać zaktualizowana, ponieważ docelowe klasy nie są już zaciemniane. W wersji 23 narzędzi pomocy Google przeniósł klasy związane z menu z wewnętrznego pakietu. Mogę potwierdzić, że poniższe zasady ProGuarda wyeliminowały NoClassDefFoundError, który był widziany na niektórych urządzeniach Samsung z Androidem 4.2.2.

# 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 ** 

Zdecydowanie zalecamy używanie dex2jar i JD, aby potwierdzić, że pożądana zaciemniania działo się (opisane tutaj: https://stackoverflow.com/a/10191338/315702). Niestety, należy to robić za każdym razem, gdy aktualizujesz narzędzia wsparcia, na wypadek, gdyby pakiety zostały przeniesione lub ponownie zmienione.

Google przeniosło klasy z pakietu "wewnętrznego" w nadziei, że pozwoli to uniknąć konfliktu klasowego powodującego błąd NoClassDefFoundError. Jednak, jak stwierdził Chris Banes na gwincie dla tego błędu (https://code.google.com/p/android/issues/detail?id=78377), zrobili nie test, aby sprawdzić poprawki - i wiele osób tego czasu odnotowano taką samą katastrofę jesteś zobaczyć:

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.