Veröffentlichen einer Android-App über die Befehlszeile
Um eine .NET Multi-Platform App UI (.NET MAUI) Android-App zu verteilen, müssen Sie sie mit einem Schlüssel aus Ihrem Keystore signieren. Ein Keystore ist eine Datenbank mit Sicherheitszertifikaten, die mit keytool
aus dem Java Development Kit (JDK) erstellt wird. Ein Keystore ist erforderlich, wenn eine .NET MAUI-Android-App veröffentlicht wird, da Android keine Apps ausführt, die nicht signiert wurden.
Erstellen einer neuen Keystore-Datei
Während der Entwicklung verwendet .NET for Android einen Debug-Keystore, um die App zu signieren. Dadurch kann sie direkt auf einem Emulator oder auf Geräten bereitgestellt werden, die für die Ausführung von debuggingfähigen Apps konfiguriert sind. Dieser Keystore wird jedoch nicht als gültiger Schlüsselspeicher für die Zwecke der Verteilung von Apps anerkannt. Daher muss ein privater Keystore erstellt und zum Signaturen von Release-Builds verwendet werden. Dieser Schritt sollte nur einmal durchgeführt werden, da derselbe Schlüssel für die Veröffentlichung von Updates verwendet wird und zum Signaturen anderer Apps genutzt werden kann. Nachdem Sie eine Keystore-Datei erstellt haben, geben Sie deren Details beim Erstellen der App über die Befehlszeile ein oder konfigurieren Ihre Projektdatei so, dass sie darauf verweist.
Führen Sie die folgenden Schritte aus, um eine Keystore-Datei zu erstellen:
Öffnen Sie ein Terminal und navigieren Sie zu dem Ordner, in dem sich Ihr Projekt befindet.
Tipp
Wenn Visual Studio geöffnet ist, verwenden Sie das Menü Ansicht>Terminal, um ein Terminal an dem Ort zu öffnen, an dem sich die Projektmappe oder das Projekt befindet. Navigieren Sie zum Projektordner.
Führen Sie das Tool Keytool mit den folgenden Parametern aus:
keytool -genkeypair -v -keystore {filename}.keystore -alias {keyname} -keyalg RSA -keysize 2048 -validity 10000
Wichtig
Wenn Sie mehrere Versionen des JDK auf Ihrem Computer installiert haben, stellen Sie sicher, dass Sie
keytool
mit der neuesten Version des JDK ausführen.Sie werden aufgefordert, ein Kennwort einzugeben und zu bestätigen, gefolgt von Ihrem vollständigen Namen, der Organisationseinheit, der Organisation, der Stadt oder dem Ort, dem Bundesland oder der Provinz und dem Ländercode. Diese Informationen werden nicht in Ihrer App angezeigt, sondern sind in Ihrem Zertifikat enthalten.
Um beispielsweise eine Datei myapp.keystore im gleichen Ordner wie Ihr Projekt mit dem Alias
myapp
zu erzeugen, verwenden Sie den folgenden Befehl:keytool -genkeypair -v -keystore myapp.keystore -alias myapp -keyalg RSA -keysize 2048 -validity 10000
Tipp
Sichern Sie Ihren Keystore und Ihr Kennwort. Wenn Sie sie verlieren, können Sie Ihre App nicht mit derselben Signaturkennung signieren.
Finden der Signatur Ihres Keystores
Um die in einem Keystore gespeicherten Schlüssel aufzulisten, verwenden Sie keytool
mit der Option -list
:
keytool -list -keystore {filename}.keystore
Um zum Beispiel die Schlüssel in einem Keystore mit dem Namen myapp.keystore aufzulisten, verwenden Sie den folgenden Befehl:
keytool -list -keystore myapp.keystore
Erstellen und signieren Sie Ihre App
Um Ihre App von der Befehlszeile aus zu erstellen und sie mit Ihrem Keystore zu signieren, öffnen Sie ein Terminal und navigieren Sie zum Ordner Ihres .NET MAUI-Appsprojekts. Führen Sie den Befehl dotnet publish
mit den folgenden Parametern aus:
Parameter | Wert |
---|---|
-f oder --framework |
Das Zielframework ist net8.0-android . |
-c oder --configuration |
Die Buildkonfiguration ist Release . |
Warnung
Der Versuch, eine .NET MAUI-Lösung zu veröffentlichen, führt dazu, dass der Befehl dotnet publish
versucht, jedes Projekt in der Lösung einzeln zu veröffentlichen, was zu Problemen führen kann, wenn Sie andere Projekttypen zu Ihrer Lösung hinzugefügt haben. Daher sollte der Befehl dotnet publish
auf Ihr .NET MAUI-Appsprojekt beschränkt sein.
Zusätzliche Build-Parameter können auf der Kommandozeile angegeben werden, wenn sie nicht in einer <PropertyGroup>
in Ihrer Projektdatei enthalten sind. In der folgenden Tabelle sind einige der üblichen Parameter aufgeführt:
Parameter | Wert |
---|---|
-p:ApplicationTitle |
Der vom Benutzer sichtbare Name für die App. |
-p:ApplicationId |
Der eindeutige Bezeichner für die App, wie etwa com.companyname.mymauiapp . |
-p:ApplicationVersion |
Die Version des Builds, die eine Iteration der App identifiziert. |
-p:ApplicationDisplayVersion |
Die Versionsnummer der API. |
-p:AndroidKeyStore |
Ein boolescher Wert, der angibt, ob die App signiert werden soll. Der Standardwert ist false . |
-p:AndroidPackageFormats |
Eine durch ein Semikolon getrennte Eigenschaft, die angibt, ob Sie die App als APK-Datei oder als AAB verpacken möchten. Entweder auf aab oder apk setzen, um nur ein Format zu erzeugen. Der Standardwert für Release-Builds ist aab;apk . |
-p:AndroidSigningKeyAlias |
Der Alias für den Schlüssel im Keystore. Dies ist der keytool -alias -Wert, der bei der Erstellung des Keystores verwendet wird. |
-p:AndroidSigningKeyPass |
Das Kennwort des Schlüssels in der Keystore-Datei. Dies ist der Wert, der bei der Erstellung der Keystore-Datei für keytool angegeben wurde, und Sie werden aufgefordert, das Keystore-Kennwort einzugeben. Dies liegt daran, dass der Standard-Keystoretyp davon ausgeht, dass das Schlüsselkennwort und das Keystore-Kennwort identisch sind. Diese Eigenschaft unterstützt auch die Präfixe env: und file: , die verwendet werden können, um eine Umgebungsvariable oder eine Datei anzugeben, die das Kennwort enthält. Diese Optionen bieten eine Möglichkeit, zu verhindern, dass das Kennwort in Buildprotokollen auftaucht. |
-p:AndroidSigningKeyStore |
Der Dateiname der von keytool erstellten Keystore-Datei. Dies ist der keytool -keystore -Wert, der bei der Erstellung des Keystores verwendet wird. |
-p:AndroidSigningStorePass |
Das Kennwort für die Keystore-Datei. Dies ist der Wert, der bei der Erstellung der Keystore-Datei für keytool angegeben wurde, und Sie werden aufgefordert, das Keystore-Kennwort einzugeben. Dies liegt daran, dass der Standard-Keystoretyp davon ausgeht, dass das Kennwort des Keystores und das Schlüsselkennwort identisch sind. Diese Eigenschaft unterstützt auch die Präfixe env: und file: , die verwendet werden können, um eine Umgebungsvariable oder eine Datei anzugeben, die das Kennwort enthält. Diese Optionen bieten eine Möglichkeit, zu verhindern, dass das Kennwort in Buildprotokollen auftaucht. |
-p:PublishTrimmed |
Ein boolescher Wert, der angibt, ob die App getrimmt werden soll. Der Standardwert ist true für Release-Builds. |
Sie sollten dasselbe Kennwort verwenden wie die Werte der Parameter AndroidSigningKeyPass
und AndroidSigningStorePass
.
Für eine vollständige Liste der Build-Eigenschaften siehe Build-Eigenschaften.
Wichtig
Die Werte für diese Parameter müssen nicht in der Befehlszeile angegeben werden. Sie können auch in der Projektdatei angegeben werden. Wenn ein Parameter in der Befehlszeile und in der Projektdatei angegeben ist, hat der Befehlszeilenparameter Vorrang. Weitere Informationen über die Bereitstellung von Build-Eigenschaften in Ihrer Projektdatei finden Sie unter Build-Eigenschaften in Ihrer Projektdatei definieren.
Führen Sie den Befehl dotnet publish
mit den folgenden Parametern aus, um Ihre App zu erstellen und zu signieren:
dotnet publish -f net8.0-android -c Release -p:AndroidKeyStore=true -p:AndroidSigningKeyStore={filename}.keystore -p:AndroidSigningKeyAlias={keyname} -p:AndroidSigningKeyPass={password} -p:AndroidSigningStorePass={password}
Hinweis
In .NET 8 wird für den Befehl dotnet publish
standardmäßig die Konfiguration Release
verwendet. Daher kann die Buildkonfiguration von der Befehlszeile weggelassen werden.
Verwenden Sie beispielsweise den folgenden Befehl, um Ihre App zu erstellen und zu signieren, indem Sie den zuvor erstellten Keystore verwenden:
dotnet publish -f net8.0-android -c Release -p:AndroidKeyStore=true -p:AndroidSigningKeyStore=myapp.keystore -p:AndroidSigningKeyAlias=myapp -p:AndroidSigningKeyPass=mypassword -p:AndroidSigningStorePass=mypassword
Sowohl die AndroidSigningKeyPass
- als auch die AndroidSigningStorePass
-Eigenschaften unterstützen die Präfixe env:
und file:
, mit denen eine Umgebungsvariable oder eine Datei angegeben werden kann, die das Kennwort enthält. Die Angabe des Kennworts auf diese Weise verhindert, dass es in den Build-Protokollen auftaucht. Zum Beispiel, um eine Umgebungsvariable mit dem Namen AndroidSigningPassword
zu verwenden:
dotnet publish -f net8.0-android -c Release -p:AndroidKeyStore=true -p:AndroidSigningKeyStore=myapp.keystore -p:AndroidSigningKeyAlias=myapp -p:AndroidSigningKeyPass=env:AndroidSigningPassword -p:AndroidSigningStorePass=env:AndroidSigningPassword
Wichtig
Das Präfix env: wird nicht unterstützt, wenn $(AndroidPackageFormat)
auf aab
gesetzt ist.
Um eine Datei zu verwenden, die sich unter C:\Users\user1\AndroidSigningPassword.txt befindet:
dotnet publish -f net8.0-android -c Release -p:AndroidKeyStore=true -p:AndroidSigningKeyStore=myapp.keystore -p:AndroidSigningKeyAlias=myapp -p:AndroidSigningKeyPass=file:C:\Users\user1\AndroidSigningPassword.txt -p:AndroidSigningStorePass=file:C:\Users\user1\AndroidSigningPassword.txt
Bei der Veröffentlichung wird die App erstellt und signiert, und die AAB- und APK-Dateien werden in den Ordner bin\Release\net8.0-android\publish kopiert. Es gibt zwei AAB-Dateien – eine unsignierte und eine signierte. Die signierte Variante hat -signed im Dateinamen.
Weitere Informationen über den Befehl dotnet publish
finden Sie unter dotnet publish.
Hinweis
Bei Android-Apps kann dotnet build
auch zum Erstellen und Signieren Ihrer App verwendet werden. AAB- und APK-Dateien werden jedoch im Ordner bin\Release\net8.0-android und nicht im Unterordner publish erstellt. Standardmäßig wird auch für dotnet build
eine Debug
-Konfiguration verwendet, deshalb ist der -c
-Parameter zur Angabe der Release
-Konfiguration erforderlich.
Definieren von Build-Eigenschaften in Ihrer Projektdatei
Eine Alternative zur Angabe von Build-Parametern auf der Befehlszeile besteht darin, sie in Ihrer Projektdatei in einem <PropertyGroup>
anzugeben. In der folgenden Tabelle sind einige der üblichen Build-Eigenschaften aufgeführt:
Eigenschaft | Wert |
---|---|
<ApplicationTitle> |
Der vom Benutzer sichtbare Name für die App. |
<ApplicationId> |
Der eindeutige Bezeichner für die App, wie etwa com.companyname.mymauiapp . |
<ApplicationVersion> |
Die Version des Builds, die eine Iteration der App identifiziert. |
<ApplicationDisplayVersion> |
Die Versionsnummer der API. |
<AndroidKeyStore> |
Ein boolescher Wert, der angibt, ob die App signiert werden soll. Der Standardwert ist false . |
<AndroidPackageFormats> |
Eine durch ein Semikolon getrennte Eigenschaft, die angibt, ob Sie die App als APK-Datei oder als AAB verpacken möchten. Entweder auf aab oder apk setzen, um nur ein Format zu erzeugen. Der Standardwert für Release-Builds ist aab;apk . |
<AndroidSigningKeyAlias> |
Der Alias für den Schlüssel im Keystore. Dies ist der keytool -alias -Wert, der bei der Erstellung des Keystores verwendet wird. |
<AndroidSigningKeyPass> |
Das Kennwort des Schlüssels in der Keystore-Datei. Dies ist der Wert, der bei der Erstellung der Keystore-Datei für keytool angegeben wurde, und Sie werden aufgefordert, das Keystore-Kennwort einzugeben. Dies liegt daran, dass der Standard-Keystoretyp davon ausgeht, dass das Schlüsselkennwort und das Keystore-Kennwort identisch sind. Diese Eigenschaft unterstützt auch die Präfixe env: und file: , die verwendet werden können, um eine Umgebungsvariable oder eine Datei anzugeben, die das Kennwort enthält. Diese Optionen bieten eine Möglichkeit, zu verhindern, dass das Kennwort in Buildprotokollen auftaucht. |
<AndroidSigningKeyStore> |
Der Dateiname der von keytool erstellten Keystore-Datei. Dies ist der keytool -keystore -Wert, der bei der Erstellung des Keystores verwendet wird. |
<AndroidSigningStorePass> |
Das Kennwort für die Keystore-Datei. Dies ist der Wert, der bei der Erstellung der Keystore-Datei für keytool angegeben wurde, und Sie werden aufgefordert, das Keystore-Kennwort einzugeben. Dies liegt daran, dass der Standard-Keystoretyp davon ausgeht, dass das Kennwort des Keystores und das Schlüsselkennwort identisch sind. Diese Eigenschaft unterstützt auch die Präfixe env: und file: , die verwendet werden können, um eine Umgebungsvariable oder eine Datei anzugeben, die das Kennwort enthält. Diese Optionen bieten eine Möglichkeit, zu verhindern, dass das Kennwort in Buildprotokollen auftaucht. |
<PublishTrimmed> |
Ein boolescher Wert, der angibt, ob die App getrimmt werden soll. Der Standardwert ist true für Release-Builds. |
Für eine vollständige Liste der Build-Eigenschaften siehe Build-Eigenschaften.
Wichtig
Die Werte für diese Build-Eigenschaften müssen nicht in der Projektdatei angegeben werden. Sie können auch in der Befehlszeile angegeben werden, wenn Sie die App veröffentlichen. Auf diese Weise können Sie bestimmte Werte in Ihrer Projektdatei auslassen.
Das folgende Beispiel zeigt eine typische Eigenschaftsgruppe zum Erstellen und Signaturen Ihrer Android-App:
<PropertyGroup Condition="$(TargetFramework.Contains('-android')) and '$(Configuration)' == 'Release'">
<AndroidSigningKeyStore>myapp.keystore</AndroidSigningKeyStore>
<AndroidSigningKeyAlias>myapp</AndroidSigningKeyAlias>
</PropertyGroup>
In diesem Beispiel fügt <PropertyGroup>
eine Bedingungsprüfung hinzu, die verhindert, dass diese Einstellungen verarbeitet werden, wenn die Bedingungsprüfung nicht bestanden wird. Bei der Bedingungsprüfung wird auf zwei Dinge geachtet:
- Das Zielframework wird auf etwas festgelegt, das den Text
-android
enthält. - Die Build-Konfiguration ist auf
Release
eingestellt.
Wenn eine dieser Bedingungen nicht erfüllt ist, werden die Einstellungen nicht verarbeitet. Noch wichtiger ist, dass die Einstellungen <AndroidSigningKeyStore>
und <AndroidSigningKeyAlias>
nicht gesetzt sind, wodurch die App nicht signiert werden kann.
Aus Sicherheitsgründen sollten Sie in der Projektdatei keinen Wert für <AndroidSigningKeyPass>
und <AndroidSigningStorePass>
angeben. Sie können diese Werte in der Befehlszeile angeben, wenn Sie die App veröffentlichen, oder die Präfixe env:
oder file:
verwenden, um zu verhindern, dass das Kennwort in den Build-Protokollen erscheint. Zum Beispiel, um eine Umgebungsvariable mit dem Namen AndroidSigningPassword
zu verwenden:
<PropertyGroup Condition="$(TargetFramework.Contains('-android')) and '$(Configuration)' == 'Release'">
<AndroidSigningKeyStore>myapp.keystore</AndroidSigningKeyStore>
<AndroidSigningKeyAlias>myapp</AndroidSigningKeyAlias>
<AndroidSigningKeyPass>env:AndroidSigningPassword</AndroidSigningKeyPass>
<AndroidSigningStorePass>env:AndroidSigningPassword</AndroidSigningStorePass>
</PropertyGroup>
Wichtig
Das Präfix env: wird nicht unterstützt, wenn $(AndroidPackageFormat)
auf aab
gesetzt ist.
Alternativ können Sie auch eine Datei unter C:\Users\user1\AndroidSigningPassword.txt verwenden:
<PropertyGroup Condition="$(TargetFramework.Contains('-android')) and '$(Configuration)' == 'Release'">
<AndroidSigningKeyStore>myapp.keystore</AndroidSigningKeyStore>
<AndroidSigningKeyAlias>key</AndroidSigningKeyAlias>
<AndroidSigningKeyPass>file:C:\Users\user1\AndroidSigningPassword.txt</AndroidSigningKeyPass>
<AndroidSigningStorePass>file:C:\Users\user1\AndroidSigningPassword.txt</AndroidSigningStorePass>
</PropertyGroup>
Die App verteilen
Die signierte APK- oder AAB-Datei kann auf eine der folgenden Arten verteilt werden:
- Die gängigste Methode zur Verteilung von Android-Apps an Nutzer ist Google Play. Google Play erfordert, dass Sie Ihre App als Android App Bundle (AAB) übermitteln. Weitere Informationen finden Sie unter Hochladen Ihrer App in die Play Console auf developer.android.com
- APK-Dateien können über eine Website oder einen Server an Android-Geräte verteilt werden. Wenn Benutzer von ihrem Android-Gerät zu einem Downloadlink navigieren, wird die Datei heruntergeladen. Android beginnt automatisch mit der Installation auf dem Gerät, wenn der/die Benutzer*in in seinen Einstellungen die Installation von Apps aus unbekannten Quellen zugelassen hat. Weitere Informationen über das Zulassen von Apps aus unbekannten Quellen finden Sie unter Benutzereinwilligung für unbekannte Apps und Quellen auf developer.android.com.
Weitere Informationen
- Über Android App Bundles auf developer.android.com