Миграция проекта 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 включена с , или @(LibraryProjectZip), свойство $(AllowUnsafeBlocks) по умолчанию используетсяTrue. @(EmbeddedJar)@(InputJar)

Примечание.

Ссылка на проект 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. Дополнительные сведения см. в разделе файлов props рабочей нагрузки.

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

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

Компоновщик

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

  • <PublishTrimmed>true</PublishTrimmed>
  • <TrimMode>partial</TrimMode>, который обрезает сборки, которые решили обрезать.

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

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

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

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

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

Совет

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

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

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

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

По умолчанию Debug в проектах .NET для Android сборки не используют компоновщик и 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 использует определенные международные наборы кодов, их необходимо явно указать в файле проекта с помощью Mandroidl18n свойства MSBuild, чтобы компоновщик может включать вспомогательные ресурсы. Дополнительные сведения об этом свойстве сборки см. в разделе MAndroidl18n.

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

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

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

dotnet new

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

Template Короткое имя Язык Теги
Шаблон действия 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. IdEs вызовет целевой Install объект для развертывания, который создаст .apk файл. Это поведение соответствует Xamarin.Android.

dotnet run

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

dotnet run --project HelloAndroid.csproj

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

dotnet build HelloAndroid.csproj -t:Run

См. также