Pubblicare un'app Android usando la riga di comando
Per distribuire un'app Android .NET Multipiattaforma (.NET MAUI), è necessario firmarla con una chiave dall'archivio chiavi. Un archivio chiavi è un database di certificati di sicurezza creati usando keytool
java Development Kit (JDK). Un archivio chiavi è necessario quando si pubblica un'app Android .NET MAUI, perché Android non eseguirà app che non sono state firmate.
Creare un file dell'archivio chiavi
Durante lo sviluppo, .NET per Android usa un archivio chiavi di debug per firmare l'app, che consente di essere distribuito direttamente in un emulatore o nei dispositivi configurati per l'esecuzione di app di debug. Tuttavia, questo archivio chiavi non viene riconosciuto come archivio chiavi valido ai fini della distribuzione delle app. Pertanto, è necessario creare e usare un archivio chiavi privato per la firma delle build di versione. Si tratta di un passaggio che deve essere eseguito una sola volta, perché la stessa chiave verrà usata per la pubblicazione degli aggiornamenti e può essere usata per firmare altre app. Dopo aver generato un file dell'archivio chiavi, è necessario specificarne i dettagli dalla riga di comando durante la compilazione dell'app o configurare il file di progetto per farvi riferimento.
Per creare un file dell'archivio chiavi, seguire questa procedura:
Aprire un terminale e passare alla cartella del progetto.
Suggerimento
Se Visual Studio è aperto, usare il menu Visualizza>terminale per aprire un terminale nella posizione della soluzione o del progetto. Passare alla cartella del progetto.
Eseguire lo strumento keytool con i parametri seguenti:
keytool -genkeypair -v -keystore {filename}.keystore -alias {keyname} -keyalg RSA -keysize 2048 -validity 10000
Importante
Se nel computer sono installate più versioni di JDK, assicurarsi di eseguire
keytool
dalla versione più recente di JDK.Verrà richiesto di fornire e confermare una password, seguita dal nome completo, dall'unità organizzativa, dall'organizzazione, dalla città o dalla località, dallo stato o dalla provincia e dal codice paese. Queste informazioni non vengono visualizzate nell'app, ma sono incluse nel certificato.
Ad esempio, per generare un file myapp.keystore nella stessa cartella del progetto, con un alias di
myapp
, usare il comando seguente:keytool -genkeypair -v -keystore myapp.keystore -alias myapp -keyalg RSA -keysize 2048 -validity 10000
Suggerimento
Eseguire il backup dell'archivio chiavi e della password. Se si perde, non sarà possibile firmare l'app con la stessa identità di firma.
Trovare la firma dell'archivio chiavi
Per elencare le chiavi archiviate in un archivio chiavi, usare keytool
con l'opzione -list
:
keytool -list -keystore {filename}.keystore
Ad esempio, per elencare le chiavi in un archivio chiavi denominato myapp.keystore, usare il comando seguente:
keytool -list -keystore myapp.keystore
Compilare e firmare l'app
Per compilare l'app dalla riga di comando e firmarla usando l'archivio chiavi, aprire un terminale e passare alla cartella per il progetto di app MAUI .NET. Eseguire il dotnet publish
comando specificando i parametri seguenti:
Parametro | Valore |
---|---|
-f oppure --framework |
Framework di destinazione, ovvero net8.0-android . |
-c oppure --configuration |
Configurazione di compilazione, ovvero Release . |
Avviso
Se si tenta di pubblicare una soluzione MAUI .NET, il dotnet publish
comando tenta di pubblicare ogni progetto nella soluzione singolarmente, causando problemi quando sono stati aggiunti altri tipi di progetto alla soluzione. Di conseguenza, il dotnet publish
comando deve essere limitato al progetto di app .NET MAUI.
È possibile specificare parametri di compilazione aggiuntivi nella riga di comando, se non vengono forniti in un <PropertyGroup>
nel file di progetto. La tabella seguente elenca alcuni dei parametri comuni:
Parametro | Valore |
---|---|
-p:ApplicationTitle |
Nome visibile dall'utente per l'app. |
-p:ApplicationId |
Identificatore univoco per l'app, ad esempio com.companyname.mymauiapp . |
-p:ApplicationVersion |
Versione della build che identifica un'iterazione dell'app. |
-p:ApplicationDisplayVersion |
Numero di versione dell'app. |
-p:AndroidKeyStore |
Valore booleano che indica se l'app deve essere firmata. Il valore predefinito è false . |
-p:AndroidPackageFormats |
Proprietà delimitata da punti e virgola che indica se vuoi creare un pacchetto dell'app come file APK o AAB. Impostare su aab o apk per generare un solo formato. Il valore predefinito per le build di versione è aab;apk . |
-p:AndroidSigningKeyAlias |
Alias per la chiave nell'archivio chiavi. Questo è il keytool -alias valore usato durante la creazione dell'archivio chiavi. |
-p:AndroidSigningKeyPass |
Password della chiave all'interno del file dell'archivio chiavi. Questo è il valore fornito a keytool quando si crea il file dell'archivio chiavi e viene chiesto di immettere la password dell'archivio chiavi. Questo perché il tipo di archivio chiavi predefinito presuppone che la password della chiave e la password dell'archivio chiavi siano identiche. Questa proprietà supporta env: anche i prefissi e file: che possono essere usati per specificare una variabile di ambiente o un file che contiene la password. Queste opzioni consentono di impedire la visualizzazione della password nei log di compilazione. |
-p:AndroidSigningKeyStore |
Nome file del file dell'archivio chiavi creato da keytool . Questo è il keytool -keystore valore usato durante la creazione dell'archivio chiavi. |
-p:AndroidSigningStorePass |
Password per il file dell'archivio chiavi. Questo è il valore fornito a keytool quando si crea il file dell'archivio chiavi e viene chiesto di immettere la password dell'archivio chiavi. Questo perché il tipo di archivio chiavi predefinito presuppone che la password dell'archivio chiavi e la password della chiave siano identiche. Questa proprietà supporta env: anche i prefissi e file: che possono essere usati per specificare una variabile di ambiente o un file che contiene la password. Queste opzioni consentono di impedire la visualizzazione della password nei log di compilazione. |
-p:PublishTrimmed |
Valore booleano che indica se l'app deve essere tagliata. Il valore predefinito è true per le build di versione. |
È consigliabile usare la stessa password dei valori dei AndroidSigningKeyPass
parametri e AndroidSigningStorePass
.
Per un elenco completo delle proprietà di compilazione, vedere Proprietà di compilazione.
Importante
Non è necessario specificare i valori per questi parametri nella riga di comando. Possono anche essere forniti nel file di progetto. Quando viene specificato un parametro nella riga di comando e nel file di progetto, il parametro della riga di comando ha la precedenza. Per altre informazioni sulla fornitura di proprietà di compilazione nel file di progetto, vedere Definire le proprietà di compilazione nel file di progetto.
Eseguire il dotnet publish
comando con i parametri seguenti per compilare e firmare l'app:
dotnet publish -f net8.0-android -c Release -p:AndroidKeyStore=true -p:AndroidSigningKeyStore={filename}.keystore -p:AndroidSigningKeyAlias={keyname} -p:AndroidSigningKeyPass={password} -p:AndroidSigningStorePass={password}
Nota
In .NET 8 il dotnet publish
comando usa per impostazione predefinita la Release
configurazione. Di conseguenza, la configurazione della compilazione può essere omessa dalla riga di comando.
Ad esempio, usare il comando seguente per compilare e firmare l'app usando l'archivio chiavi creato in precedenza:
dotnet publish -f net8.0-android -c Release -p:AndroidKeyStore=true -p:AndroidSigningKeyStore=myapp.keystore -p:AndroidSigningKeyAlias=myapp -p:AndroidSigningKeyPass=mypassword -p:AndroidSigningStorePass=mypassword
Sia le AndroidSigningKeyPass
proprietà e AndroidSigningStorePass
supportano env:
i prefissi che file:
possono essere usati per specificare una variabile di ambiente o un file che contiene la password. Se si specifica la password in questo modo, si impedisce la visualizzazione nei log di compilazione. Ad esempio, per usare una variabile di ambiente denominata AndroidSigningPassword
:
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
Importante
Il prefisso env: non è supportato quando $(AndroidPackageFormat)
è impostato su aab
.
Per usare un file che si trova in C:\Users\user1\AndroidSigningPassword.txt:
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
La pubblicazione compila e firma l'app e quindi copia i file AAB e APK nella cartella bin\Release\net8.0-android\publish . Sono presenti due file AAB, uno senza segno e un altro firmato. La variante con segno ha eseguito l'accesso al nome del file.
Per altre informazioni sul dotnet publish
comando, vedere dotnet publish.
Nota
Per le app Android, dotnet build
è anche possibile usare per compilare e firmare l'app. Tuttavia, i file AAB e APK verranno creati nella cartella bin\Release\net8.0-android anziché nella sottocartella publish . dotnet build
per impostazione predefinita è anche una Debug
configurazione, quindi il -c
parametro è necessario per specificare la Release
configurazione.
Definire le proprietà di compilazione nel file di progetto
Un'alternativa alla specifica dei parametri di compilazione nella riga di comando consiste nel specificarli nel file di progetto in un oggetto <PropertyGroup>
. La tabella seguente elenca alcune delle proprietà di compilazione comuni:
Proprietà | valore |
---|---|
<ApplicationTitle> |
Nome visibile dall'utente per l'app. |
<ApplicationId> |
Identificatore univoco per l'app, ad esempio com.companyname.mymauiapp . |
<ApplicationVersion> |
Versione della build che identifica un'iterazione dell'app. |
<ApplicationDisplayVersion> |
Numero di versione dell'app. |
<AndroidKeyStore> |
Valore booleano che indica se l'app deve essere firmata. Il valore predefinito è false . |
<AndroidPackageFormats> |
Proprietà delimitata da punti e virgola che indica se vuoi creare un pacchetto dell'app come file APK o AAB. Impostare su aab o apk per generare un solo formato. Il valore predefinito per le build di versione è aab;apk . |
<AndroidSigningKeyAlias> |
Alias per la chiave nell'archivio chiavi. Questo è il keytool -alias valore usato durante la creazione dell'archivio chiavi. |
<AndroidSigningKeyPass> |
Password della chiave all'interno del file dell'archivio chiavi. Questo è il valore fornito a keytool quando si crea il file dell'archivio chiavi e viene chiesto di immettere la password dell'archivio chiavi. Questo perché il tipo di archivio chiavi predefinito presuppone che la password della chiave e la password dell'archivio chiavi siano identiche. Questa proprietà supporta env: anche i prefissi e file: che possono essere usati per specificare una variabile di ambiente o un file che contiene la password. Queste opzioni consentono di impedire la visualizzazione della password nei log di compilazione. |
<AndroidSigningKeyStore> |
Nome file del file dell'archivio chiavi creato da keytool . Questo è il keytool -keystore valore usato durante la creazione dell'archivio chiavi. |
<AndroidSigningStorePass> |
Password per il file dell'archivio chiavi. Questo è il valore fornito a keytool quando si crea il file dell'archivio chiavi e viene chiesto di immettere la password dell'archivio chiavi. Questo perché il tipo di archivio chiavi predefinito presuppone che la password dell'archivio chiavi e la password della chiave siano identiche. Questa proprietà supporta env: anche i prefissi e file: che possono essere usati per specificare una variabile di ambiente o un file che contiene la password. Queste opzioni consentono di impedire la visualizzazione della password nei log di compilazione. |
<PublishTrimmed> |
Valore booleano che indica se l'app deve essere tagliata. Il valore predefinito è true per le build di versione. |
Per un elenco completo delle proprietà di compilazione, vedere Proprietà di compilazione.
Importante
I valori per queste proprietà di compilazione non devono essere specificati nel file di progetto. Possono anche essere forniti nella riga di comando quando si pubblica l'app. In questo modo è possibile omettere valori specifici dal file di progetto.
L'esempio seguente mostra un gruppo di proprietà tipico per la compilazione e la firma dell'app Android:
<PropertyGroup Condition="$(TargetFramework.Contains('-android')) and '$(Configuration)' == 'Release'">
<AndroidSigningKeyStore>myapp.keystore</AndroidSigningKeyStore>
<AndroidSigningKeyAlias>myapp</AndroidSigningKeyAlias>
</PropertyGroup>
In questo esempio <PropertyGroup>
viene aggiunto un controllo della condizione, impedendo l'elaborazione di tali impostazioni a meno che il controllo della condizione non venga superato. Il controllo della condizione cerca due elementi:
- Il framework di destinazione è impostato su un elemento contenente il testo
-android
. - La configurazione della compilazione è impostata su
Release
.
Se una di queste condizioni ha esito negativo, le impostazioni non vengono elaborate. Ancora più importante, le <AndroidSigningKeyStore>
impostazioni e <AndroidSigningKeyAlias>
non sono impostate, impedendo la firma dell'app.
Per motivi di sicurezza, non è consigliabile specificare un valore per <AndroidSigningKeyPass>
e <AndroidSigningStorePass>
nel file di progetto. È possibile specificare questi valori nella riga di comando quando si pubblica l'app oppure usare i env:
prefissi o file:
per impedire la visualizzazione della password nei log di compilazione. Ad esempio, per usare una variabile di ambiente denominata AndroidSigningPassword
:
<PropertyGroup Condition="$(TargetFramework.Contains('-android')) and '$(Configuration)' == 'Release'">
<AndroidSigningKeyStore>myapp.keystore</AndroidSigningKeyStore>
<AndroidSigningKeyAlias>myapp</AndroidSigningKeyAlias>
<AndroidSigningKeyPass>env:AndroidSigningPassword</AndroidSigningKeyPass>
<AndroidSigningStorePass>env:AndroidSigningPassword</AndroidSigningStorePass>
</PropertyGroup>
Importante
Il prefisso env: non è supportato quando $(AndroidPackageFormat)
è impostato su aab
.
In alternativa, per usare un file che si trova in C:\Users\user1\AndroidSigningPassword.txt:
<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>
Distribuire l'app
Il file APK o AAB firmato può essere distribuito con uno degli approcci seguenti:
- L'approccio più comune alla distribuzione di app Android agli utenti consiste nell'usare Google Play. Google Play richiede l'invio dell'app come bundle di app Android (AAB). Per altre informazioni, vedere Caricare l'app nella console di riproduzione in developer.android.com
- I file APK possono essere distribuiti ai dispositivi Android tramite un sito Web o un server. Quando gli utenti passano a un collegamento di download dal dispositivo Android, il file viene scaricato. Android avvia automaticamente l'installazione nel dispositivo, se l'utente ha configurato le impostazioni per consentire l'installazione di app da origini sconosciute. Per altre informazioni sul consenso esplicito per consentire app da origini sconosciute, vedere Consenso esplicito dell'utente per app e origini sconosciute in developer.android.com.
Vedi anche
- Informazioni sui bundle di app Android in developer.android.com