Еще раз получив java.lang.NoClassDefFoundError: android.support.v7.internal.view.menu.i после обновления в Инструменты поддержки 23

Я применил одно из многочисленных решений, перечисленных на https://code.google.com/p/android/issues/detail?id=78377 для этой проблемы с 4.2.2 телефонами, но теперь, когда я обновил для поддержки инструментов 23 Проблема вернулась. Если вы посмотрите на отчет об этой проблеме, вы увидите, что с момента обновления обновлено много людей с той же проблемой. Решения на NoClassDefFoundError: android.support.v7.internal.view.menu.MenuBuilder также не работают, потому что они исходят из https://code.google.com/p/android/issues/detail?id=78377

Это исключение, которое я получаю:

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) 

У моей proguard есть следующее:

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

Любые решения? Получая множество жалоб от пользователей.

Необходимо обновить правило «держать класс» ProGuard, поскольку целевые классы больше не запутываются. В версии 23 инструментов поддержки Google переместил классы, связанные с меню, из внутреннего пакета. Я могу подтвердить, что следующие правила ProGuard устранили NoClassDefFoundError, которые наблюдались на некоторых устройствах Samsung под управлением Android 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 ** 

Я настоятельно рекомендую вам использовать dex2jar и jd, чтобы подтвердить, что произошла нужная обфускация (описано здесь: https://stackoverflow.com/a/10191338/315702 ). К сожалению, это нужно делать каждый раз, когда вы обновляете инструменты поддержки, в случае, если пакеты перемещаются или переименовываются снова.

Google переместил классы из «внутреннего» пакета в надежде, что это позволит избежать конфликта классов, вызывающего NoClassDefFoundError. Однако, как сказал Крис Бэйнс в теме об этой ошибке ( https://code.google.com/p/android/issues/detail?id=78377 ), они не тестировали, чтобы проверить исправление – и много людей С тех пор сообщили о том же сбое, который вы видите:

Правильно, мы решили сделать однократное переименование внутренних классов, которые должны исправить это. Тем не менее, я не тестировал эти устройства и не планирую делать ни одно из них.