ClassNotFound:带有支持库 26.0.2 - 27.0.0 的 android.view.ViewStructure

Posted

技术标签:

【中文标题】ClassNotFound:带有支持库 26.0.2 - 27.0.0 的 android.view.ViewStructure【英文标题】:ClassNotFound: android.view.ViewStructure with Support Library 26.0.2 - 27.0.0 【发布时间】:2018-04-14 21:05:31 【问题描述】:

我看到搭载 android 4.4.2 的三星 Galaxy S5 发生崩溃

NoClassDefFoundError: android/view/ViewStructure

自从我将支持库更新到 26.0.2 后,这种情况就一直在发生。现在它也发生在 27.0.0 上,尽管我预计这些问题已经在其中得到解决。在将应用程序提交到 Google Play 后不久,我在 Crashlytics 中看到了一次崩溃(我正在向一小部分用户推出)。我不知道重现的确切步骤是什么。到目前为止,我认为这可能是应用程序启动的时间。

相关报道:

java.lang.NoClassDefFoundError: android/graphics/drawable/Icon

ViewDebug.getExportedPropertyMethods java.lang.NoClassDefFound android/graphics/drawable/Icon

我正在使用支持库 27.0.0、compileSdkVersion 27、targetSdkVersion 25、buildToolsVersion '26.0.2'、android 插件 2.3.3、gradle 3.3、Android Studio 3.0。 (我猜这个问题与旧版本的 gradle 和插件无关?...)

我可以看到 ViewStructure 在支持库中使用:

android.support.design.widget.TextInputLayout 
android.support.design.testutils.ViewStructureImpl

但是,我没有在我的项目中的任何地方使用 ViewStructure。

Fatal Exception: java.lang.NoClassDefFoundError: android/view/ViewStructure
       at java.lang.Class.getDeclaredMethods(Class.java)
       at java.lang.Class.getDeclaredMethods(Class.java:656)
       at android.view.ViewDebug.getExportedPropertyMethods(ViewDebug.java:960)
       at android.view.ViewDebug.exportMethods(ViewDebug.java:1047)
       at android.view.ViewDebug.dumpViewProperties(ViewDebug.java:997)
       at android.view.ViewDebug.dumpViewProperties(ViewDebug.java:983)
       at android.view.ViewDebug.dumpView(ViewDebug.java:900)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:855)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dump(ViewDebug.java:793)
       at android.view.ViewDebug.dispatchCommand(ViewDebug.java:416)
       at android.view.ViewRootImpl$W.executeCommand(ViewRootImpl.java:6258)
       at android.view.IWindow$Stub.onTransact(IWindow.java:65)
       at android.os.Binder.execTransact(Binder.java:404)
       at dalvik.system.NativeStart.run(NativeStart.java)
Caused by java.lang.ClassNotFoundException: Didn't find class "android.view.ViewStructure" on path: DexPathList[[zip file "/data/app/package.name-1.apk"],nativeLibraryDirectories=[/data/app-lib/package.name-1, /vendor/lib, /system/lib]]
       at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
       at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
       at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
       at java.lang.Class.getDeclaredMethods(Class.java)
       at java.lang.Class.getDeclaredMethods(Class.java:656)
       at android.view.ViewDebug.getExportedPropertyMethods(ViewDebug.java:960)
       at android.view.ViewDebug.exportMethods(ViewDebug.java:1047)
       at android.view.ViewDebug.dumpViewProperties(ViewDebug.java:997)
       at android.view.ViewDebug.dumpViewProperties(ViewDebug.java:983)
       at android.view.ViewDebug.dumpView(ViewDebug.java:900)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:855)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dump(ViewDebug.java:793)
       at android.view.ViewDebug.dispatchCommand(ViewDebug.java:416)
       at android.view.ViewRootImpl$W.executeCommand(ViewRootImpl.java:6258)
       at android.view.IWindow$Stub.onTransact(IWindow.java:65)
       at android.os.Binder.execTransact(Binder.java:404)
       at dalvik.system.NativeStart.run(NativeStart.java)

【问题讨论】:

你在做什么导致崩溃? 我用这个信息编辑了这个问题。在我推出后不久,我在 Crashlytics 中遇到了一次崩溃(针对我的一小部分用户群),我不知道重现的确切步骤是什么。到目前为止,我认为它可能是在应用启动时。 堆栈跟踪看起来像是来自 Layout Inspector 等实用程序的东西。 ViewStructure 是在 Android 6.0 中添加的。 @CommonsWare 我也这么认为。出于某种原因,我脑海中闪过的要么是高级用户在我的应用程序上尝试奇怪的东西,要么是 Google 进行自动化测试/检查。不确定。很快我会增加推广百分比,如果有什么有趣的事情,我会分享。 @fada21,在将新版本上传到 Google Play 开发控制台后始终保持相同。我猜,它来自预发布测试设备。希望,我们可以忽略它。 【参考方案1】:

此问题最可能的原因是用户不是普通用户,因为“只有在连接了 hierarchyviewer / ddm 时才会发生这种情况。”

更多信息可以在这里找到:

https://issuetracker.google.com/issues/68796830

【讨论】:

奇怪的是这意味着我们不能在这个版本的支持库中使用这些工具。但是,很高兴听到您得到了答案!【参考方案2】:

我正在从 25.3.1 迁移到 Support lib 27.1.1(是的,这里的人们行动不那么快......)并且在充气 TextInputLayouts 时也面临同样的崩溃。

经过一番调查,事实证明我们有一个自定义的LayoutInflater,它遍历完整的视图层次结构并在每个带有Guice 的视图中注入依赖项(使用injectMembers(View))(可能也会影响dagger)。这是必需的,因为我们有自定义视图,它具有通过 @Inject 注入的依赖项。

由于 Guice 遍历该类并在解析依赖项时尝试访问它的公共方法,它会遇到例如 TextInputLayout.dispatchProvideAutofillStructure(ViewStructure, int) 导致崩溃,因为 ViewStructure 在运行

所以这是一个示例,说明是什么导致了我们的问题,我们还没有一个好的解决方案,但可能我们要么摆脱自定义视图中的注入,要么我们注释这些视图,以便在遍历时只注入这些视图视图树。

【讨论】:

以上是关于ClassNotFound:带有支持库 26.0.2 - 27.0.0 的 android.view.ViewStructure的主要内容,如果未能解决你的问题,请参考以下文章

带有支持库的 FloatingActionButton 示例

使用带有最新支持库的 admob 15.0.0 时发生 Gradle 冲突

idea加载JSTL库

Maven的classNotFound错误?

从 apache Spark 运行 java 程序时出现 ClassNotFound 异常

安装 Sonata ClassificationBundle 自动加载 ClassNotFound