本机 Xamarin.Android 应用程序在发布模式下不断崩溃

Posted

技术标签:

【中文标题】本机 Xamarin.Android 应用程序在发布模式下不断崩溃【英文标题】:Native Xamarin.Android app keeps crashing in release mode 【发布时间】:2021-12-08 12:21:02 【问题描述】:

我有一个几年前构建的本机 Xamarin.android 应用程序,从那时起我一直在维护它。最近,我尝试构建一个新版本,但应用程序不断崩溃。过去我使用相同的项目和编译设置发布了数十个版本。这是我在发布中获得的堆栈跟踪的示例:

[mono-rt] [错误] 致命的未处理异常:System.IO.FileNotFoundException:无法加载文件或程序集“System.Core,版本=2.0.5.0,Culture=neutral,PublicKeyToken=7cec85d7bea7798e”或其依赖项之一。 [mono-rt] 在 System.Threading.Tasks.TaskFactory`1[TResult].FromAsyncCoreLogic (System.IAsyncResult iar, System.Func`2[T,TResult] endFunction, System.Action`1[T] endAction10-21 13 :24:49.970 F/mono-rt (15785): 文件名: 'System.Core, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e' [mono-rt] 在 Java.Interop.JniEnvironmentInfo..ctor () [0x00006] 中:0 [mono-rt] 在 Java.Interop.JniEnvironment+c.b__35_0 () [0x00000] in :0 [mono-rt] 在 System.Threading.ThreadLocal`1[T].GetValueSlow () [0x00031] in :0 [mono-rt] 在 System.Threading.ThreadLocal`1[T].get_Value () [0x0003e] in :0 [mono-rt] 在 System.Threading._ThreadPoolWaitCallback.PerformWaitCallback () [0x00000] in :0ds.CallStaticObjectMethod (Java.Interop.JniObjectReference 类型,Java.Interop.JniMethodInfo 方法,Java.Interop.JniArgumentValue* args) [0x0002d] :0 [mono-rt] 在 Java.Interop.JniPeerMembers+JniStaticMethods.InvokeObjectMethod(System.String encodedMember,Java.Interop.JniArgumentValue* 参数)[0x00018] 在:0 [mono-rt] 在 Java.Interop.JniEnvironment+StaticMet10-21 13:24:49.970 F/mono-rt (15785): 在 Android.OS.Looper.get_MainLooper () [0x0000a] in :0 [mono-rt] 在 Android.Runtime.AndroidEnvironment.GetDefaultSyncContext () [0x00000] in :0 [mono-rt] 在 System.AndroidPlatform.GetDefaultSyncContext () [0x00000] in :0 [mono-rt] 在 System.Threading.SynchronizationContext.GetThreadLocalContext () [0x00005] 在:0 [mono-rt] 在 System.Threading.Tasks.SynchronizationContextAwaitTaskContinuation.Run (System.Threading.Tasks.Task 被忽略,System.Boolean canInlineContinuationTask) [0x00003] 在:0 [mono-rt] 在 System.Threading.Tasks.Task.FinishStageThree () [0x0003c] in :0 [mono-rt] 在 System.Threading.Tasks.Task`1[TResult].TrySetResult (TResult 结果) [0x0004f] in :0 [mono-rt] 在 System.Threading.Tasks.TaskFactory`1+c__DisplayClass38_0`1[TResult,TArg1].b__0 (System.IAsyncResult iar) [0x00008] in :0 [mono-rt] at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback () [0x00000] in 10-21 13:24:49.970 F/mono-rt (15785): at (wrapper managed-to-native) System.Runtime.Remoting .Messaging.AsyncResult.Invoke(System.Runtime.Remoting.Messaging.AsyncResult) [mono-rt] 在 System.Runtime.Remoting.Messaging.AsyncResult.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem () [0x00000] 在:0 [mono-rt] 在 System.Threading.ThreadPoolWorkQueue.Dispatch () [0x00074] 在:0

从堆栈跟踪中,我感觉可能是链接器有问题,但我已经尝试了所有 3 种设置(不链接、仅链接 SDK 程序集、链接所有)。在这里和那里更改一些代码时,有时我的堆栈跟踪略有不同,但没有什么真正有用的。这是我正在使用的编译设置:

应用程序会不时成功启动,而不会在任何特殊情况下进行更改。它只会工作一次。

我错过了什么?

【问题讨论】:

您可以尝试删除 System.Core 并添加 System.Core 2.0.5.0。清理并重建项目以重试。 【参考方案1】:

我很确定你在发布时有一些奇怪的行为。由于您在 android 上使用 mono,您可能会在某处调用 await 函数,该函数返回 Task<T>,您不能使用 await,而是使用 .GetAwaiter().Result。

https://github.com/xamarin/xamarin-android/issues/6409

【讨论】:

【参考方案2】:

确保您的 .NET 框架已修补。 Microsoft 发布了 .NET 补丁程序,以允许可移植类库正确找到适当的运行时 (KB2468871)。如果您看到上述异常(或类似情况),则意味着您缺少最新的 .NET 框架补丁。

You can read more about Portable Class Libraries on MSDN.

【讨论】:

以上是关于本机 Xamarin.Android 应用程序在发布模式下不断崩溃的主要内容,如果未能解决你的问题,请参考以下文章

本机 Xamarin.Android 应用程序在发布模式下不断崩溃

Xamarin.Android Java绑定库运行时失败访问本机库

使用 Xamarin android 和 azure facebook 身份验证获取用户个人资料/详细信息时出错

在 xamarin android 中找不到 MEDIA_INFO_BUFFERING_START?

将Xamarin.Android应用程序迁移到Xamarin.Forms应用程序

有哪些ios或android应用是用xamarin开发的