9

https://code.google.com/p/android/issues/detail?id=78377にリストされている多くのソリューションの 1 つを実装して、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)

私のプロガードはこれを持っています:

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

解決策はありますか?ユーザーからのクレームが多い。

4

1 に答える 1

5

対象となるクラスが難読化されなくなったため、ProGuard の「クラスを保持」ルールを更新する必要があります。サポート ツールのバージョン 23 で、Google はメニュー関連のクラスを内部パッケージから移動しました。次の ProGuard ルールにより、Android 4.2.2 を実行している特定の Samsung デバイスで見られた NoClassDefFoundError が排除されたことを確認できます。

# 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 の原因となるクラスパスの競合を回避することを期待して、「内部」パッケージからクラスを移動しました。ただし、Chris Banes がこのバグのスレッド ( https://code.google.com/p/android/issues/detail?id=78377 ) で述べているように、彼らは修正を検証するためのテストを行っていません。それ以来、あなたが見ているのと同じクラッシュが報告されています:

そうです、これを修正する必要がある内部クラスの 1 回限りの名前変更を行うことにしました。ただし、これらのデバイスでテストを行ったことはありません。また、行う予定もありません。

于 2015-12-02T18:53:38.187 に答える