MAUI技术问题:如何在Release模式下查看调试语句
MAUI Release模式下调试日志配置与异常修复
已完成的配置
- 在
.csproj文件中为Release模式添加调试相关属性:
<PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Release|net8.0-android|AnyCPU'"> <ApplicationId>com.companyname.appname</ApplicationId> <AndroidPackageFormat>apk</AndroidPackageFormat> <ApplicationTitle>appname</ApplicationTitle> <DebugType>portable</DebugType> <DebugSymbols>true</DebugSymbols> <Debuggable>true</Debuggable> <AndroidEnableDeveloperInstrumentation>true</AndroidEnableDeveloperInstrumentation> </PropertyGroup>
- 在
AndroidManifest.xml的application节点手动添加android:debuggable="true" - 在
MAUIProgram.cs中配置控制台日志:
builder.Logging.AddConsole(options => { options.IncludeScopes = true; }); builder.Logging.SetMinimumLevel(LogLevel.Debug);
- 在
App.xaml.cs中注入ILogger并添加日志输出代码 - 在项目属性中启用Release模式的开发者工具
但运行Release模式后出现异常界面,以下是需要补充的配置和修复步骤:
额外配置与修复方案
移除AndroidManifest中的手动debuggable配置
.csproj里的<Debuggable>true</Debuggable>会自动给AndroidManifest.xml生成android:debuggable="true",手动添加会导致配置冲突引发异常,直接删掉这行手动配置即可。添加Android Logcat日志输出
MAUI的AddConsole()在Android Release模式下不会输出到系统Logcat,必须补充AddDebug()才能将日志打到系统日志中。修改MAUIProgram.cs的日志配置:
builder.Logging.AddConsole(options => { options.IncludeScopes = true; }); builder.Logging.AddDebug(); // 新增此行,输出到Logcat builder.Logging.SetMinimumLevel(LogLevel.Debug);
- 临时禁用代码收缩与链接器
Release模式下的R8代码收缩和链接器可能会移除日志代码或依赖注入相关逻辑,导致异常。先在.csproj的Release属性组中添加以下配置临时禁用:
<AndroidR8Enabled>false</AndroidR8Enabled> <AndroidLinkMode>None</AndroidLinkMode>
等日志正常后,再逐步调整为SdkOnly链接模式,并添加规则保留必要代码。
- 修正ILogger注入方式
避免使用非泛型ILogger,改用泛型ILogger<App>——这是MAUI依赖注入的标准用法,非泛型可能导致注入失败。修改App.xaml.cs:
using Microsoft.Extensions.Logging; public partial class App : Application { private readonly ILogger<App> _logger; public App(ILogger<App> logger) { _logger = logger; InitializeComponent(); _logger.LogInformation("App started in production mode."); _logger.LogError("An error occurred."); } }
- 添加全局异常捕获
给应用加上全局异常捕获,将异常信息输出到日志,方便定位问题:
public partial class App : Application { private readonly ILogger<App> _logger; public App(ILogger<App> logger) { _logger = logger; InitializeComponent(); _logger.LogInformation("App started in production mode."); _logger.LogError("An error occurred."); // 捕获未处理异常 AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; Application.Current.DispatcherUnhandledException += DispatcherUnhandledException; } private void DispatcherUnhandledException(object sender, Microsoft.UI.Xaml.UnhandledExceptionEventArgs e) { _logger.LogError(e.Exception, "UI线程未处理异常"); e.Handled = true; } private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { _logger.LogError(e.ExceptionObject as Exception, "全局未处理异常"); } }
- 查看日志的正确方式
使用Android Studio的Logcat工具,或者通过命令行执行adb logcat -s "com.companyname.appname"(替换为你的应用包名),过滤查看应用的日志内容。
内容的提问来源于stack exchange,提问作者Matthew Pans
相关产品推荐
相关产品推荐

