生成属性

MSBuild 属性控制目标的行为。

它们是在项目文件中指定的,例如 MSBuild PropertyGroup 中的 MyApp.csproj

注意

在 .NET for Android 中,应用程序与绑定项目在技术上没有区别,因此属性将在两者中都起作用。 在实践中,强烈建议创建单独的应用程序和绑定项目。 MSBuild 绑定项目属性参考指南中 记录了主要用于绑定项目的属性

AdbTarget

$(AdbTarget) 属性指定 Android 包可能要安装到或从中删除的 Android 目标设备。 此属性的值与 adb 目标设备选项相同。

AfterGenerateAndroidManifest

此属性中列出的 MSBuild 目标将在内部 _GenerateJavaStubs 目标(及在 AndroidManifest.xml 中生成 $(IntermediateOutputPath) 的位置)后直接运行。 如果想要对生成的 AndroidManifest.xml 文件进行任何修改,则可以使用此扩展点完成。

AndroidAapt2CompileExtraArgs

指定处理 Android 资产和资源时传递给 aapt2 compile 命令的命令行选项。

AndroidAapt2LinkExtraArgs

指定处理 Android 资产和资源时传递给 aapt2 link 命令的命令行选项。

AndroidAddKeepAlives

一个布尔属性,该属性控制链接器是否在绑定项目中插入 GC.KeepAlive() 调用,以防止过早地收集对象。

发布配置版本的默认值为 True

AndroidAotAdditionalArguments

一个字符串属性,在对将 $(AndroidEnableProfiledAot)$(AotAssemblies) 设置为 true 的项目执行 Aot 任务期间,允许将选项传递到 Mono 编译器。 调用 Mono 交叉编译器时,此属性的字符串值会添加到响应文件。

通常情况下,此属性应保留为空,但在某些特殊场景中,它可以提供有用的灵活性。

$(AndroidAotAdditionalArguments) 属性与相关 $(AndroidExtraAotOptions) 属性不同;$(AndroidAotAdditionalArguments) 将完整的独立空格分隔选项(如 --verbose--debug)传递给 AOT 编译器,而 $(AndroidExtraAotOptions) 包含以逗号分隔的参数,这些参数是 AOT 编译器的 --aot 选项的一部分。

AndroidAotCustomProfilePath

aprofutil 应创建的用于保存探查器数据的文件。

AndroidAotProfiles

允许开发人员通过命令行添加 AOT 配置文件的字符串属性。 它是以分号或逗号分隔的绝对路径列表。

AndroidAotProfilerPort

获取分析数据时 aprofutil 应连接到的端口。

AndroidAotEnableLazyLoad

启用 AOT 程序集的推迟(延迟)加载,而不是在启动时预加载它们。 对于启用了任何形式的 AOT 的发布版本,默认值为 True

在 .NET 6 中引入。

AndroidApkDigestAlgorithm

一个字符串值,指定将用于 jarsigner -digestalg 的摘要算法。

默认值为 SHA-256

AndroidApkSignerAdditionalArguments

一个字符串属性,允许开发人员向 apksigner 工具提供自变量。

AndroidApkSigningAlgorithm

一个字符串值,指定将用于 jarsigner -sigalg 的签名算法。

默认值为 SHA256withRSA

AndroidApplication

此布尔值指示项目是用于 Android 应用程序 (True) 还是用于 Android 库项目(False 或不存在)。

在 Android 包中,可能只存在一个具有 <AndroidApplication>True</AndroidApplication> 的项目。 (遗憾的是,这一要求尚未得到验证,这可能会导致与 Android 资源有关的微妙和奇怪的错误。)

AndroidApplicationJavaClass

完整 Java 类名称,用于在类继承自 Android.App.Application 时替代 android.app.Application

$(AndroidApplicationJavaClass) 属性通常由其他属性(如 $(AndroidEnableMultiDex) MSBuild 属性)设置。

AndroidAvoidEmitForPerformance

一个布尔属性,用于确定是否 System.Reflection.Emit “避免”以提高启动性能。 该属性默认为 True

System.Reflection.Emit使用对 Android 上的启动性能有明显影响。 对于以下功能开关,默认禁用此行为:

  • Switch.System.Reflection.ForceInterpretedInvoke:第二次调用 MethodInfo.Invoke()ConstructorInfo.Invoke()发出代码以提高重复调用的性能。

  • Microsoft.Extensions.DependencyInjection.DisableDynamicEngine:在从依赖项注入容器检索服务的第二次调用后,将发出代码以提高重复调用的性能。

在大多数 Android 应用程序中,最好禁用此行为。

有关可用功能开关的详细信息,请参阅基类库功能开关文档

在 .NET 8 中添加。

AndroidBinUtilsPath

包含 Android binutils(如本机链接器 ld 和本机汇编程序 as)的目录路径。 这些工具包含在适用于 Android 工作负载的 .NET 中。

默认值为 $(MonoAndroidBinDirectory)\binutils\bin\

AndroidBoundExceptionType

一个字符串值,该值指定当 .NET for Android 提供的类型的 .NET 在 Java 类型(例如Android.Runtime.InputStreamInvokerSystem.IO.Stream或或和System.Collections.IDictionaryAndroid.Runtime.JavaDictionary方面实现 .NET 类型或接口时应如何传播异常。

  • Java:原始 Java 异常类型按原样传播。

    Java 意味着,例如,InputStreamInvoker 无法正确实现 System.IO.Stream API,因为可能会从 Stream.Read() 引发 Java.IO.IOException,而不是从 System.IO.IOException 引发。

  • System:捕获原始 Java 异常类型,并将其包装到适当的 .NET 异常类型中。

    System 意味着,例如,InputStreamInvoker 正确实现 System.IO.StreamStream.Read() 不会引发 Java.IO.IOException 实例。 (它可能会引发包含 Java.IO.IOException 作为 Exception.InnerException 值的 System.IO.IOException。)

    默认值为 System

AndroidBoundInterfacesContainConstants

一个布尔属性,用于确定是否支持接口上的绑定常数,或者将使用创建 IMyInterfaceConsts 类的解决方法。

默认值为 True

AndroidBoundInterfacesContainStaticAndDefaultInterfaceMethods

一个布尔属性,支持接口上的默认成员和静态成员,还是创建一个包含静态成员的同级类(如 abstract class MyInterface)的旧解决方法。

在 .NET 6 中,默认值为 True,在旧版中为 False

AndroidBoundInterfacesContainTypes

一个布尔属性,支持接口中嵌套的类型,还是创建非嵌套类型(如 IMyInterfaceMyNestedClass)的解决方法。

在 .NET 6 中,默认值为 True,在旧版中为 False

AndroidBuildApplicationPackage

此布尔值指示是否创建包 (.apk) 并为其签名。 将此值设置为 True 等效于使用 SignAndroidPackage 生成目标。

该属性默认为 False

AndroidBundleConfigurationFile

指定一个文件名,以在生成 Android 应用程序捆绑包时用作 bundletool配置文件。 此文件从某些方面控制捆绑包如何生成 APK,例如从哪些维度拆分捆绑包来生成 APK。 适用于 Android 的 .NET 会自动配置其中一些设置,包括要保持未压缩的文件扩展名列表。

仅当 $(AndroidPackageFormat) 设置为 aab 时,此属性才是相关的。

AndroidBundleToolExtraArgs

指定在生成应用程序包时传递给 bundletool 命令的命令行选项。

AndroidClassParser

一个字符串属性,用于控制如何分析 .jar 文件。 可能的值包括:

  • class-parse:使用 class-parse.exe 直接解析 Java 字节码,无需 JVM 的帮助。

  • jar2xml:此值已过时,不再受支持。

AndroidCodegenTarget

一个字符串属性,用于控制代码生成目标 ABI。 可能的值包括:

  • XamarinAndroid:此值已过时,不再受支持。

  • XAJavaInterop1:使用 Java.Interop 进行 JNI 调用。 只能通过 Xamarin.Android 6.1 或更高版本构建和执行使用 XAJavaInterop1 的绑定程序集。 Xamarin.Android 6.1 和更高版本会将 Mono.Android.dll 与此值绑定。

默认值为 XAJavaInterop1

AndroidCreatePackagePerAbi

一个布尔属性,用于确定是否应该创建一文件($(AndroidSupportedAbis) 中指定的每个ABI 一个),而不是在单个 .apk 中支持所有 ABI。

另请参阅生成 ABI 特定的 APK 指南。

AndroidCreateProguardMappingFile

一个布尔属性,用于控制是否在生成过程中生成 proguard 映射文件。

将以下内容添加到 csproj 将导致生成文件,并使用 AndroidProguardMappingFile 属性来控制最终映射文件的位置。

<AndroidCreateProguardMappingFile>True</AndroidCreateProguardMappingFile>

生成 .aab 文件时,映射文件会自动包含在包中。 无需手动将其上传到 Google Play 商店。 使用 .apk 文件时,需要手动上传 AndroidProguardMappingFile

使用 $(AndroidLinkTool)=r8 时,默认值为 True

AndroidDebugKeyAlgorithm

指定要用于 debug.keystore 的默认算法。 默认值为 RSA

AndroidDebugKeyValidity

指定要用于 debug.keystore 的默认有效期。 默认值为 1095030 * 36530 years

AndroidDebugStoreType

指定用于 debug.keystore 的密钥存储文件格式。 默认为 pkcs12

AndroidDeviceUserId

允许在来宾帐户或工作帐户下部署和调试应用程序。 该值是从以下 adb 命令获得的 uid 值:

adb shell pm list users

上述命令将返回以下数据:

Users:
	UserInfo{0:Owner:c13} running
	UserInfo{10:Guest:404}

uid 是第一个整数值。 在上述输出中,它们为 010

AndroidDexTool

一个值为 . d8的枚举样式属性。 以前,Xamarin.Android 支持此值 dx

指示在 .NET for Android 生成过程中使用哪个 Android dex 编译器。 默认值为 d8。 请参阅有关 D8 和 R8 的文档。

AndroidEnableDesugar

此布尔属性确定是否启用了 desugar。 Android 当前不支持所有 Java 8 功能;默认工具链通过对 javac 编译器的输出执行称为 desugar 的字节码转换,实现新的语言功能。 如果使用 $(AndroidDexTool)=dx,则默认值为 False;如果使用 $(AndroidDexTool)=d8,则为 True

AndroidEnableGooglePlayStoreChecks

一个布尔属性,允许开发人员禁用以下 Google Play 商店检查:XA1004、XA1005 和 XA1006。 对于目标不是 Google Play 商店并且不想运行这些检查的开发人员来说,禁用这些检查非常有用。

AndroidEnableMarshalMethods

一个布尔属性,用于确定是否启用 LLVM 封送方法。 LLVM 封送方法是应用启动优化,它使用本机入口点进行 Java native 方法注册。

默认情况下,此属性为 False。

在 .NET 8 中添加。

AndroidEnableMultiDex

此布尔属性确定是否将在最终的 .apk 中使用 multi-dex 支持。

该属性默认为 False

AndroidEnableObsoleteOverrideInheritance

一个布尔属性,用于确定绑定方法是否自动从它们重写的方法继承 [Obsolete] 属性。

.NET 8 中添加了对此属性的支持。

该属性默认为 True

AndroidEnablePreloadAssemblies

一个布尔属性,用于控制在进程启动时是否加载应用程序包内绑定的所有托管程序集。

如果设置为 True,在进程启动时,将在调用任何应用程序代码前加载应用程序包内绑定的所有程序集。

如果设置为 False,将仅根据需要加载程序集。 根据需要加载程序集可让应用程序更快地启动,并且也更符合桌面 .NET 语义。 若要查看节省的时间,请将 debug.mono.log 系统属性设置为包含 timing,然后在 Finished loading assemblies: preloaded 中查找 adb logcat 消息。

使用依赖项注入的应用程序或库可能要求此属性为 True(如果它们又要求 AppDomain.CurrentDomain.GetAssemblies() 返回应用程序捆绑包中的所有程序集),即使不需要程序集也是如此。

默认情况下,此值为 False。

AndroidEnableProfiledAot

此布尔属性确定是否在预先编译时使用 AOT 配置文件。

配置文件在 @(AndroidAotProfile) 项组。 此 ItemGroup 包含默认配置文件。 通过删除现有的配置文件并添加你自己的 AOT 配置文件可以进行替代。

该属性默认为 False

AndroidEnableRestrictToAttributes

一个值为和 disable. 的obsolete枚举样式属性。

设置为 obsolete时,使用 Java 注释androidx.annotation.RestrictTo标记的类型和成员或处于非导出的 Java 包中,将使用 C# 绑定中的属性进行标记[Obsolete]

此属性 [Obsolete] 具有描述性消息,说明 Java 包所有者认为 API 为“内部”,并警告其使用。

此属性还具有自定义警告代码 XAOBS001 ,因此可以独立于“普通”过时 API 将其取消。

设置为 disable/&a0> 时,API 将像正常一样生成,没有其他属性。 (这与 .NET 8 之前的行为相同。

添加 [Obsolete] 属性而不是自动删除 API 是为了保持与现有包的 API 兼容性。 如果希望 删除 具有 @RestrictTo 批注 处于非导出 Java 包中的成员,除了此属性之外,还可以使用 转换文件 来防止这些类型绑定:

<remove-node path="//*[@annotated-visibility]" />

.NET 8 中添加了对此属性的支持。

此属性默认设置为 obsolete <

AndroidEnableSGenConcurrent

此布尔属性确定是否使用 Mono 的并发垃圾收集器

该属性默认为 False

AndroidErrorOnCustomJavaObject

此布尔属性确定类型能否实现 Android.Runtime.IJavaObject,而无需同时继承自 Java.Lang.ObjectJava.Lang.Throwable

class BadType : IJavaObject {
    public IntPtr Handle {
        get {return IntPtr.Zero;}
    }

    public void Dispose()
    {
    }
}

若为 True,这些类型生成 XA4212 错误;否则,生成 XA4212 警告。

该属性默认为 True

AndroidExplicitCrunch

不再支持此属性。

AndroidExtraAotOptions

一个字符串属性,在对将 $(AndroidEnableProfiledAot)$(AotAssemblies) 设置为 true 的项目执行 Aot 任务期间,允许将选项传递到 Mono 编译器。 调用 Mono 交叉编译器时,此属性的字符串值会添加到响应文件。

通常情况下,此属性应保留为空,但在某些特殊场景中,它可以提供有用的灵活性。

$(AndroidExtraAotOptions) 属性不同于相关 $(AndroidAotAdditionalArguments) 属性;$(AndroidAotAdditionalArguments) 将逗号分隔的自变量置于 Mono 编译器的 --aot 选项中。 相反,$(AndroidExtraAotOptions) 将完整独立的逗号分隔的选项(如 --verbose--debug)传递到此编译器。

AndroidFastDeploymentType

:(冒号)分隔的值列表,$(EmbedAssembliesIntoApk) MSBuild 属性为 False 时可用于控制部署到目标设备上的快速部署目录的类型。 如果资源是快速部署的,则不会嵌入到生成的 .apk 中,这样做可以加快部署时间。 (部署的速度越快,.apk 需要重建的频率越低,安装过程可能会更快。)有效值包括:

  • Assemblies:部署应用程序程序集。
  • Dexes:部署 .dex 文件、本机库和类型映射。 Dexes可以在运行 Android 4.4 或更高版本 (API-19) 的设备上使用。

默认值为 Assemblies

在提交 f0d565fe 中删除了对通过该系统快速部署资源和资产的支持。 这是因为它需要使用已弃用的 API 才能工作。

**在 .NET 9 中删除了对此功能的支持

“实验”。

AndroidFragmentType

指定生成布局绑定代码时,要用于所有 <fragment> 布局元素的默认完全限定的类型。 默认值为标准 Android Android.App.Fragment 类型。

AndroidGenerateJniMarshalMethods

一个布尔属性,用于在生成过程中生成 JNI 封送方法。 大大减少了在绑定帮助程序代码中对 System.Reflection 的使用。

默认值为 False。 如果开发人员想要使用新的 JNI 封送方法功能,则可以设置

<AndroidGenerateJniMarshalMethods>True</AndroidGenerateJniMarshalMethods>

.csproj 中进行设置。 或者通过如下设置,在命令行上提供该属性:

-p:AndroidGenerateJniMarshalMethods=True

“实验”。 默认值为 False

AndroidGenerateJniMarshalMethodsAdditionalArguments

一个字符串属性,可用于将参数添加到 jnimarshalmethod-gen.exe 调用中,并且可用于调试,因此可以使用 -v-d--keeptemp 等选项。

默认值为空字符串。 可以在 .csproj 文件中或命令行上设置。 例如:

<AndroidGenerateJniMarshalMethodsAdditionalArguments>-v -d --keeptemp</AndroidGenerateJniMarshalMethodsAdditionalArguments>

或:

-p:AndroidGenerateJniMarshalMethodsAdditionalArguments="-v -d --keeptemp"

AndroidGenerateLayoutBindings

如果设置为 true,则允许生成布局代码隐藏,如果设置为 false,则完全禁止。

默认值为 false

AndroidGenerateResourceDesigner

默认值为 true。 设置为 false 时,禁用 Resource.designer.cs 的生成。

AndroidHttpClientHandlerType

控制 System.Net.Http.HttpClient 默认构造函数使用的默认 System.Net.Http.HttpMessageHandler 实现。 值是 HttpMessageHandler 子类的程序集限定类型名称,适用于 System.Type.GetType(string)

在 .NET 6 及更新版中,此属性仅在与 .NET 6 一 $(UseNativeHttpHandler)=true起使用时才有效。 此属性最常见的值为:

  • Xamarin.Android.Net.AndroidMessageHandler:使用 Android Java API 执行 HTTP 请求。 它类似于旧版 Xamarin.Android.Net.AndroidClientHandler ,但进行了多项改进。 它支持 HTTP 1.1 和 TLS 1.2。 它是默认的 HTTP 消息处理程序。

  • System.Net.Http.SocketsHttpHandler, System.Net.Http:.NET 中的默认消息处理程序。 它支持 HTTP/2、TLS 1.2,建议用于 Grpc.Net.Client 的 HTTP 消息处理程序。 此值等效于 $(UseNativeHttpHandler)=false.

  • 取消设置/空字符串,等效于 System.Net.Http.HttpClientHandler, System.Net.Http

    对应于 Visual Studio 属性页中的 Default 选项。

    当 Visual Studio 中“最低 Android 版本”配置为“Android 4.4.87”或更低版本,或者当 Visual Studio for Mac 中“目标平台”设置为“新式开发”或“最大兼容性”时,新建项目向导为新项目选择此选项

  • System.Net.Http.HttpClientHandler, System.Net.Http:使用托管 HttpMessageHandler

    对应于 Visual Studio 属性页中的 Managed 选项。

注意

在 .NET 6 中,指定的类型不得 Xamarin.Android.Net.AndroidClientHandlerSystem.Net.Http.HttpClientHandler 继承自这些类之一。 如果要从“经典”Xamarin.Android 迁移, AndroidMessageHandler 请改用或派生自定义处理程序。

注意

通过设置 XA_HTTP_CLIENT_HANDLER_TYPE 环境变量,可以支持 $(AndroidHttpClientHandlerType) 属性。 在文件中找到的 $XA_HTTP_CLIENT_HANDLER_TYPE 值(生成操作为 @(AndroidEnvironment))优先级更高。

AndroidIncludeWrapSh

一个布尔值,指示是否应将 Android 包装器脚本 (wrap.sh) 打包到 APK 中。 默认值为 false,因为包装器脚本可能会严重影响应用程序的启动和运行方式,并且应仅在必要时才包含该脚本,例如,当调试或以其他方式更改应用程序启动/运行时行为时。

使用 生成操作将该脚本添加到项目中,@(AndroidNativeLibrary) 生成操作,因为它与特定于体系结构的本机库位于同一目录中,并且必须命名为 wrap.sh

指定 wrap.sh 脚本路径的最简单方法是将其放在以目标体系结构命名的目录中。 如果每个体系结构只有一个 wrap.sh,则此方法适用:

<AndroidNativeLibrary Include="path/to/arm64-v8a/wrap.sh" />

但是,如果出于不同目的,项目的每个体系结构需要多个 wrap.sh,则此方法将不可行。 在这种情况下,可以使用 AndroidNativeLibraryLink 元数据指定名称:

<AndroidNativeLibrary Include="/path/to/my/arm64-wrap.sh">
  <Link>lib\arm64-v8a\wrap.sh</Link>
</AndroidNativeLibrary>

如果使用的是 Link 元数据,则其值中指定的路径必须是相对于 APK 根目录的有效的、本机的、特定于体系结构的库路径。 路径的格式为 lib\ARCH\wrap.sh,其中 ARCH 可以是以下内容之一:

  • arm64-v8a
  • armeabi-v7a
  • x86_64
  • x86

AndroidIncludeAssetPacksInPackage

此属性控制资产包生成是否自动包含在最终 .aab 文件中。 它默认为 true.

在某些情况下,用户可能想要发布临时版本。 在这些情况下,用户不需要更新资产包。 尤其是资产包的内容未更改时。 此属性允许用户在不需要的情况下跳过资产包。

在 .NET 9 中添加

AndroidInstallJavaDependencies

默认值用于 true 命令行生成。 设置为 “ true设置为”时,启用在运行 <InstallAndroidDependencies/> 目标时安装 Java SDK。

.NET 9 中添加了对此属性的支持。

AndroidJavadocVerbosity

指定在绑定项目中导入 Javadoc 文档时,C#XML 文档注释的“详细”程度。

需要使用 @(JavaSourceJar) 生成操作。

$(AndroidJavadocVerbosity) 属性类似于枚举,其可能值为 fullintellisense

默认值为 intellisense

AndroidKeyStore

一个布尔值,指示是否应使用自定义签名信息。 默认值是 False,这意味着将使用默认的调试签名密钥来对包进行签名。

AndroidLaunchActivity

要启动的 Android 活动。

AndroidLinkMode

指定应对 Android 包中包含的程序集执行的链接的类型。 仅在 Android 应用程序项目中使用。 默认值是 SdkOnly。 有效值为:

  • None:不会尝试链接。

  • SdkOnly:仅在基类库上执行链接,而不是用户程序集。

  • Full:将在基类库和用户程序集上执行链接。

    注意

    使用“完整”这一 AndroidLinkMode 值常会导致应用损坏,尤其是使用放射时。 除非你真正知道在做什么,否则请避免。

<AndroidLinkMode>SdkOnly</AndroidLinkMode>

AndroidLinkResources

true 时,生成系统将链接所有程序集中 Resource.Designer.cs Resource 类的嵌套类型。 使用这些类型的 IL 代码将更新为直接使用值,而不是访问字段。

链接嵌套类型可能会对减少 apk 大小产生较小影响,也有助于提高启动性能。 仅链接“发布”版本。

“实验”。 仅设计用于处理代码,例如

var view = FindViewById(Resources.Ids.foo);

不支持任何其他方案(如反射)。

AndroidLinkSkip

指定不应链接的程序集名称的列表,以分号分隔 (;),且没有文件扩展名。 仅在 Android 应用程序项目中使用。

<AndroidLinkSkip>Assembly1;Assembly2</AndroidLinkSkip>

AndroidLinkTool

枚举样式的属性,有效值为 proguardr8。 指示用于 Java 代码的代码压缩器。 默认值为空字符串,如果 $(AndroidEnableProguard)True,则为 proguard。 请参阅有关 D8 和 R8 的文档。

AndroidLintEnabled

一个布尔属性,允许开发人员在打包过程中运行 android lint 工具。

$(AndroidLintEnabled) 为 True 时,使用以下属性:

也可以使用以下生成操作:

请参阅 Lint 帮助,了解有关 Android lint 工具的详细信息。

AndroidLintEnabledIssues

一个字符串属性,是要启用的 lint 问题的逗号分隔列表。

仅在 $(AndroidLintEnabled)=True 时使用。

AndroidLintDisabledIssues

一个字符串属性,是要禁用的 lint 问题的逗号分隔列表。

仅在 $(AndroidLintEnabled)=True 时使用。

AndroidLintCheckIssues

一个字符串属性,是要检查的 lint 问题的逗号分隔列表。

仅在 $(AndroidLintEnabled)=True 时使用。

请注意:只检查这些问题。

AndroidManagedSymbols

此布尔属性控制是否生成序列点,以便可以从 Release 堆栈跟踪中提取文件名和行号信息。

AndroidManifest

指定用于应用 AndroidManifest.xml 的模板的文件名。 在生成期间,将合并任何其他必要的值以生成实际的 AndroidManifest.xml$(AndroidManifest) 必须在 /manifest/@package 属性中包含程序包名称。

AndroidManifestMerger

指定用于合并 AndroidManifest.xml 文件的实现。 这是一个枚举样式的属性,其中 legacy 选择原始 C# 实现,manifestmerger.jar 选择 Google 的 Java 实现。

默认值当前为 manifestmerger.jar。 如果要使用旧版本,请将以下内容添加到 csproj

<AndroidManifestMerger>legacy</AndroidManifestMerger>

Google 的合并器启用了 xmlns:tools="http://schemas.android.com/tools" 支持,如 Android 文档中所述。

AndroidManifestMergerExtraArgs

一个字符串属性,用于向 Android 文档工具提供自变量。

如果需要工具的详细输出,可以将以下内容添加到 .csproj

<AndroidManifestMergerExtraArgs>--log VERBOSE</AndroidManifestMergerExtraArgs>

AndroidManifestType

枚举样式的属性,有效值为 XamarinGoogleV2。 这控制 InstallAndroidDependencies 目标使用哪个存储库来确定哪些 Android 包和包版本可用并且可以安装。

XamarinVisual Studio SDK Manager 中的“批准的列表(推荐)”存储库。

GoogleV2Visual Studio SDK Manager 中的“完整列表(不支持)”存储库。

如果未 $(AndroidManifestType) 设置, Xamarin 则使用。

AndroidManifestPlaceholders

AndroidManifest.xml 的键值替换对列表,采用分号分隔,其中每个对的格式为 key=value

例如,assemblyName=$(AssemblyName) 的属性值定义一个 ${assemblyName} 占位符,随后该占位符可以出现在 AndroidManifest.xml 中

<application android:label="${assemblyName}"

这提供了一种将生成过程中的变量插入 AndroidManifest.xml 文件的方法

AndroidMultiDexClassListExtraArgs

一个字符串属性,允许开发人员在生成 multidex.keep 文件时将自变量传递给 com.android.multidex.MainDexListBuilder

具体事例:是否在 dx 编译期间发生以下错误。

com.android.dex.DexException: Too many classes in --main-dex-list, main dex capacity exceeded

如果发生此错误,可以向 .csproj 添加以下内容。

<DxExtraArguments>--force-jumbo </DxExtraArguments>
<AndroidMultiDexClassListExtraArgs>--disable-annotation-resolution-workaround</AndroidMultiDexClassListExtraArgs>

这将允许 dx 步骤成功。

AndroidPackageFormat

枚举样式的属性,有效值为 apkaab。 指示希望将 Android 应用程序打包为 APK 文件还是 Android 应用程序包。 应用程序包是一种新的格式,适用于要在 Google Play 上提交的 Release 版本。 默认值为 apk

$(AndroidPackageFormat) 设置为 aab 时,系统将设置 Android 应用程序包所必需的其他 MSBuild 属性:

.net 6 将弃用此属性。 用户应切换到较新的 AndroidPackageFormats

AndroidPackageFormats

一个分号分隔的属性,其有效值为 apkaab。 指示希望将 Android 应用程序打包为 APK 文件还是 Android 应用程序包。 应用程序包是一种新的格式,适用于要在 Google Play 上提交的 Release 版本。

生成发布版本时,可能需要生成两者和 aab 以及一个 apk,以便分发到各个商店。

AndroidPackageFormats 设置为 aab;apk 将导致生成两者。 将 AndroidPackageFormats 设置为 aabapk 将只生成一个文件。

默认值aab;apkRelease仅适用于生成。 建议继续使用 apk 进行调试。

AndroidPackageNamingPolicy

枚举样式的属性,用于指定生成的 Java 源代码的 Java 包名称。

唯一支持的值为 LowercaseCrc64

AndroidPrepareForBuildDependsOn

可用于扩展 Android 生成过程的分号分隔属性。 添加到此属性的 MSBuild 目标将在生成早期针对应用程序和库项目类型执行。 默认情况下,此属性为空。

示例:

<PropertyGroup>
  <AndroidPrepareForBuildDependsOn>MyCustomTarget</AndroidPrepareForBuildDependsOn>
</PropertyGroup>

<Target Name="MyCustomTarget" >
  <Message Text="Running target: 'MyCustomTarget'" Importance="high"  />
</Target>

AndroidProguardMappingFile

指定 r8-printmapping proguard 规则。 这意味着 mapping.txt 文件将在 $(OutputPath) 文件夹中生成。 将包上传到 Google Play 应用商店时,可以使用此文件。

默认情况下,使用 AndroidLinkTool=r8 时会自动生成此文件,并将生成以下文件 $(OutputPath)mapping.txt

如果不想生成此映射文件,则可以使用 AndroidCreateProguardMappingFile 属性停止创建它。 在项目中添加以下内容

<AndroidCreateProguardMappingFile>False</AndroidCreateProguardMappingFile>

或在命令行上使用 -p:AndroidCreateProguardMappingFile=False

AndroidD8IgnoreWarnings

指定要 --map-diagnostics warning info 传递给 d8. 默认值为 True,但可以设置为 False 以强制实施更严格的行为。 有关详细信息, 请参阅 D8 和 R8 源代码

在 .NET 8 中添加。

AndroidR8IgnoreWarnings

指定 r8-ignorewarnings proguard 规则。 这允许 r8 继续进行 dex 编译(即使遇到特定的警告)。 默认值为 True,但可以设置为 False 以强制实施更严格的行为。 有关详细信息,请参阅 ProGuard 手册

从 .NET 8 开始,指定 --map-diagnostics warning info。 有关详细信息, 请参阅 D8 和 R8 源代码

AndroidR8JarPath

指向 r8.jar 的路径,可与 r8 dex 编译器和压缩器结合使用。 默认值是用于 Android 工作负载安装的 .NET 的路径。 有关详细信息,请参阅 D8 和 R8 相关文档。

AndroidResgenExtraArgs

指定在处理 Android 资产和资源时传递给 aapt 命令的命令行选项。

AndroidResgenFile

指定要生成的资源文件的名称。 默认模板将其设置为 Resource.designer.cs

AndroidResourceDesignerClassModifier

指定生成的中间 Resource 类的类修饰符。 有效值为 publicinternal

默认情况下,此值为 public.

在 .NET 9 中添加。

AndroidSdkBuildToolsVersion

Android SDK 生成工具包提供 aapt 和 zipalign 工具等。 可以同时安装多个不同版本的生成工具包。 若要选择用于打包的生成工具包,请检查是否有“首选”生成工具版本。如果有,请使用它;如果没有“首选”版本,请使用版本最高的已安装生成工具包。

$(AndroidSdkBuildToolsVersion) MSBuild 属性包含首选的生成工具版本。 .NET for Android 生成系统提供默认值 Xamarin.Android.Common.targets,并且可能会在项目文件中重写默认值以选择备用生成工具版本(例如),如果已知以前的 aapt 版本正常工作,则最新 aapt 崩溃。

AndroidSigningKeyAlias

指定密钥存储中密钥的别名。 这是创建密钥存储时使用的 keytool -alias 值。

AndroidSigningKeyPass

指定密钥存储文件中密钥的密码。 这是在 keytool 要求“输入 $(AndroidSigningKeyAlias) 的密匙密码”时输入的值。

此属性还支持 env:file: 前缀,它们可用于指定包含密码的环境变量或文件。 这些选项提供了一种防止密码显示在生成日志中的方法。

例如,使用名称为 AndroidSigningPassword 的环境变量:

<PropertyGroup>
  <AndroidSigningKeyPass>env:AndroidSigningPassword</AndroidSigningKeyPass>
</PropertyGroup>

使用位于 C:\Users\user1\AndroidSigningPassword.txt 的文件:

<PropertyGroup>
  <AndroidSigningKeyPass>file:C:\Users\user1\AndroidSigningPassword.txt</AndroidSigningKeyPass>
</PropertyGroup>

注意

$(AndroidPackageFormat) 设置为 aab 时,不支持 env: 前缀。

AndroidSigningKeyStore

指定由 keytool 创建的密钥存储文件的文件名。 这对应于提供给 keytool -keystore 选项的值。

AndroidSigningStorePass

指定 $(AndroidSigningKeyStore) 的密码。 这是在创建密钥存储文件并要求“输入密钥存储密码:”时为 keytool 提供的值。

此属性还支持 env:file: 前缀,它们可用于指定包含密码的环境变量或文件。 这些选项提供了一种防止密码显示在生成日志中的方法。

例如,使用名称为 AndroidSigningPassword 的环境变量:

<PropertyGroup>
  <AndroidSigningStorePass>env:AndroidSigningPassword</AndroidSigningStorePass>
</PropertyGroup>

使用位于 C:\Users\user1\AndroidSigningPassword.txt 的文件:

<PropertyGroup>
  <AndroidSigningStorePass>file:C:\Users\user1\AndroidSigningPassword.txt</AndroidSigningStorePass>
</PropertyGroup>

注意

$(AndroidPackageFormat) 设置为 aab 时,不支持 env: 前缀。

AndroidSigningPlatformKey

指定要用于对 apk 进行签名的密钥文件。 这仅在生成 system 应用程序时使用。

AndroidSigningPlatformCert

指定要用于对 apk 进行签名的证书文件。 这仅在生成 system 应用程序时使用。

AndroidStripILAfterAOT

一个布尔属性,指定是否 将删除 AOT 编译方法的方法主体

默认值为false,不会删除 AOT 编译方法的方法主体。

设置为 true$(AndroidEnableProfiledAot)> 时,默认设置为 false>。 这意味着,在发布配置内部版本($(RunAOTCompilation)true默认为 -- 为所有内容启用 AOT)。 这可能会导致应用大小增加。 可以通过在项目文件中显式设置 $(AndroidEnableProfiledAot)true 重写此行为。

.NET 8 中添加了对此属性的支持。

AndroidSupportedAbis

此字符串属性包含应加入 .apk 中的分号 (;) 分隔的 ABI 列表。

支持的值包括:

  • armeabi-v7a
  • x86
  • arm64-v8a
  • x86_64

AndroidTlsProvider

此属性已过时,不应使用。

AndroidUseAapt2

一个布尔属性,使开发人员能够控制 aapt2 打包工具的使用。 默认情况下,此值为 True。

此属性不能设置为 false。

AndroidUseApkSigner

一个布尔属性,允许开发人员使用 apksigner 工具,而不是 jarsigner

AndroidUseDefaultAotProfile

允许开发人员禁止使用默认 AOT 配置文件的布尔属性。

若要禁止使用默认 AOT 配置文件,则将此属性设置为 false

AndroidUseDesignerAssembly

一个 bool 属性,用于控制生成系统是否将生成 _Microsoft.Android.Resource.Designer.dll 为应用于文件的布尔 Resource.Designer.cs 属性。 这一点的好处是较小的应用程序和更快的启动时间。

默认值在 true .NET 8 中。

作为 Nuget Author,如果想要保持向后兼容性,建议提供三个版本的程序集。 一个用于 MonoAndroid,一个用于 net6.0-android,一个用于 net8.0-android。 可以使用 Xamarin.Legacy.Sdk 执行此操作。 仅当 Nuget 库项目使用 AndroidResource 项目中的项或通过依赖项时,才需要这样做。

<TargetFrameworks>monoandroid90;net6.0-android;net8.0-android</TargetFrameworks>

或者关闭此设置,直到经典版和 net7.0-android 等时间都已弃用。

选择关闭此设置的 .NET 8 项目将无法使用使用它的引用。 如果尝试使用在未启用此功能的项目中启用此功能的程序集,则会出现 XA1034 生成错误。

在 .NET 8 中添加。

AndroidUseInterpreter

一个布尔属性,导致 .apk 包含 mono 解释器,而不是普通 JIT。

“实验”。

AndroidUseLegacyVersionCode

一个布尔属性,允许开发人员将 versionCode 计算还原到先前的 Xamarin.Android 8.2 旧行为。 这只能适用于在 Google Play 商店中已发布应用程序的开发人员。 强烈建议使用新 $(AndroidVersionCodePattern) 属性。

AndroidUseManagedDesignTimeResourceGenerator

一个布尔属性,将切换设计时生成以使用受管理资源分析程序,而不是 aapt

AndroidUseNegotiateAuthentication

一个布尔属性,用于在中 AndroidMessageHandler启用对 NTLMv2/Negotiate 身份验证的支持。 默认值为 False。

在 .NET 7 中添加。

AndroidUseSharedRuntime

此属性已过时,不应使用。

AndroidVersionCode

MSBuild 属性,可用作 AndroidManifest.xml 文件中 /manifest/@android:versionCode 的替代方法。 若要选择加入此功能,还必须启用 <GenerateApplicationManifest>true</GenerateApplicationManifest>。 这将是 .NET 6 中的默认设置。

如果使用 $(AndroidCreatePackagePerAbi)$(AndroidVersionCodePattern),则忽略此属性。

@android:versionCode 是必须为每个 Google Play 版本递增的整数值。 有关 /manifest/@android:versionCode 要求的详细信息,请参阅 Android 文档

AndroidVersionCodePattern

一个字符串属性,允许开发人员自定义清单中的 versionCode。 有关决定 versionCode 的信息,请参阅为 APK 创建版本代码

例如,如果 abiarmeabi,清单中的 versionCode123,则当 $(AndroidCreatePackagePerAbi) 为 True 时,{abi}{versionCode} 将生成 1123 的 versionCode,否则将生成值 123。 如果 abix86_64,则清单中的 versionCode44。 当 $(AndroidCreatePackagePerAbi) 为 True 时,这将生成 544,否则会生成值 44

如果我们包含左填充格式字符串 {abi}{versionCode:0000},则会生成 50044,因为我们用 0 在左边填充 versionCode。 此外,也可以使用十进制填充(例如 ),{abi}{versionCode:D4},其作用与前面的示例相同。

由于值必须是整数,因此只支持 0 和 Dx 填充格式字符串。

预定义的键项

  • abi – 插入应用的目标 abi

    • 2 – armeabi-v7a
    • 3 – x86
    • 4 – arm64-v8a
    • 5 – x86_64
  • minSDK – 插入 AndroidManifest.xml11 中支持的最小 Sdk 值(如果未定义)。

  • versionCode – 直接从 Properties\AndroidManifest.xml 使用版本代码。

你可以使用(下文中定义的)$(AndroidVersionCodeProperties) 属性定义自定义项。

默认情况下,值设置为 {abi}{versionCode:D6}。 如果开发人员要保留旧行为,可将 $(AndroidUseLegacyVersionCode) 属性设置为 true,从而替代默认值

AndroidVersionCodeProperties

一个字符串属性,允许开发人员定义要与 $(AndroidVersionCodePattern) 配合使用的自定义项。 它们采用 key=value 对的形式。 value 中的所有项都应是整数值。 例如:screen=23;target=$(_AndroidApiLevel)。 正如你所看到的,你可以使用字符串中现有或自定义的 MSBuild 属性。

ApplicationId

一个 MSBuild 属性,可用作 AndroidManifest.xml 文件中 /manifest/@package 的替代方法。 若要选择加入此功能,还必须启用 <GenerateApplicationManifest>true</GenerateApplicationManifest>。 这将是 .NET 6 中的默认设置。

有关 /manifest/@package 要求的详细信息,请参阅 Android 文档

ApplicationTitle

一个 MSBuild 属性,可用作 AndroidManifest.xml 文件中 /manifest/application/@android:label 的替代方法。 若要选择加入此功能,还必须启用 <GenerateApplicationManifest>true</GenerateApplicationManifest>。 这将是 .NET 6 中的默认设置。

有关 /manifest/application/@android:label 要求的详细信息,请参阅 Android 文档

ApplicationVersion

一个 MSBuild 属性,可用作 AndroidManifest.xml 文件中 /manifest/@android:versionName 的替代方法。 若要选择加入此功能,还必须启用 <GenerateApplicationManifest>true</GenerateApplicationManifest>。 这将是 .NET 6 中的默认设置。

有关 /manifest/@android:versionName 要求的详细信息,请参阅 Android 文档

AotAssemblies

一个布尔属性,用于确定程序集是否将提前编译为本机代码并包含在应用程序中。 该属性默认为 False

.NET 7 中已弃用。 改为迁移到新的 $(RunAOTCompilation) MSBuild 属性,因为将来的版本中将删除对 $(AotAssemblies) 它的支持。

AProfUtilExtraOptions

要传递给 aprofutil 的其他选项。

BeforeBuildAndroidAssetPacks

此属性中列出的 MSBuild 目标将在生成项之前 AssetPack 直接运行。

在 .NET 9 中添加

BeforeGenerateAndroidManifest

此属性中列出的 MSBuild 目标将在 _GenerateJavaStubs 之前直接运行。

配置

指定要使用的生成配置,例如“调试”或“发行”。 配置属性用于确定其他属性(确定目标行为)的默认值。 其他配置可能会在 IDE 中创建。

默认情况下Debug 配置将导致 InstallSignAndroidPackage 目标创建更小的 Android 包,这需要提供其他文件和包进行操作。

默认 Release 配置将导致 InstallSignAndroidPackage 目标创建独立的 Android 包,无需安装其他任何包或文件即可使用此包。

DebugSymbols

一个布尔值,与 $(DebugType) 属性相结合,确定 Android 包是否可调试。 可调试包包含调试符号,将 //application/@android:debuggable 属性设置为 true,并自动添加 INTERNET 权限,以便调试器可以附加到该过程。 如果 DebugSymbolsTrue并且 DebugType 是空字符串或 Full,则应用程序是可调试的。

DebugType

指定要生成的调试符号的类型作为版本的一部分,它还会影响应用程序是否可调试。 可能的值包括:

  • Full:生成 Full 符号。 如果 DebugSymbols MSBuild 属性也为 True,则应用程序包是可调试的。

  • PdbOnly:生成 "PDB" 符号。 应用程序包将不可调试。

如果 DebugType 未设置或为空字符串,则 DebugSymbols 属性控制应用程序是否可调试。

EmbedAssembliesIntoApk

此布尔属性确定应用的程序集是否应嵌入到应用程序包中。

对于发行版本,该属性应为 True,对于调试版本应为 False。 如果“快速部署”不支持目标设备,则调试版本中可能必须为 True

此属性为 False 时,$(AndroidFastDeploymentType) MSBuild 属性还会控制嵌入到 .apk 中的内容,这会影响部署和重新生成时间。

EnableLLVM

此布尔属性确定在将程序集预编译为本机代码时是否使用 LLVM。

必须安装 Android NDK 才能生成启用了此属性的项目。

该属性默认为 False

除非 $(AotAssemblies) MSBuild 属性为 True,否则该属性将被忽略。

EnableProguard

此布尔属性确定是否在打包过程中运行 proguard 以链接 Java 代码。

该属性默认为 False

如果为 True,则 @(ProguardConfiguration) 文件将用于控制 proguard 的执行。

GenerateApplicationManifest

启用或禁用在最终 AndroidManifest.xml 文件中发出值的以下 MSBuild 属性:

默认值 $(GenerateApplicationManifest)true.

JavaMaximumHeapSize

指定在打包过程中构建 .dex 文件时使用的 java-Xmx 参数值的值。 如果未指定,则 -Xmx 选项向 java 提供值 1G。 我们发现与其他平台相比,Windows 常常要求这样设置。

如果 _CompileDex 目标引发 java.lang.OutOfMemoryError,则指定该属性是必需的。

通过如下更改自定义值:

<JavaMaximumHeapSize>1G</JavaMaximumHeapSize>

JavaOptions

指定在生成 .dex 文件时传递给 java 的命令行选项。

JarsignerTimestampAuthorityCertificateAlias

此属性允许指定时间戳颁发机构密钥存储中的别名。 有关详细信息,请参阅 Java 签名时间戳支持文档。

<PropertyGroup>
    <JarsignerTimestampAuthorityCertificateAlias>Alias</JarsignerTimestampAuthorityCertificateAlias>
</PropertyGroup>

JarsignerTimestampAuthorityUrl

此属性允许指定时间戳颁发机构服务的 URL。 这可确保 .apk 签名包含时间戳。 有关详细信息,请参阅 Java 签名时间戳支持文档。

<PropertyGroup>
    <JarsignerTimestampAuthorityUrl>http://example.tsa.url</JarsignerTimestampAuthorityUrl>
</PropertyGroup>

LinkerDumpDependencies

一个布尔属性,允许生成链接器依赖项文件。 可将此文件用作 illinkanalyzer 工具的输入。

名为 linker-dependencies.xml.gz 的依赖项文件已写入项目目录。 在 .NET5/6 上,它写在 obj/<Configuration>/android<ABI>/linked 目录中的链接程序集旁边。

默认值为 False。

MandroidI18n

此 MSBuild 属性已过时,不再受支持。

MonoAndroidResourcePrefix

通过 AndroidResource 生成操作指定从文件名开头删除的“路径前缀”。 这是为了允许更改资源所在的位置。

默认值为 Resources。 将此项更改为 res 以获得 Java 项目结构。

MonoSymbolArchive

一个布尔属性,控制是否创建 .mSYM 项目供以后与 mono-symbolicate 一起使用,以从版本堆栈跟踪中提取“真实”文件名和行号信息。

对于已启用调试符号的“发布”应用,默认情况下为 True:$(EmbedAssembliesIntoApk) 为 True,$(DebugSymbols) 为 True,并且 $(Optimize) 为 True。

RunAOTCompilation

一个布尔属性,用于确定程序集是否将提前编译为本机代码并包含在应用程序中。 此属性 False 默认用于 Debug 生成, True 默认情况下为 Release 生成。

此 MSBuild 属性替换 Xamarin.Android 中的 $(AotAssemblies) MSBuild 属性。 这与 Blazor WASM 使用的属性相同。