Миграция проекта 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
для параметра значение , или все поведение включения элементов по умолчанию можно отключить, установив для параметра значение .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