Миграция проекта Xamarin.Android

Проект .NET 8 для приложения .NET для Android аналогичен следующему примеру:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net8.0-android</TargetFramework>
    <OutputType>Exe</OutputType>
  </PropertyGroup>
</Project>

Для проекта библиотеки опустите $(OutputType) свойство полностью или укажите Library в качестве значения свойства.

Файлы конфигурации .NET

Нет поддержки для файлов конфигурации, таких как Foo.dll.config или Foo.exe.config, в .NET для проектов Android. <dllmap> Элементы конфигурации не поддерживаются в .NET Core вообще, а другие типы элементов для пакетов совместимости, таких как System.Configuration.ConfigurationManager , никогда не поддерживаются в проектах Android.

Изменения свойств MSBuild

Свойство $(AndroidSupportedAbis) не должно использоваться:

<PropertyGroup>
  <!-- Used in Xamarin.Android projects -->
  <AndroidSupportedAbis>armeabi-v7a;arm64-v8a;x86;x86_64</AndroidSupportedAbis>
</PropertyGroup>

Вместо этого $(AndroidSupportedAbis) свойство должно быть заменено идентификаторами среды выполнения .NET:

<PropertyGroup>
  <!-- Used in .NET for Android projects -->
  <RuntimeIdentifiers>android-arm;android-arm64;android-x86;android-x64</RuntimeIdentifiers>
</PropertyGroup>

Дополнительные сведения об идентификаторах среды выполнения см. в каталоге .NET RID.

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

Свойство Комментарии
$(AndroidUseIntermediateDesignerFile) По умолчанию: True.
$(AndroidBoundExceptionType) По умолчанию: System. Это свойство изменяет типы исключений, выбрасываемых различными методами, чтобы лучше соответствовать семантике .NET, но при этом жертвует совместимостью с Xamarin.Android. Дополнительные сведения см. в разделе Некоторые из новых исключений Java используют исключения BCL, которые отличаются от соответствующих типов BCL.
$(AndroidClassParser) По умолчанию: class-parse. jar2xml не поддерживается.
$(AndroidDexTool) По умолчанию: d8. dx не поддерживается.
$(AndroidCodegenTarget) По умолчанию: XAJavaInterop1. XamarinAndroid не поддерживается.
$(AndroidManifest) По умолчанию используется AndroidManifest.xml в корне проектов, так как Properties\AssemblyInfo.cs больше не используется в проектах в стиле SDK. Properties\AndroidManifest.xml также будет обнаружен и может быть использован, если существует, чтобы упростить миграцию.
$(DebugType) По умолчанию: portable. full и pdbonly не поддерживаются.
$(MonoSymbolArchive) False, так как mono-symbolicate не поддерживается.

Кроме того, если привязка Java включена с @(InputJar), @(EmbeddedJar) или @(LibraryProjectZip), то свойство $(AllowUnsafeBlocks) по умолчанию используется как True.

Примечание.

Ссылка на проект Android Wear из приложения Android не поддерживается.

Изменения в AndroidManifest.xml

В проектах Android Xamarin.Android, Java и Kotlin элемент <uses-sdk/> обозначает минимальную версию приложения Android, а также целевую версию android, для которого приложение компилируется:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="1"
    android:versionName="1.0"
    package="com.companyname.myapp">
  <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="33" />
  <application android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" />
</manifest>

Дополнительные сведения об элементе <uses-sdk/> см. в документации по Android.

В приложениях .NET 8 Android есть свойства MSBuild для задания этих значений. Использование свойств MSBuild имеет другие преимущества. В большинстве случаев элемент <uses-sdk/> следует удалить в пользу значений в файле проекта .csproj:

<Project>
  <PropertyGroup>
    <TargetFramework>net8.0-android</TargetFramework>
    <SupportedOSPlatformVersion>21</SupportedOSPlatformVersion>
  </PropertyGroup>
</Project>

В этом примере net8.0-android является сокращением для net8.0-android34.0. Будущие версии .NET отслеживают последнюю версию Android, доступную во время выпуска .NET.

TargetFramework сопоставляется android:targetSdkVersion. Во время сборки это значение автоматически будет включено в элемент <uses-sdk/>. Преимущество использования TargetFramework таким образом заключается в том, что вы получаете соответствующую привязку C# для API Android 34 для net8.0-android34.0. Выпуски Android происходят независимо от цикла релизов .NET, поэтому мы можем выбрать net8.0-android35.0 , как только будет доступна привязка для следующего выпуска Android.

Аналогичным образом SupportedOSPlatformVersion сопоставляется с android:minSdkVersion. При сборке это значение автоматически будет включено в элемент <uses-sdk/>. API Android аннотированы с SupportedOSPlatformAttribute, чтобы предупреждать о вызовах API, доступных только для некоторых версий Android, на которых может работать ваше приложение.

error CA1416: This call site is reachable on 'Android' 21.0 and later. `ConnectivityManager.ActiveNetwork` is only supported on: 'Android' 23.0 and later.

Чтобы безопасно использовать этот API, можно объявить более высокий SupportedOSPlatformVersion в проекте или использовать IsAndroidVersionAtLeast API во время выполнения:

if (OperatingSystem.IsAndroidVersionAtLeast(23))
{
    // Use the API here
}

Включение файлов по умолчанию

Поведение глоббинга файлов по умолчанию для .NET для Android определяется в AutoImport.props. Это поведение можно отключить для элементов Android, установив $(EnableDefaultAndroidItems) в false, или всё поведение включения элементов по умолчанию можно отключить, установив $(EnableDefaultItems) в false. Дополнительные сведения см. в разделе файлы свойств рабочей нагрузки.

Поведение среды выполнения

Изменения в поведении метода String.IndexOf() в .NET 5+ на разных платформах. Дополнительные сведения см. в статье о глобализации .NET и ICU.

Компоновщик

В .NET 8 добавлены новые параметры компоновщика.

  • <PublishTrimmed>true</PublishTrimmed>
  • <TrimMode>partial</TrimMode>, который удаляет лишние части сборок, выбравших обрезку.

Дополнительные сведения см. в разделе Параметры обрезки.

По умолчанию в проектах .NET для Android сборки Debug не используют компоновщик, а сборки Release устанавливают PublishTrimmed=true и TrimMode=partial.

Если используется устаревший параметр AndroidLinkMode, то параметры SdkOnly и Full по умолчанию соответствуют эквивалентным параметрам компоновщика.

  • <PublishTrimmed>true</PublishTrimmed>
  • <TrimMode>partial</TrimMode>

При использовании AndroidLinkMode=SdkOnly на уровне членов связаны только те сборки BCL и SDK, которые помечены %(Trimmable). AndroidLinkMode=Full задает %(TrimMode)=partial для всех сборок .NET.

Совет

Необходимо перейти к новым параметрам компоновщика, так как этот AndroidLinkMode параметр в конечном итоге будет постепенно устаревать.

В .NET 9 есть новые параметры линкера:

  • <TrimMode>Full</TrimMode>, который выполняет полное обрезание.

Для получения дополнительной информации смотрите Параметры обрезки.

По умолчанию в проектах .NET для Android сборки Debug не используют линкер, а сборки Release настраивают PublishTrimmed=true и TrimMode=partial.

Компиляция заранее

$(RunAOTCompilation) — это новое свойство MSBuild для включения компиляции "Впереди времени" (AoT). Это то же свойство, используемое для Blazor WASM. Свойство $(AotAssemblies) также включает AOT, чтобы помочь с миграцией от проектов Xamarin.Android к проектам .NET для Android. Однако это свойство не рекомендуется использовать в .NET 7.

Сборки релиза по умолчанию используют следующие значения для свойств AOT:

<PropertyGroup Condition="'$(Configuration)' == 'Release'">
  <RunAOTCompilation>true</RunAOTCompilation>
  <AndroidEnableProfiledAot>true</AndroidEnableProfiledAot>
</PropertyGroup>

Это поведение, когда $(RunAOTCompilation) свойства $(AndroidEnableProfiledAot) не заданы, и выбирает оптимальные параметры для времени запуска и размера приложения.

Чтобы отключить AOT, необходимо явно задать для свойств $(RunAOTCompilation) и $(AndroidEnableProfiledAot) значение false.

<PropertyGroup Condition="'$(Configuration)' == 'Release'">
  <RunAOTCompilation>false</RunAOTCompilation>
  <AndroidEnableProfiledAot>false</AndroidEnableProfiledAot>
</PropertyGroup>

Поддерживаемые кодировки

Если ваше приложение Xamarin.Android использует определенные международные наборы кодов, их следует конкретно указать в файле проекта с помощью свойства MSBuild Mandroidl18n, чтобы компоновщик мог включать вспомогательные ресурсы. Дополнительные сведения об этом свойстве сборки см. в разделе MAndroidl18n.

Mandroidl18n Однако свойство MSBuild не поддерживается в .NET для приложений Android. Вместо этого поддержка предоставляется пакетом NuGet System.TextEncoding.CodePages . Дополнительные сведения см. в разделе CodePagesEncodingProvider.

Интерфейс командной строки .NET

.NET для Android поддерживает использование интерфейса командной строки .NET (.NET CLI) для создания, сборки, публикации и запуска приложений Android.

dotnet new

dotnet new можно использовать для создания новых проектов и элементов .NET для Android с помощью шаблонов проектов и элементов, которые следуют моделям и именованию существующих шаблонов .NET.

Шаблон Короткое имя Язык Теги
Шаблон активности Android android-activity C# Android
Привязка библиотеки Java для Android android-bindinglib C# Android
Шаблон макета Android android-layout C# Android
Библиотека классов Android androidlib C# Android
Приложение Android Android C# Android

В следующих примерах показано использование dotnet new для создания различных типов проектов .NET для Android.

dotnet new android            --output MyAndroidApp     --packageName com.mycompany.myandroidapp
dotnet new androidlib         --output MyAndroidLibrary
dotnet new android-bindinglib --output MyJavaBinding

После создания проектов .NET для Android шаблоны элементов можно использовать для добавления элементов в проекты:

dotnet new android-activity --name LoginActivity --namespace MyAndroidApp
dotnet new android-layout   --name MyLayout      --output Resources/layout

dotnet build и publish

Для .NET для Android dotnet build создаёт работоспособное приложение. Это означает создание файлов .apk или .aab во время процесса сборки и перестановку операций MSBuild из SDK .NET так, чтобы они выполнялись во время сборки. Поэтому .NET для Android выполняет следующие действия во время сборки:

  • Запустите aapt, чтобы сгенерировать Resource.designer.cs и возможно вызвать ошибки сборки для проблем в файлах @(AndroidResource).
  • Компиляция кода C#.
  • Запустите целевой объект ILLink MSBuild для связывания.
  • Генерировать заглушки java и AndroidManifest.xml.
  • Скомпилируйте код java с помощью javac.
  • Преобразуйте код Java в .dex с помощью d8/r8.
  • Создайте .apk или .aab и подпишите его.

dotnet publish зарезервировано для публикации приложения для Google Play и других механизмов распространения, таких как ad-hoc. Он также подписывает .apk или .aab разными ключами.

Примечание.

Поведение внутри idEs будет отличаться. Если целевой Build.apk объект не создает файл $(BuildingInsideVisualStudio)true. IDE вызовет цель Install для развертывания, которая создаст файл .apk. Это поведение соответствует Xamarin.Android.

dotnet run - команда для запуска приложения

dotnet run можно использовать для запуска приложений на устройстве или эмуляторе с помощью аргумента --project :

dotnet run --project HelloAndroid.csproj

Кроме того, можно использовать целевой Run объект MSBuild:

dotnet build HelloAndroid.csproj -t:Run

См. также