Поделиться через


Манифест приложения Android

У каждого приложения .NET Multi-platform App UI (.NET MAUI) на Android есть файл AndroidManifest.xml, расположенный в папке Platform\Android, в котором описываются основные сведения о приложении для создания инструментов, операционной системы Android и Google Play.

Файл манифеста для приложения .NET MAUI Android создается в рамках процесса сборки .NET MAUI в Android. Этот процесс сборки принимает XML в файле платформ\Android\AndroidManifest.xml и объединяет его с любым XML-кодом, созданным из определенных атрибутов в ваших классах. Полученный файл манифеста можно найти в папке obj. Например, его можно найти в obj\Debug\net8.0-android\AndroidManifest.xml для debug-сборок на .NET 8.

Заметка

Visual Studio 17.6+ включает редактор, упрощающий процесс указания сведений о приложении, целевой версии Android и необходимых разрешений в файле манифеста Android.

Создание манифеста

Все приложения .NET MAUI имеют класс MainActivity, производный от Activity, через класс MauiAppCompatActivity, к которому применяется ActivityAttribute. Некоторые приложения могут включать дополнительные классы, производные от Activity, к которым применяется ActivityAttribute.

Во время сборки сканируются сборки для классов, которые не являютсяabstract, производны от Activity и к которым применен ActivityAttribute. Эти классы и атрибуты используются для создания манифеста приложения. Например, рассмотрим следующий код:

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" />

Заметка

ActivityAttribute не влияет на типы abstract.

Название действия

Имя типа активности основано на 64-битной циклической избыточной проверке собранного квалифицированного имени экспортируемого типа. Это позволяет предоставить одно и то же полностью квалифицированное имя из двух разных сборок без возникновения упаковочной ошибки.

Чтобы переопределить это значение по умолчанию и явно указать имя действия, используйте свойство Name:

using Android.App;

namespace MyMauiApp;

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

В этом примере создается следующий фрагмент XML:

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

Заметка

Для обратной совместимости следует использовать только свойство Name, так как такое переименование может замедлить поиск типов во время выполнения.

Типичный сценарий настройки свойства Name заключается в том, что необходимо получить удобочитаемое имя Java для вашего действия. Это может быть полезно, если другое приложение 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 задает разрешения INTERNET и ACCESS_NETWORK_STATE в Платформах\Android\AndroidManifest.xml, так как для большинства приложений требуется доступ к Интернету. Если удалить разрешение INTERNET из манифеста, сборки отладки по-прежнему будут включать разрешение в созданный файл манифеста.

Совет

Если вы обнаружите, что переключение на релизную сборку приводит к тому, что приложение теряет разрешение, доступное в отладочной сборке, убедитесь, что вы явно указали требуемое разрешение в файле манифеста.

Действия и функции намерения

Файл манифеста Android предоставляет способ описания возможностей приложения. Это достигается с помощью намерений и IntentFilterAttribute. Вы можете указать, какие действия подходят для действия с помощью конструктора IntentFilterAttribute и какие категории соответствуют свойству Categories. Необходимо предоставить как минимум одно действие, поэтому они и предоставляются в конструкторе. [IntentFilter] можно предоставить несколько раз, и каждое использование приводит к отдельному элементу <intent-filter/> в <activity/>:

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, чтобы указать, что имя приложения, доступное для чтения, — "My Maui App", и что он использует стиль 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();
}

Это объявление приводит к созданию следующего фрагмента XML в obj\Debug\net8.0-android\AndroidManifest.xml:

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

Заметка

Отладочные сборки автоматически устанавливают android:debuggable="true", чтобы отладчики и другие средства могли подключаться к вашему приложению. Однако он не установлен для релизных сборок.

В этом примере все действия в приложении по умолчанию будут использовать стиль Maui.SplashTheme. Если для темы действия задано значение Maui.MyTheme, это действие будет использовать стиль Maui.MyTheme, а другие действия в приложении по умолчанию будут использоваться в стиле Maui.SplashTheme, заданном в элементе <application>.

ApplicationAttribute — это не единственный способ настройки атрибутов <application>. Вы также можете вставить свойства непосредственно в элемент <application> файла манифеста. Затем эти свойства объединяются в созданный файл манифеста. Дополнительные сведения см. в разделе свойств ApplicationAttribute.

Важно

Содержимое платформ \Android\AndroidManifest.xml всегда переопределяет данные, предоставляемые атрибутами.

Строка заголовка приложения

В приложениях Android есть строка заголовка, отображающая метку. Значение свойства сборки $(ApplicationTitle) в файле проекта приложения .NET MAUI отображается в строке заголовка. .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.

Атрибуты

В следующей таблице показаны атрибуты .NET для Android, которые создают фрагменты XML манифеста Android:

Атрибут Описание
Android.App.ActivityAttribute Создает XML-фрагмент для действия и.
Android.App.ApplicationAttribute Создает фрагмент XML приложения.
Android.App.InstrumentationAttribute Создает XML-фрагмент инструментирования.
Android.App.IntentFilterAttribute Создает фрагмент фильтра намерений XML .
Android.App.MetaDataAttribute Генерирует XML-фрагмент метаданных .
Android.App.PermissionAttribute Создает XML-фрагмент разрешения.
Android.App.PermissionGroupAttribute Создает XML-фрагмент группы разрешений.
Android.App.PermissionTreeAttribute Создает фрагмент дерева разрешений в формате XML.
Android.App.ServiceAttribute Создает XML-фрагмент службы .
Android.App.UsesLibraryAttribute Создает фрагмент XML для uses-library с элементом.
Android.App.UsesPermissionAttribute Генерирует XML-фрагмент разрешения на использование .
Android.Content.BroadcastReceiverAttribute Генерирует XML фрагмент приемника .
Android.Content.ContentProviderAttribute Генерирует XML-фрагмент поставщика .
Android.Content.GrantUriPermissionAttribute Создает XML-фрагмент grant-uri-permission.

См. также

  • Обзор манифеста приложения developer.android.com