Sdílet prostřednictvím


Migrace projektu Xamarin.Android

Projekt .NET 8 pro aplikaci .NET pro Android je podobný následujícímu příkladu:

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

Pro projekt $(OutputType) knihovny vynecháte vlastnost zcela nebo zadejte Library jako hodnotu vlastnosti.

Konfigurační soubory .NET

Konfigurační soubory, jako Foo.dll.config jsou nebo Foo.exe.config v .NET pro projekty Android, nejsou podporované. <dllmap> Elementy konfigurace se v .NET Core vůbec nepodporují a jiné typy prvků pro balíčky kompatibility, jako je System.Configuration.ConfigurationManager , se v projektech Androidu nikdy nepodporují.

Změny vlastností nástroje MSBuild

Vlastnost $(AndroidSupportedAbis) by neměla být použita:

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

$(AndroidSupportedAbis) Místo toho by se vlastnost měla nahradit identifikátory modulu runtime .NET:

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

Další informace o identifikátorech modulu runtime naleznete v tématu Katalog identifikátorů RID technologie .NET.

Následující tabulka ukazuje další vlastnosti nástroje MSBuild, které se změnily v .NET pro Android:

Vlastnost Komentáře
$(AndroidUseIntermediateDesignerFile) True ve výchozím nastavení.
$(AndroidBoundExceptionType) System ve výchozím nastavení. Tato vlastnost mění typy výjimek vyvolaných z různých metod, aby lépe odpovídaly sémantice .NET za cenu kompatibility s Xamarin.Android. Další informace naleznete v části Některé nové zabalené výjimky Java používají výjimky seznamu BCL, které se liší od souvisejících typů seznamů BCL.
$(AndroidClassParser) class-parse ve výchozím nastavení. jar2xml není podporováno.
$(AndroidDexTool) d8 ve výchozím nastavení. dx není podporováno.
$(AndroidCodegenTarget) XAJavaInterop1 ve výchozím nastavení. XamarinAndroid není podporováno.
$(AndroidManifest) Výchozí hodnota AndroidManifest.xml je v kořenovém adresáři projektů, protože Properties\AssemblyInfo.cs se už nepoužívá v projektech ve stylu sady SDK. Properties\AndroidManifest.xml bude také zjištěna a použita, pokud existuje, aby se usnadnila migrace.
$(DebugType) portable ve výchozím nastavení. full a pdbonly nejsou podporovány.
$(MonoSymbolArchive) False, protože mono-symbolicate se nepodporuje.

Kromě toho, pokud je povolena java vazba s @(InputJar), @(EmbeddedJar)nebo @(LibraryProjectZip), pak $(AllowUnsafeBlocks) vlastnost výchozí Truehodnotu .

Poznámka:

Odkazování na projekt Android Wear z aplikace pro Android se nepodporuje.

Změny v AndroidManifest.xml

V projektech <uses-sdk/> Xamarin.Android, Java a Kotlin Pro Android označuje prvek minimální verzi Androidu, jakou vaše aplikace podporuje, a také cílovou verzi Androidu, na které je vaše aplikace zkompilovaná:

<?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>

Další informace o tomto <uses-sdk/> prvku najdete v dokumentaci k Androidu.

V aplikacích pro Android .NET 8 jsou k dispozici vlastnosti NÁSTROJE MSBuild, které tyto hodnoty nastaví. Použití vlastností NÁSTROJE MSBuild má další výhody. Ve většině případů <uses-sdk/> by měl být prvek odebrán ve prospěch hodnot v souboru projektu .csproj :

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

V tomto příkladu net8.0-android je zkratka pro net8.0-android34.0. Budoucí verze .NET budou sledovat nejnovější verzi Androidu dostupnou v době vydání .NET.

TargetFramework mapuje na android:targetSdkVersion. V době sestavení se tato hodnota automaticky zahrne do elementu <uses-sdk/> za vás. Výhodou použití TargetFramework tímto způsobem je, že máte odpovídající vazbu jazyka C# pro rozhraní ANDROID API 34 pro net8.0-android34.0. Verze Androidu nezávisle na cyklu vydávání verzí .NET, takže máme možnost rozhodnout net8.0-android35.0 se, kdy je pro příští verzi Androidu k dispozici vazba.

Podobně se SupportedOSPlatformVersion mapuje na android:minSdkVersion. V době sestavení se tato hodnota automaticky zahrne do elementu <uses-sdk/> za vás. Rozhraní API pro Android jsou vyzdobena upozorněními SupportedOSPlatformAttribute na sestavení pro volání rozhraní API, která jsou k dispozici pouze pro některé verze Androidu, na kterých může vaše aplikace běžet:

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

Pokud chcete toto rozhraní API bezpečně používat, můžete deklarovat ve svém projektu vyšší SupportedOSPlatformVersion úroveň nebo použít IsAndroidVersionAtLeast rozhraní API za běhu:

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

Výchozí zahrnutí souborů

Výchozí chování .NET pro Android související s souborem globbing je definováno v AutoImport.props. Toto chování lze pro položky Androidu zakázat nastavením $(EnableDefaultAndroidItems) na falsehodnotu , nebo je možné zakázat chování zahrnutí všech výchozích položek nastavením na falsehodnotu $(EnableDefaultItems) . Další informace najdete v tématu Soubory props úloh.

Chování modulu runtime

V rozhraní .NET 5 nebo novějších na různých platformách dochází ke String.IndexOf() změnám chování metody. Další informace najdete v tématu globalizace .NET a ICU.

Linker

.NET 5+ má nová nastavení linkeru:

  • <PublishTrimmed>true</PublishTrimmed>
  • <TrimMode>link</TrimMode>, což umožňuje oříznutí na úrovni člena.

Další informace najdete v tématu Možnosti oříznutí.

V projektech .NET pro Android ve výchozím nastavení Debug buildy nepoužívají linker a Release sady PublishTrimmed=true sestavení a TrimMode=link. TrimMode=copyused je výchozí pro sadu .NET SDK, ale není vhodná pro mobilní aplikace. V případě potřeby se ale můžete přihlásit TrimMode=copyused .

Pokud se použije starší AndroidLinkMode verze nastavení, nastavení SdkOnly i Full výchozí nastavení ekvivalentního linkeru:

  • <PublishTrimmed>true</PublishTrimmed>
  • <TrimMode>link</TrimMode>

Pouze AndroidLinkMode=SdkOnlysestavení BCL a SDK označená %(Trimmable) pomocí jsou propojena na úrovni člena. AndroidLinkMode=Full nastaví %(TrimMode)=link pro všechna sestavení .NET.

Tip

Měli byste migrovat na nová nastavení linkeru AndroidLinkMode , protože nastavení bude nakonec zastaralé.

Kompilace s předstihem

$(RunAOTCompilation) je nová vlastnost MSBuild pro povolení kompilace AoT (Head-of-Time). Jedná se o stejnou vlastnost, která se používá pro Blazor WASM. Tato $(AotAssemblies) vlastnost také umožňuje AOT, aby pomohla s migrací z projektů Xamarin.Android na .NET pro projekty Android. Tato vlastnost však byla v .NET 7 zastaralá.

Ve výchozím nastavení se sestavení vydané verze nastaví na následující hodnoty vlastností AOT:

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

Jedná se o chování při $(RunAOTCompilation) zrušení nastavení a $(AndroidEnableProfiledAot) vlastnosti a zvolí optimální nastavení pro čas spuštění a velikost aplikace.

Pokud chcete AOT zakázat, musíte explicitně nastavit $(RunAOTCompilation) vlastnosti a $(AndroidEnableProfiledAot) vlastnosti na false:

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

Podporované kódování

Pokud vaše aplikace Xamarin.Android používá určité mezinárodní sady kódů, je nutné je explicitně zadat v souboru projektu pomocí Mandroidl18n vlastnosti MSBuild, aby linker mohl zahrnovat podpůrné prostředky. Další informace o této vlastnosti sestavení naleznete v tématu MAndroidl18n.

Mandroidl18n Vlastnost MSBuild se ale v aplikacích pro Android nepodporuje. Místo toho je podpora poskytována balíčkem NuGet System.TextEncoding.CodePages . Další informace najdete na webu CodePagesEncodingProvider.

.NET CLI

.NET pro Android podporuje použití rozhraní příkazového řádku .NET (.NET CLI) k vytváření, sestavování, publikování a spouštění aplikací pro Android.

dotnet new

dotnet new lze použít k vytvoření nových projektů a položek .NET pro Android pomocí šablon projektů a šablon položek, které jsou pojmenované podle vzorů a pojmenování existujících šablon .NET:

Šablona Krátký název Jazyk Značky
Šablona aktivity androidu android-activity C# Android
Vazba knihovny Android Java android-bindinglib C# Android
Šablona rozložení pro Android android-layout C# Android
Knihovna tříd androidu androidlib C# Android
Aplikace pro Android Android C# Android

Následující příklady ukazují použití dotnet new k vytvoření různých typů .NET pro projekty Android:

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

Po vytvoření projektů .NET pro Android lze šablony položek použít k přidání položek do projektů:

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

dotnet build & publish

Pro .NET pro Android dotnet build vytvoří spustitelnou aplikaci. To znamená vytvoření .apk nebo .aab soubor během procesu sestavení a změna pořadí úloh NÁSTROJE MSBuild ze sady .NET SDK tak, aby se spouštěly během sestavení. Proto .NET pro Android během sestavení provede následující kroky:

  • Spuštěním aapt vygenerujte a potenciálně vygenerujte Resource.designer.cs chyby sestavení pro problémy v @(AndroidResource) souborech.
  • Zkompilujte kód jazyka C#.
  • Spusťte cíl ILLink MSBuild pro propojení.
  • Vygenerujte zástupné procedury Java a AndroidManifest.xml.
  • Zkompilujte kód Java prostřednictvím javac.
  • Převeďte kód Java na .dex adresu d8/r8.
  • .apk Vytvořte nebo .aab ho podepište.

dotnet publish je vyhrazená pro publikování aplikace pro Google Play a další distribuční mechanismy, jako je ad hoc. Také podepíše .apk nebo .aab s různými klíči.

Poznámka:

Chování uvnitř prostředí IDEs se bude lišit. Cíl Build nevygeneruje .apk soubor, pokud $(BuildingInsideVisualStudio) je true. IdEs bude volat Install cíl pro nasazení, který vytvoří .apk soubor. Toto chování odpovídá Xamarin.Androidu.

dotnet run

dotnet run lze použít ke spouštění aplikací na zařízení nebo emulátoru pomocí argumentu --project :

dotnet run --project HelloAndroid.csproj

Alternativně můžete použít Run cíl nástroje MSBuild:

dotnet build HelloAndroid.csproj -t:Run

Viz také