【问题标题】:R8 Missing android.view Class WarningsR8 缺少 android.view 类警告
【发布时间】:2021-08-05 10:48:13
【问题描述】:

我最近开始在使用 R8 代码收缩器的发布构建期间看到以下三个错误:

R8:警告:缺少类:android.view.WindowInsetsAnimationControlListener

R8:警告:缺少类:android.view.WindowInsetsController$OnControllableInsetsChangedListener

R8:警告:缺少类:android.view.WindowInsetsAnimation$Callback

构建完成并且应用程序运行,但我怀疑这是我开始在 Google Play 控制台上看到的许多崩溃的原因。我无法在我自己的设备(或模拟器)上重现这些崩溃。从有限的堆栈跟踪来看,它们似乎与我自己的代码没有任何关系(我在这篇文章的底部包含了一个示例堆栈跟踪)。堆栈跟踪似乎显示与视图创建/渲染相关的错误,而 R8 错误与 android.view 相关,这就是为什么我怀疑它们是相关的(而且它们都同时开始出现的事实...... .).

我发现了许多与 R8 缺失类警告相关的帖子和​​错误报告,但没有针对这三个问题,也没有任何真正有帮助的内容。我尝试在 proguard.cfg 中添加如下行,但没有帮助。

-keep class android.view.** { *; }

有人能解释一下这个问题吗?

android.runtime.JavaProxyThrowable: at Xamarin.Forms.Platform.Android.ListViewRenderer.OnElementChanged (Xamarin.Forms.Platform.Android.ElementChangedEventArgs`1[TElement] e) [0x00083] in <2e0d929b7f78480c8db42fc55cca561c>:0
at Xamarin.Forms.Platform.Android.VisualElementRenderer`1[TElement].SetElement (TElement element) [0x000d3] in <2e0d929b7f78480c8db42fc55cca561c>:0
at Xamarin.Forms.Platform.Android.VisualElementRenderer`1[TElement].Xamarin.Forms.Platform.Android.IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement element) [0x00033] in <2e0d929b7f78480c8db42fc55cca561c>:0
at Xamarin.Forms.Platform.Android.Platform.CreateRenderer (Xamarin.Forms.VisualElement element, Android.Content.Context context) [0x0003e] in <2e0d929b7f78480c8db42fc55cca561c>:0
at Xamarin.Forms.Platform.Android.VisualElementPackager.AddChild (Xamarin.Forms.VisualElement view, Xamarin.Forms.Platform.Android.IVisualElementRenderer oldRenderer, Xamarin.Forms.Platform.Android.RendererPool pool, System.Boolean sameChildren) [0x000c4] in <2e0d929b7f78480c8db42fc55cca561c>:0
at Xamarin.Forms.Platform.Android.VisualElementPackager.SetElement (Xamarin.Forms.VisualElement oldElement, Xamarin.Forms.VisualElement newElement) [0x0016c] in <2e0d929b7f78480c8db42fc55cca561c>:0
at Xamarin.Forms.Platform.Android.VisualElementPackager.Load () [0x00000] in <2e0d929b7f78480c8db42fc55cca561c>:0
at Xamarin.Forms.Platform.Android.VisualElementRenderer`1[TElement].SetPackager (Xamarin.Forms.Platform.Android.VisualElementPackager packager) [0x00007] in <2e0d929b7f78480c8db42fc55cca561c>:0
at Xamarin.Forms.Platform.Android.VisualElementRenderer`1[TElement].SetElement (TElement element) [0x000f0] in <2e0d929b7f78480c8db42fc55cca561c>:0
at Xamarin.Forms.Platform.Android.VisualElementRenderer`1[TElement].Xamarin.Forms.Platform.Android.IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement element) [0x00033] in <2e0d929b7f78480c8db42fc55cca561c>:0
at Xamarin.Forms.Platform.Android.Platform.CreateRenderer (Xamarin.Forms.VisualElement element, Android.Content.Context context) [0x0003e] in <2e0d929b7f78480c8db42fc55cca561c>:0
at Xamarin.Forms.Platform.Android.ScrollViewContainer.set_ChildView (Xamarin.Forms.View value) [0x00041] in <2e0d929b7f78480c8db42fc55cca561c>:0
at Xamarin.Forms.Platform.Android.ScrollViewRenderer.LoadContent () [0x00011] in <2e0d929b7f78480c8db42fc55cca561c>:0
at Xamarin.Forms.Platform.Android.ScrollViewRenderer.SetElement (Xamarin.Forms.VisualElement element) [0x000cf] in <2e0d929b7f78480c8db42fc55cca561c>:0
at Xamarin.Forms.Platform.Android.Platform.CreateRenderer (Xamarin.Forms.VisualElement element, Android.Content.Context context) [0x0003e] in <2e0d929b7f78480c8db42fc55cca561c>:0
at Xamarin.Forms.Platform.Android.VisualElementPackager.AddChild (Xamarin.Forms.VisualElement view, Xamarin.Forms.Platform.Android.IVisualElementRenderer oldRenderer, Xamarin.Forms.Platform.Android.RendererPool pool, System.Boolean sameChildren) [0x000c4] in <2e0d929b7f78480c8db42fc55cca561c>:0
at Xamarin.Forms.Platform.Android.VisualElementPackager.SetElement (Xamarin.Forms.VisualElement oldElement, Xamarin.Forms.VisualElement newElement) [0x0016c] in <2e0d929b7f78480c8db42fc55cca561c>:0
at Xamarin.Forms.Platform.Android.VisualElementPackager.Load () [0x00000] in <2e0d929b7f78480c8db42fc55cca561c>:0
at Xamarin.Forms.Platform.Android.VisualElementRenderer`1[TElement].SetPackager (Xamarin.Forms.Platform.Android.VisualElementPackager packager) [0x00007] in <2e0d929b7f78480c8db42fc55cca561c>:0
at Xamarin.Forms.Platform.Android.VisualElementRenderer`1[TElement].SetElement (TElement element) [0x000f0] in <2e0d929b7f78480c8db42fc55cca561c>:0
at Xamarin.Forms.Platform.Android.VisualElementRenderer`1[TElement].Xamarin.Forms.Platform.Android.IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement element) [0x00033] in <2e0d929b7f78480c8db42fc55cca561c>:0
at Xamarin.Forms.Platform.Android.Platform.CreateRenderer (Xamarin.Forms.VisualElement element, AndroidX.Fragment.App.FragmentManager fragmentManager, Android.Content.Context context) [0x00031] in <2e0d929b7f78480c8db42fc55cca561c>:0
at Xamarin.Forms.Platform.Android.AppCompat.FragmentContainer.OnCreateView (Android.Views.LayoutInflater inflater, Android.Views.ViewGroup container, Android.OS.Bundle savedInstanceState) [0x0001b] in <2e0d929b7f78480c8db42fc55cca561c>:0
at AndroidX.Fragment.App.Fragment.n_OnCreateView_Landroid_view_LayoutInflater_Landroid_view_ViewGroup_Landroid_os_Bundle_ (System.IntPtr jnienv, System.IntPtr native__this, System.IntPtr native_inflater, System.IntPtr native_container, System.IntPtr native_savedInstanceState) [0x00020] in <4e81a5c29660454fa4f16aaaa8f6f3d0>:0
at (wrapper dynamic-method) Android.Runtime.DynamicMethodNameCounter.51(intptr,intptr,intptr,intptr,intptr)
  at crc64720bb2db43a66fe9.FragmentContainer.n_onCreateView (Native Method)
  at crc64720bb2db43a66fe9.FragmentContainer.onCreateView (Unknown Source)
  at androidx.fragment.app.Fragment.performCreateView (Unknown Source:15)
  at androidx.fragment.app.FragmentStateManager.createView (Unknown Source:179)
  at androidx.fragment.app.FragmentManager.moveToState (Unknown Source:237)
  at androidx.fragment.app.FragmentManager.moveToState (Unknown Source:2)
  at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState (Unknown Source:58)
  at androidx.fragment.app.FragmentManager.moveToState (Unknown Source:47)
  at androidx.fragment.app.BackStackRecord.executeOps (Unknown Source:186)
  at androidx.fragment.app.FragmentManager.executeOps (Unknown Source:38)
  at androidx.fragment.app.FragmentManager.executeOpsTogether (Unknown Source:119)
  at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute (Unknown Source:84)
  at androidx.fragment.app.FragmentManager.execPendingActions (Unknown Source:21)
  at androidx.fragment.app.FragmentManager$4.run (Unknown Source:3)
  at android.os.Handler.handleCallback (Handler.java:938)
  at android.os.Handler.dispatchMessage (Handler.java:99)
  at android.os.Looper.loop (Looper.java:236)
  at android.app.ActivityThread.main (ActivityThread.java:8057)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:656)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:967)

【问题讨论】:

  • 能否尝试新建一个空白项目,发布构建看看这里有没有这个问题。
  • 是的,这在我的待办事项清单上,但我想先发布问题,以防其他人遇到问题。如果它是一个特定的插件或触发问题的东西,我可能需要一段时间。我现在创建了一个新项目,它构建得很好,所以现在我一个一个地添加 NuGet 包,看看它是否会损坏。这是一个小问题,因为我必须做一些事情才能使用每一个,否则,如果是链接器问题,它可能不会因为安装了插件而被触发。
  • 在对一个新的空白项目进行了几个小时的反复试验后,我将其范围缩小到 Xamarin.AndroidX.RecyclerView。我没有收到版本 1.2.0 的错误,但我收到版本 1.2.1 和 1.2.1.1 的错误。更改此 NuGet 包的版本似乎是唯一有所作为的事情,因此它一定是一个新错误。我将在 VS 反馈上打开一个错误。
  • 您的意思是在使用 Xamarin.AndroidX.RecyclerView 1.2.1 时出现此错误消息,但使用 Xamarin.AndroidX.RecyclerView 1.2.0,项目没有问题,运行正常吗?
  • 没错,是的。使用全新的 Xamarin.Forms 模板解决方案,并将发布版本部署到模拟器,我收到了 Xamarin.AndroidX.RecyclerView 1.2.1 版的这些警告。在 1.2.1.1 版本中,我收到这些警告,并且应用程序在启动时立即崩溃。使用 1.2.0,应用程序在模拟器上构建和运行正常。

标签: android xamarin crash android-r8


【解决方案1】:

我遇到了同样的问题,即使在 Xamarin.AndroidX.RecyclerView 1.2.0 中它也保持不变。 Nuget 包版本关系太复杂。 通过“代码收缩器”将“R8”设置为空白即可。 (这个事实应该已经清楚所有进行此讨论的人。) 我认为除了省略 R8 之外没有完美的解决方案。

【讨论】:

  • 虽然没有使用代码压缩器,但这并不是真正解决问题的方法。代码收缩器对于最小化应用程序的大小是必要的,这本身对于移动应用程序的部署至关重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-01
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
  • 2013-05-16
相关资源
最近更新 更多