9

Ich hatte eine der vielen Lösungen auf https://code.google.com/p/android/issues/detail?id=78377 für dieses Problem mit 4.2.2 Telefone implementiert implementiert Aber jetzt, da ich die Tools 23 aktualisiert habe, ist das Problem wieder da. Wenn Sie sich diesen Problembericht ansehen, werden Sie sehen, dass es seit der Aktualisierung viele Leute mit dem gleichen Problem gibt. Die Lösungen auf NoClassDefFoundError: android.support.v7.internal.view.menu.MenuBuilder auch nicht funktionieren, weil sie kommen aus https://code.google.com/p/android/issues/detail?id=78377Noch einmal java.lang.NoClassDefFoundError: android.support.v7.internal.view.menu.i nach dem Update auf Support-Tools 23

Dies ist die Ausnahme Ich erhalte:

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) 

Mein proguard hat dies:

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

Irgendwelche Lösungen? viele Beschwerden von Nutzern bekommen.

+0

mich Ich habe immer noch das gleiche Problem, nachdem ich das hinzugefügt habe. laufende Geräte 4.2.2 – Mikey

Antwort

5

Ihre ProGuard-Regel "Klasse beibehalten" muss aktualisiert werden, da die Zielklassen nicht länger verschleiert werden. In Version 23 der Supporttools hat Google die menübezogenen Klassen aus dem internen Paket entfernt. Ich kann bestätigen, dass die folgenden ProGuard-Regeln den NoClassDefFoundError beseitigt haben, der auf bestimmten Samsung-Geräten mit Android 4.2.2 zu sehen war.

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

Ich empfehle dringend, dass Sie dex2jar verwenden und jd, um zu bestätigen, dass die gewünschte Verdunkelung passiert ist (hier beschrieben: https://stackoverflow.com/a/10191338/315702). Leider sollte dies jedes Mal durchgeführt werden, wenn Sie die Support-Tools aktualisieren, falls Pakete verschoben oder erneut umbenannt werden.

Google verlagerte die Klassen aus dem "internen" Paket in der Hoffnung, dass dies den Klassenpfadkonflikt vermeiden würde, der NoClassDefFoundError verursacht. Doch wie Chris Banes für diesen Fehler auf dem Thread angegeben (https://code.google.com/p/android/issues/detail?id=78377), haben sie nicht Test um das Update zu überprüfen - und viele Leute haben sich seit den gleichen Absturz gemeldet Sie sehen:

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.