MAUI应用Android端Release模式API调用失败,Debug模式正常
针对你遇到的Android Release模式下TRIMServiceModel.dll的GET/POST操作失效、但iOS全模式正常的问题,结合你的配置和尝试的方案,给出以下具体解决方向:
1. 修复发布裁剪(PublishTrimmed)导致的代码丢失
你的Android Release配置开启了<PublishTrimmed>True</PublishTrimmed>,裁剪工具可能误删了DLL中被反射或间接调用的API(iOS的裁剪逻辑和Android存在差异,所以未触发问题)。
解决方案:在项目的csproj文件中添加以下配置,将第三方DLL排除在裁剪范围外:
<ItemGroup> <!-- 确保TRIMServiceModel.dll的代码不被裁剪 --> <TrimmerRootAssembly Include="TRIMServiceModel" /> </ItemGroup>
2. 确保程序集被正确嵌入APK
Debug模式下你设置了<EmbedAssembliesIntoApk>True</EmbedAssembliesIntoApk>,但Android Release的配置中缺少这一项,导致DLL可能未被打包进APK,运行时无法找到。
解决方案:在Android Release的PropertyGroup中添加嵌入配置:
<PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Release|net7.0-android|AnyCPU'"> <UseInterpreter>true</UseInterpreter> <PublishTrimmed>True</PublishTrimmed> <!-- 添加这一行,确保DLL嵌入APK --> <EmbedAssembliesIntoApk>True</EmbedAssembliesIntoApk> </PropertyGroup>
3. 修正AssemblyResolve事件的路径逻辑
你当前的AssemblyResolve事件中,用Assembly.GetExecutingAssembly().Location获取的路径在Android Release环境下可能不准确(Android的程序集存储路径和Debug模式不同)。
优化后的代码:
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) { try { // 解析程序集名称,避免硬编码文件名 var assemblyName = new AssemblyName(args.Name); // 使用AppContext.BaseDirectory获取可靠的应用程序目录 string filePath = Path.Combine(AppContext.BaseDirectory, $"{assemblyName.Name}.dll"); if (File.Exists(filePath)) { return Assembly.LoadFrom(filePath); } } catch (Exception ex) { // 输出完整异常信息到Logcat,方便排查 Android.Util.Log.Error("AssemblyResolve", ex.ToString()); } return null; }
4. 调整Android链接器模式
Android Release默认的链接器模式可能是Full,会移除所有未被直接引用的代码(包括第三方DLL中的部分逻辑)。可以改为和iOS一致的SdkOnly模式,只裁剪SDK中未使用的部分。
解决方案:在Android Release的PropertyGroup中添加链接器配置:
<PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Release|net7.0-android|AnyCPU'"> <UseInterpreter>true</UseInterpreter> <PublishTrimmed>True</PublishTrimmed> <EmbedAssembliesIntoApk>True</EmbedAssembliesIntoApk> <!-- 添加链接器模式配置 --> <AndroidLinkMode>SdkOnly</AndroidLinkMode> </PropertyGroup>
5. 捕获详细异常排查根本原因
当前的日志只记录了程序集加载的异常,但API调用失败可能是其他原因(比如JSON序列化失败、网络请求被拦截等)。建议在调用DLL的GET/POST方法时添加完整的异常捕获:
try { // 调用TRIMServiceModel中的API var result = await YourApiClient.PostDataAsync(data); } catch (Exception ex) { // 输出完整异常链到Logcat Android.Util.Log.Error("ApiError", $"Message: {ex.Message}\nStack Trace: {ex.StackTrace}\nInner Exception: {ex.InnerException?.ToString()}"); }
然后通过Android Studio的Logcat查看具体错误信息,定位是程序集加载问题还是业务逻辑异常。
内容的提问来源于stack exchange,提问作者Dharun

