Android 应用清单

Android 上的每个 .NET Multi-platform App UI (.NET MAUI) 应用都有一个 AndroidManifest.xml 文件,该文件位于 Platforms\Android 文件夹中,用于描述有关应用生成工具、Android 操作系统和 Google Play 的基本信息。

.NET MAUI Android 应用的清单文件作为 Android 上的 .NET MAUI 生成过程的一部分生成。 此生成过程采用 Platforms\Android\AndroidManifest.xml 文件中的 XML,并将其与类上特定特性生成的任何 XML 合并。 生成的清单文件可以在 obj 文件夹中找到。 例如,可以在 obj\Debug\net8.0-android\AndroidManifest.xml 中找到它,以便在 .NET 8 上进行调试。

注意

Visual Studio 17.6+ 包含一个编辑器,可简化在 Android 清单文件中指定应用详细信息、目标 Android 版本和所需权限的过程。

生成清单

所有 .NET MAUI 应用都有一个 MainActivity 类,该类通过 MauiAppCompatActivity 类由 Activity 派生,并将 ActivityAttribute 应用至该类。 某些应用可能包含派生自 Activity 且已应用 ActivityAttribute 的其他类。

在生成时,会扫描程序集以获取派生自 Activity 且已应用 ActivityAttribute 的非 abstract 类。 这些类和特性用于生成应用的清单。 例如,考虑以下代码:

using Android.App;

namespace MyMauiApp;

public class MyActivity : Activity
{
}

此示例不会导致清单文件中生成任何内容。 如需生成元素 <activity/>,需要添加 ActivityAttribute

using Android.App;

namespace MyMauiApp;

[Activity]
public class MyActivity : Activity
{
}

此示例导致将下面的 XML 片段添加到清单文件中:

<activity android:name="crc64bdb9c38958c20c7c.MyActivity" />

注意

ActivityAttributeabstract 类型没有影响。

活动名称

活动的类型名称基于所导出类型的程序集限定名的 64 位循环冗余检查。 这样,就可以从两个不同的程序集提供相同的完全限定名称,而不会收到打包错误。

若要替代此默认值,并显式指定活动名称,请使用 Name 属性:

using Android.App;

namespace MyMauiApp;

[Activity (Name="companyname.mymauiapp.activity")]
public class MyActivity : Activity
{
}

此示例生成下面的 XML 片段:

<activity android:name="companyname.mymauiapp.activity" />

注意

仅在为了实现向后兼容性时才使用 Name 属性,因为此类重命名可能会减慢运行时查找类型的速度。

需要获取活动的可读 Java 名称是设置 Name 属性的典型应用场景。 如果另一个 Android 应用需要能够打开应用,或者你有一个用于启动应用并测试启动时间的脚本,这就非常有用。

从应用选择器启动

如果 .NET MAUI Android 应用包含多个活动,且你需要指定应从应用启动器启动哪个活动,请使用 MainLauncher 属性:

using Android.App;

namespace MyMauiApp;

[Activity (Label="My Maui App", MainLauncher = true)]
public class MyActivity : Activity
{
}

此示例生成下面的 XML 片段:

<activity android:label="My Maui App"
          android:name="crc64bdb9c38958c20c7c.MainActivity">
  <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
</activity>

权限

向 Android 应用添加权限时,这些权限会记录在清单文件中。 例如,如果设置了 ACCESS_NETWORK_STATE 权限,则以下元素会被添加到清单文件中:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

.NET MAUI 应用项目模板在 Platforms\Android\AndroidManifest.xml 中设置 INTERNETACCESS_NETWORK_STATE 权限,因为大多数应用都需要 Internet 访问权限。 如果从清单中删除 INTERNET 权限,调试版本仍将在生成的清单文件中包含该权限。

提示

如果发现切换到发布版本会导致应用失去之前在调试版本中可用的权限,请验证是否已在清单文件中显式设置了所需的权限。

意向操作和功能

Android 清单文件提供一种介绍应用功能的方法。 这是通过意向IntentFilterAttribute 实现的。 可以使用 IntentFilterAttribute 构造函数指定适合活动的操作,以及哪些类别适合 Categories 属性。 必须至少提供一个活动(正因为此,活动是在构造函数中提供的)。 可以多次提供 [IntentFilter],且每次使用都会在 <activity/> 中生成一个单独的 <intent-filter/> 元素。

using Android.App;
using Android.Content;

namespace MyMauiApp;

[Activity(Label = "My Maui App", MainLauncher = true)]
[IntentFilter(new[] {Intent.ActionView},
    Categories = new[] {Intent.CategorySampleCode, "my.custom.category"})]
public class MyActivity : Activity
{
}

此示例生成下面的 XML 片段:

<activity android:label="My Maui App"
          android:name="crc64bdb9c38958c20c7c.MainActivity">
  <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
  <intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.SAMPLE_CODE" />
    <category android:name="my.custom.category" />
  </intent-filter>
</activity>

应用程序元素

Android 清单文件还提供一种为整个应用声明属性的方法。 这是通过 <application> 元素及其对应的 ApplicationAttribute 实现的。 通常是先为整个应用声明 <application> 属性,再根据活动的需要重写这些属性。

例如,可以将以下 Application 特性添加到 MainApplication.cs 以指示应用的用户可读名称为“我的 Maui 应用”,并且它使用 Maui.SplashTheme 样式作为所有活动的默认主题:

using Android.App;
using Android.Runtime;

namespace MyMauiApp;

[Application(Label = "My Maui App", Theme = "@style/Maui.SplashTheme")]
public class MainApplication : MauiApplication
{
      public MainApplication(IntPtr handle, JniHandleOwnership ownership)
             : base(handle, ownership)
      {
      }

      protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}

此声明导致在 obj\Debug\net8.0-android\AndroidManifest.xml 中生成下面的 XML 片段:

<application android:label="MyMauiApp" android:theme="@style/Maui.SplashTheme" android:debuggable="true" ...>

注意

调试版本会自动设置 android:debuggable="true",以便调试器和其他工具可以附加到应用。 但是,它未针对发布版本进行设置。

在此示例中,应用中的所有活动都默认使用 Maui.SplashTheme 样式。 如果你将某活动的主题设置为 Maui.MyTheme,只有此活动会使用 Maui.MyTheme 样式,而应用中的其他所有活动则都会默认使用 <application> 元素中设置的 Maui.SplashTheme 样式。

ApplicationAttribute 元素不是配置 <application> 特性的唯一方法。 还可以将属性直接插入清单文件的 <application> 元素中。 然后,这些属性将合并到生成的清单文件中。 有关详细信息,请参阅 ApplicationAttribute 的属性部分。

重要说明

Platforms\Android\AndroidManifest.xml 的内容始终会覆盖特性提供的数据。

应用标题栏

Android 应用程序有一个显示标签的标题栏。 .NET MAUI 应用项目文件中 $(ApplicationTitle) 生成属性的值显示在标题栏上。 .NET MAUI 将其作为 android.label 的值包含在生成的清单中:

<application android:label="My Maui App" ... />

若要在标题栏上指定活动的标签,请使用 Label 属性:

using Android.App;

namespace MyMauiApp;

[Activity (Label="My Maui App")]
public class MyActivity : Activity
{
}

此示例生成下面的 XML 片段:

<activity android:label="My Maui App"
          android:name="crc64bdb9c38958c20c7c.MyActivity" />

应用图标

默认情况下,应用将获得 .NET 图标。 有关指定自定义图标的信息,请参阅更改 .NET MAUI 应用图标

特性

下表显示了用于生成 Android 清单 XML 片段的 .NET for Android 属性:

属性 描述
Android.App.ActivityAttribute 生成 activity XML 片段。
Android.App.ApplicationAttribute 生成 application XML 片段。
Android.App.InstrumentationAttribute 生成 instrumentation XML 片段。
Android.App.IntentFilterAttribute 生成 intent-filter XML 片段。
Android.App.MetaDataAttribute 生成 meta-data XML 片段。
Android.App.PermissionAttribute 生成 permission XML 片段。
Android.App.PermissionGroupAttribute 生成 permission-group XML 片段。
Android.App.PermissionTreeAttribute 生成 permission-tree XML 片段。
Android.App.ServiceAttribute 生成 service XML 片段。
Android.App.UsesLibraryAttribute 生成 uses-library XML 片段。
Android.App.UsesPermissionAttribute 生成 uses-permission XML 片段。
Android.Content.BroadcastReceiverAttribute 生成 receiver XML 片段。
Android.Content.ContentProviderAttribute 生成 provider XML 片段。
Android.Content.GrantUriPermissionAttribute 生成 grant-uri-permission XML 片段。

另请参阅