Xamarin.Android-Projekt-Migration
Ein .NET 8-Projekt für eine .NET für Android-App ähnelt dem folgenden Beispiel:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0-android</TargetFramework>
<OutputType>Exe</OutputType>
</PropertyGroup>
</Project>
Für ein Bibliotheksprojekt lassen Sie die Eigenschaft $(OutputType)
ganz weg oder geben Sie Library
als Eigenschaftswert an.
.NET-Konfigurationsdateien
Konfigurationsdateien wie Foo.dll.config
oder Foo.exe.config
werden in .NET für Android-Projekten nicht unterstützt.
<dllmap>
Konfigurationselemente werden in .NET Core überhaupt nicht unterstützt, und andere Elementtypen für Kompatibilitätspakete wie System.Configuration.ConfigurationManager wurden in Android-Projekten nie unterstützt.
Änderungen an MSBuild-Eigenschaften
Die Eigenschaft $(AndroidSupportedAbis)
sollte nicht verwendet werden:
<PropertyGroup>
<!-- Used in Xamarin.Android projects -->
<AndroidSupportedAbis>armeabi-v7a;arm64-v8a;x86;x86_64</AndroidSupportedAbis>
</PropertyGroup>
Stattdessen sollte die Eigenschaft $(AndroidSupportedAbis)
durch .NET-Laufzeitbezeichner ersetzt werden:
<PropertyGroup>
<!-- Used in .NET for Android projects -->
<RuntimeIdentifiers>android-arm;android-arm64;android-x86;android-x64</RuntimeIdentifiers>
</PropertyGroup>
Weitere Informationen zu Laufzeitbezeichnern finden Sie unter .NET RID Catalog.
In der folgenden Tabelle sind andere MSBuild-Eigenschaften aufgeführt, die in .NET für Android geändert wurden:
Eigenschaft | Kommentare |
---|---|
$(AndroidUseIntermediateDesignerFile) |
True standardmäßig. |
$(AndroidBoundExceptionType) |
System standardmäßig. Diese Eigenschaft ändert die Arten von Ausnahmen, die von verschiedenen Methoden ausgelöst werden, um eine bessere Anpassung an die .NET-Semantik zu erreichen, was auf Kosten der Kompatibilität mit Xamarin.Android geht. Weitere Informationen finden Sie unter Einige der neuen umhüllten Java-Ausnahmen verwenden BCL-Ausnahmen, die sich von den entsprechenden BCL-Typen unterscheiden. |
$(AndroidClassParser) |
class-parse standardmäßig.
jar2xml wird nicht unterstützt. |
$(AndroidDexTool) |
d8 standardmäßig.
dx wird nicht unterstützt. |
$(AndroidCodegenTarget) |
XAJavaInterop1 standardmäßig.
XamarinAndroid wird nicht unterstützt. |
$(AndroidManifest) |
Standardmäßig wird AndroidManifest.xml im Stammverzeichnis von Projekten verwendet, da Properties\AssemblyInfo.cs in SDK-Projekten nicht mehr verwendet wird.
Properties\AndroidManifest.xml wird ebenfalls erkannt und verwendet, wenn es vorhanden ist, um die Migration zu erleichtern. |
$(DebugType) |
portable standardmäßig.
full und pdbonly werden nicht unterstützt. |
$(MonoSymbolArchive) |
False , da mono-symbolicate nicht unterstützt wird. |
Wenn außerdem die Java-Bindung mit @(InputJar)
, @(EmbeddedJar)
oder @(LibraryProjectZip)
aktiviert ist, wird die Eigenschaft $(AllowUnsafeBlocks)
standardmäßig auf True
gesetzt.
Hinweis
Das Referenzieren eines Android Wear-Projekts aus einer Android-App wird nicht unterstützt.
Änderungen an AndroidManifest.xml
In Xamarin.Android-, Java- und Kotlin-Android-Projekten gibt das <uses-sdk/>
-Element die minimale Android-Version an, die Ihre App unterstützt, sowie die Android-Zielversion, gegen die Ihre App kompiliert wird:
<?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>
Weitere Informationen über das <uses-sdk/>
-Element finden Sie in der Android-Dokumentation.
In .NET 8 Android-Apps gibt es MSBuild-Eigenschaften, um diese Werte festzulegen. Die Verwendung der MSBuild-Eigenschaften hat weitere Vorteile. In den meisten Fällen sollte das <uses-sdk/>
-Element zugunsten von Werten in der .csproj
-Datei Ihres Projekts entfernt werden:
<Project>
<PropertyGroup>
<TargetFramework>net8.0-android</TargetFramework>
<SupportedOSPlatformVersion>21</SupportedOSPlatformVersion>
</PropertyGroup>
</Project>
In diesem Beispiel ist net8.0-android
die Kurzform für net8.0-android34.0
. Künftige Versionen von .NET werden die neueste Android-Version verfolgen, die zum Zeitpunkt der .NET-Veröffentlichung verfügbar ist.
TargetFramework
wird android:targetSdkVersion
zugeordnet. Zum Zeitpunkt der Erstellung wird dieser Wert automatisch in das <uses-sdk/>
-Element aufgenommen. Der Vorteil der Verwendung von TargetFramework
auf diese Weise ist, dass Sie die passende C#-Bindung für Android API 34 für net8.0-android34.0
erhalten. Android wird unabhängig vom .NET-Release-Zyklus veröffentlicht, sodass wir die Flexibilität haben, uns für net8.0-android35.0
zu entscheiden, wenn eine Bindung für die nächste Android-Version verfügbar ist.
In ähnlicher Weise wird SupportedOSPlatformVersion
auf android:minSdkVersion
abgebildet. Zum Zeitpunkt der Erstellung wird dieser Wert automatisch in das <uses-sdk/>
-Element aufgenommen. Android-APIs werden mit SupportedOSPlatformAttribute dekoriert, sodass Sie Build-Warnungen für den Aufruf von APIs erhalten, die nur für einige der Android-Versionen verfügbar sind, auf denen Ihre App laufen kann:
error CA1416: This call site is reachable on 'Android' 21.0 and later. `ConnectivityManager.ActiveNetwork` is only supported on: 'Android' 23.0 and later.
Um diese API sicher zu verwenden, können Sie eine höhere SupportedOSPlatformVersion
in Ihrem Projekt deklarieren oder die IsAndroidVersionAtLeast API zur Laufzeit verwenden:
if (OperatingSystem.IsAndroidVersionAtLeast(23))
{
// Use the API here
}
Standardmäßiger Dateieinschluss
Das standardmäßige Globbingverhalten von .NET für Android-Dateien wird in AutoImport.props
definiert. Dieses Verhalten kann für Android-Elemente deaktiviert werden, indem $(EnableDefaultAndroidItems)
auf false
festgelegt wird. Alternativ kann das gesamte standardmäßige Einschlussverhalten von Elementen deaktiviert werden, indem $(EnableDefaultItems)
auf false
festgelegt wird. Weitere Informationen finden Sie unter Workload Props-Dateien.
Laufzeitverhalten
In .NET 5+ gibt es auf verschiedenen Plattformen Änderungen im Verhalten der String.IndexOf()
-Methode. Weitere Informationen finden Sie unter .NET-Globalisierung und ICU.
Linker
.NET 8 verfügt über neue Einstellungen für den Linker:
<PublishTrimmed>true</PublishTrimmed>
-
<TrimMode>partial</TrimMode>
, das Assemblys kürzt, die für die Kürzung angemeldet wurden.
Weitere Informationen finden Sie unter Kürzungsoptionen.
In .NET für Android-Projekten verwenden Debug
-Builds standardmäßig nicht den Linker, und Release
-Builds legen PublishTrimmed=true
und TrimMode=partial
fest.
Wenn die Legacyeinstellung AndroidLinkMode
verwendet wird, werden sowohl SdkOnly
als auch Full
auf äquivalente Linker-Einstellungen gesetzt:
<PublishTrimmed>true</PublishTrimmed>
<TrimMode>partial</TrimMode>
Mit AndroidLinkMode=SdkOnly
werden nur BCL- und SDK-Assemblies, die mit %(Trimmable)
markiert sind, auf Memberebene verknüpft.
AndroidLinkMode=Full
setzt %(TrimMode)=partial
auf alle .NET-Assemblys.
Tipp
Es wird empfohlen, auf die neuen Linker-Einstellungen umzusteigen, da die Einstellung AndroidLinkMode
irgendwann veraltet sein wird.
.NET 9 verfügt über neue Einstellungen für den Linker:
-
<TrimMode>Full</TrimMode>
, das die vollständige Kürzung ausführt.
Weitere Informationen finden Sie unter Kürzungsoptionen.
In .NET für Android-Projekten verwenden Debug
-Builds standardmäßig nicht den Linker, und Release
-Builds legen PublishTrimmed=true
und TrimMode=partial
fest.
Ahead-of-time-Kompilierung
Bei $(RunAOTCompilation)
handelt es sich um die neue MSBuild-Eigenschaft zur Aktivierung der Ahead-of-Time (AoT)-Kompilierung. Dies ist die gleiche Eigenschaft, die für Blazor WASM verwendet wird. Die $(AotAssemblies)
-Eigenschaft ermöglicht außerdem AOT, um die Migration von Xamarin.Android-Projekten zu .NET für Android-Projekten zu unterstützen. Diese Eigenschaft wurde jedoch in .NET 7 als veraltet markiert.
Die Release-Builds enthalten standardmäßig die folgenden AOT-Eigenschaftswerte:
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
<RunAOTCompilation>true</RunAOTCompilation>
<AndroidEnableProfiledAot>true</AndroidEnableProfiledAot>
</PropertyGroup>
Bei diesem Verhalten werden die $(RunAOTCompilation)
- und $(AndroidEnableProfiledAot)
-Eigenschaften gelöscht und die optimalen Einstellungen für Startzeit und App-Größe ausgewählt.
Um AOT zu deaktivieren, müssen Sie die $(RunAOTCompilation)
- und $(AndroidEnableProfiledAot)
-Eigenschaften explizit auf false
festlegen:
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
<RunAOTCompilation>false</RunAOTCompilation>
<AndroidEnableProfiledAot>false</AndroidEnableProfiledAot>
</PropertyGroup>
Unterstützte Codierungen
Wenn Ihre Xamarin.Android-App bestimmte internationale Codesets verwendet, müssen diese explizit in Ihrer Projektdatei mit der MSBuild-Eigenschaft Mandroidl18n
angegeben werden, damit der Linker die unterstützenden Ressourcen einbeziehen kann. Weitere Informationen zu dieser Build-Eigenschaft finden Sie unter MAndroidl18n.
Die MSBuild-Eigenschaft Mandroidl18n
wird jedoch in .NET für Android-Apps nicht unterstützt. Sie wird stattdessen vom NuGet-Paket System.TextEncoding.CodePages unterstützt. Weitere Informationen finden Sie unter CodePagesEncodingProvider.
.NET CLI
.NET für Android unterstützt die Verwendung der .NET-Befehlszeilenschnittstelle (.NET CLI) zum Erstellen, Erstellen, Veröffentlichen und Ausführen von Android-Apps.
dotnet new
dotnet new
kann verwendet werden, um neue .NET für Android-Projekte und -Elemente mithilfe von Projektvorlagen und Elementvorlagen zu erstellen, die gemäß den Mustern und der Benennung vorhandener .NET-Vorlagen benannt sind:
Vorlage | Kurzname | Sprache | Tags |
---|---|---|---|
Android-Aktivitätsvorlage | android-activity | C# | Android |
Android Java-Bibliotheksbindung | android-bindinglib | C# | Android |
Android-Layoutvorlage | android-layout | C# | Android |
Android-Klassenbibliothek | androidlib | C# | Android |
Android-App | Android | C# | Android |
Die folgenden Beispiele zeigen die Verwendung von dotnet new
zum Erstellen verschiedener .NET für Android-Projekte:
dotnet new android --output MyAndroidApp --packageName com.mycompany.myandroidapp
dotnet new androidlib --output MyAndroidLibrary
dotnet new android-bindinglib --output MyJavaBinding
Nachdem .NET für Android-Projekte erstellt wurden, können Elementvorlagen zum Hinzufügen von Elementen zu den Projekten verwendet werden:
dotnet new android-activity --name LoginActivity --namespace MyAndroidApp
dotnet new android-layout --name MyLayout --output Resources/layout
dotnet build & publish
Für .NET für Android erstellt dotnet build
eine ausführbare App. Dies bedeutet die Erstellung einer .apk
- oder .aab
-Datei während des Buildprozesses und die Anordnung von MSBuild-Aufgaben aus dem .NET SDK, sodass diese während des Builds ausgeführt werden. Daher führt .NET für Android während eines Builds die folgenden Aktionen aus:
- Ausführen von
aapt
, umResource.designer.cs
zu generieren und potenzielle Buildfehler und Probleme in@(AndroidResource)
-Dateien auszugeben. - Kompilieren von C#-Code
- Führen Sie das MSBuild-Ziel ILLink zum Linken aus.
- Generieren Sie Java-Stubs und
AndroidManifest.xml
. - Kompilieren Sie Java-Code über
javac
. - Konvertieren Sie Java-Code über d8/r8 in
.dex
. - Erstellen Sie
.apk
oder.aab
und signieren Sie es.
dotnet publish
ist für die Veröffentlichung einer App für Google Play und andere Vertriebsmechanismen wie Ad-hoc reserviert. Es signiert auch die .apk
oder .aab
mit verschiedenen Schlüsseln.
Hinweis
Das Verhalten innerhalb von IDEs wird sich unterscheiden. Das Build
-Ziel wird keine .apk
-Datei erzeugen, wenn $(BuildingInsideVisualStudio)
true
ist. IDEs rufen das Install
-Ziel für die Bereitstellung auf, was die .apk
-Datei erzeugt. Dieses Verhalten entspricht Xamarin.Android.
dotnet run
dotnet run
kann verwendet werden, um Apps auf einem Gerät oder Emulator über das Argument --project
zu starten:
dotnet run --project HelloAndroid.csproj
Alternativ können Sie auch das MSBuild-Ziel Run
verwenden:
dotnet build HelloAndroid.csproj -t:Run