You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

程序集引用缺失时能否执行AOT编译?Android编译配置问询

Android AOT编译未引用AdditionalAssembly时的报错解决方案

问题背景

旧程序集InitialAssembly引用了承载新功能的独立程序集AdditionalAssembly,内置运行时检查逻辑判断后者是否存在,以此决定启用新功能或保留原有逻辑。但在Android平台开启AotAssemblies=true且未引用AdditionalAssembly时,触发AOT预编译错误:Precompiling failed for InitialAssembly.Mono Ahead of Time compiler - compiling assembly InitialAssembly。

以下是可行的解决配置方案:

1. 用链接器配置移除未使用的依赖代码

创建链接器配置文件(如linker.xml),告知Android链接器移除InitialAssembly中依赖AdditionalAssembly的类型或方法——这些代码在未引用AdditionalAssembly的场景下不会被运行时执行,可安全移除:

<linker>
  <assembly fullname="InitialAssembly">
    <!-- 移除与新功能绑定的类 -->
    <type fullname="InitialAssembly.NewFeatureHandler" remove="true" />
    <!-- 移除调用新功能的方法 -->
    <method fullname="InitialAssembly.CoreService.ActivateNewFeature" remove="true" />
  </assembly>
</linker>

在Android项目的.csproj文件中引入该配置:

<ItemGroup>
  <AndroidLinkerInclude Include="linker.xml" />
</ItemGroup>

2. 传递AOT编译忽略未解析引用的参数

在Android项目的.csproj中添加AndroidAotAdditionalArguments,让Mono AOT编译器忽略对AdditionalAssembly的未解析引用:

<PropertyGroup Condition="$(TargetFramework.Contains('android')) and $(AotAssemblies) == 'true'">
  <AndroidAotAdditionalArguments>--ignore-unresolved=AdditionalAssembly</AndroidAotAdditionalArguments>
</PropertyGroup>

注:该参数仅临时绕过编译错误,若InitialAssembly中存在强制依赖AdditionalAssembly的代码(而非运行时可选逻辑),仍可能导致运行时崩溃。

3. 条件编译隔离新功能依赖

若可修改InitialAssembly代码,添加条件编译标记隔离对AdditionalAssembly的引用:
在InitialAssembly代码中加入条件判断:

#if !NO_ADDITIONAL_ASSEMBLY
using AdditionalAssembly;
#endif

public class CoreService
{
    public void FeatureEntry()
    {
#if !NO_ADDITIONAL_ASSEMBLY
        if (AssemblyExists("AdditionalAssembly"))
        {
            // 新功能执行逻辑
        }
#endif
        // 原有核心逻辑
    }
}

在Android项目的.csproj中,根据是否引用AdditionalAssembly自动定义编译常量:

<PropertyGroup Condition="$(TargetFramework.Contains('android')) and !Exists('../AdditionalAssembly/AdditionalAssembly.csproj')">
  <DefineConstants>$(DefineConstants);NO_ADDITIONAL_ASSEMBLY</DefineConstants>
</PropertyGroup>

此方法从根源避免了AOT编译时的依赖问题,是稳定性最高的解决方案。

内容的提问来源于stack exchange,提问作者gichev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 02:20:55