MAUI Android 在 DEBUG 中工作,但在 RELEASE 中崩溃

问题描述 投票:0回答:1

这个问题并不是真正关于如何解决问题(因为我已经解决了),但我有点困惑发生了什么以及我错过了什么?

我的应用程序在调试模式下工作正常,但在发布模式下,应用程序在发现 NFC 标签并读取缓存的 ndef 消息时崩溃。

下面是在 DEBUG 中工作的代码,但应用程序在 RELEASE 中崩溃了:

public void OnTagDiscoveder(Tag tag)
{
    NdefMessage ndefMessage = null;
    
    try
    {
        var ndef = Ndef.Get(tag);
        ndefMessage = ndef.CachedNdefMessage; // Probably some low-level null reference problem.
    }
    catch (Exception ex)
    {
        // omitted for brevity
    }
}

下面是在 DEBUG 和 RELEASE 中都可以正常工作的固定代码:

public void OnTagDiscovered(Tag tag)
{
    NdefMessage ndefMessage = null;

    try
    {
        if (Ndef.Get(tag) is Ndef ndef)
        {
            ndefMessage = ndef.CachedNdefMessage; // Probably some low-level null reference problem is solved.

            // omitted for brevity
        }
    }
    catch (Exception ex)
    {
        // omitted for brevity
    }
}

我有一些 C++ 语言基础知识,我知道调试和发布模式之间存在差异(最终的汇编代码在步骤数、处理内存等方面有所不同 - 也可能在调试中可能有一些指针助手等) .) 但是我是否正确理解了这个具体问题,即存在一些低级(可能基于 C 语言)错误,这些错误不会引发任何高级异常,因此即使在 C# try-catch 博客中,应用程序也会失败?因为我解决这个问题的方法实际上是我必须分析 logcat(对于 DEBUG 和 RELEASE 模式)并从中找出问题所在 - 因为在 DEBUG 或 RELEASE 模式下都没有抛出异常。

这是一个调试日志: DEBUG logcat

这是一个 RELEASE logcat: RELEASE logcat

也许有人可以更好地向我解释发生了什么事吗?或者至少将我重定向到一些来源?有什么方法可以让我预测将来出现此类问题吗?我应该注意做什么/不做什么?因为解决这类问题对我来说确实是一件新鲜事,而且花了几个小时(基本上这只是一个空引用问题,通常在几分钟内就能解决)。

c# android debugging maui release
1个回答
0
投票

应用程序在调试模式下工作正常,但在发布模式下经常出现各种问题,这是一个很常见的问题。这通常是由我们的应用程序在发布模式下启用的

trimming
选项或
AOT
选项引起的。

通过对比debug模式和release模式的日志,我们发现有一些关于

AOT
的日志。

从文档原生AOT部署,我们可以发现

将您的应用程序发布为

Native AOT
会生成一个应用程序 独立的,并且已经被
ahead-of-time (AOT)
编译为 本机代码。原生 AOT 应用程序启动时间更快且更小 内存足迹。这些应用程序可以在没有 安装了 .NET 运行时。

并且从文档

Native AOT
部署的限制,我们还应该通知一些
limitations
对于
Native AOT

我们可以通知第四个限制(

Requires trimming, which has limitations
),如果我们点击文档链接.NET MAUI Android应用程序,我们可以发现:

linker
使您能够
trim
您的.NET MAUI Android应用程序。什么时候
trimming
已启用,链接器不会影响您的程序集,并且 通过删除类型和成员来减小 SDK 程序集的大小 您的应用程序不使用。

Linker behavior
可以为您的每个构建配置进行配置 应用程序。默认情况下,
trimming
对于调试版本禁用,而对于调试版本启用 发布版本。

因此,默认情况下,应用程序可能会在发布模式下删除必要的代码,这可能会导致应用程序出现问题。

© www.soinside.com 2019 - 2024. All rights reserved.