Publier une application Android à l’aide de la ligne de commande

Pour distribuer une application Android .NET Multiplateforme (.NET MAUI), vous devez la signer avec une clé à partir de votre magasin de clés. Un magasin de clés est une base de données de certificats de sécurité créés à l’aide keytool du Kit de développement Java (JDK). Un magasin de clés est requis lors de la publication d’une application Android .NET MAUI, car Android n’exécute pas d’applications qui n’ont pas été signées.

Créer un fichier de magasin de clés

Pendant le développement, .NET pour Android utilise un magasin de clés de débogage pour signer l’application, ce qui lui permet d’être déployé directement sur un émulateur ou sur des appareils configurés pour exécuter des applications débogueables. Toutefois, ce magasin de clés n’est pas reconnu comme un magasin de clés valide à des fins de distribution d’applications. Par conséquent, un magasin de clés privé doit être créé et utilisé pour signer des versions de production. Il s’agit d’une étape qui ne doit être effectuée qu’une seule fois, car la même clé sera utilisée pour publier des mises à jour et peut être utilisée pour signer d’autres applications. Après avoir généré un fichier de magasin de clés, vous fournissez ses détails à partir de la ligne de commande lors de la génération de l’application ou configurez votre fichier projet pour le référencer.

Procédez comme suit pour créer un fichier de magasin de clés :

  1. Ouvrez un terminal et accédez au dossier de votre projet.

    Conseil / Astuce

    Si Visual Studio est ouvert, utilisez le menu Afficher> leterminal pour ouvrir un terminal à l’emplacement de la solution ou du projet. Accédez au dossier du projet.

  2. Exécutez l’outil keytool avec les paramètres suivants :

    keytool -genkeypair -v -keystore {filename}.keystore -alias {keyname} -keyalg RSA -keysize 2048 -validity 10000
    

    Important

    Si plusieurs versions du JDK sont installées sur votre ordinateur, vérifiez que vous exécutez keytool à partir de la dernière version du JDK.

    Vous serez invité à fournir et confirmer un mot de passe, suivi du nom complet, de l’unité d’organisation, de l’organisation, de la ville ou de la localité, de l’état ou de la province et du code du pays. Ces informations ne s’affichent pas dans votre application, mais sont incluses dans votre certificat.

    Par exemple, pour générer un fichier myapp.keystore dans le même dossier que votre projet, avec un alias de myapp, utilisez la commande suivante :

    keytool -genkeypair -v -keystore myapp.keystore -alias myapp -keyalg RSA -keysize 2048 -validity 10000
    

    Conseil / Astuce

    Sauvegardez votre magasin de clés et votre mot de passe. Si vous le perdez, vous ne pourrez pas signer votre application avec la même identité de signature.

Rechercher la signature de votre magasin de clés

Pour répertorier les clés stockées dans un magasin de clés, utilisez keytool l’option -list suivante :

keytool -list -keystore {filename}.keystore

Par exemple, pour répertorier les clés d’un magasin de clés nommé myapp.keystore, utilisez la commande suivante :

keytool -list -keystore myapp.keystore

Créer et signer votre application

Pour générer votre application à partir de la ligne de commande et la signer à l’aide de votre magasin de clés, ouvrez un terminal et accédez au dossier de votre projet d’application .NET MAUI. Exécutez la dotnet publish commande, en fournissant les paramètres suivants :

Paramètre Valeur
-f ou --framework Framework cible, c’est-à-dire net8.0-android.
-c ou --configuration Configuration de build, qui est Release.

Avertissement

La tentative de publication d’une solution .NET MAUI entraîne la dotnet publish commande qui tente de publier chaque projet dans la solution individuellement, ce qui peut entraîner des problèmes lorsque vous avez ajouté d’autres types de projets à votre solution. Par conséquent, la dotnet publish commande doit être étendue à votre projet d’application .NET MAUI.

Des paramètres de build supplémentaires peuvent être spécifiés sur la ligne de commande, s’ils ne sont pas fournis dans un <PropertyGroup> dans votre fichier projet. Le tableau suivant répertorie certains des paramètres courants :

Paramètre Valeur
-p:ApplicationTitle Nom visible par l’utilisateur pour l’application.
-p:ApplicationId Identificateur unique de l’application, tel que com.companyname.mymauiapp.
-p:ApplicationVersion Version de la compilation qui identifie une itération de l’application.
-p:ApplicationDisplayVersion Numéro de version de l’application.
-p:AndroidKeyStore Valeur booléenne qui indique si l’application doit être signée. La valeur par défaut est false.
-p:AndroidPackageFormats Propriété délimitée par des points-virgules qui indique si vous souhaitez empaqueter l’application en tant que fichier APK ou AAB. Définissez sur aab ou apk pour générer un seul format. La valeur par défaut pour les builds de mise en production est aab;apk.
-p:AndroidSigningKeyAlias Alias de la clé dans le magasin de clés. Il s’agit de la keytool -alias valeur utilisée lors de la création du magasin de clés.
-p:AndroidSigningKeyPass Mot de passe de la clé dans le fichier de magasin de clés. Il s'agit de la valeur fournie à keytool lors de la création du fichier de keystore et que vous devez saisir le mot de passe du keystore. Cela est dû au fait que le type de magasin de clés par défaut suppose que le mot de passe de clé et le mot de passe du magasin de clés sont identiques. Cette propriété prend également en charge les préfixes env: et file: qui peuvent être utilisés pour spécifier une variable d’environnement ou un fichier qui contient le mot de passe. Ces options permettent d’empêcher l’affichage du mot de passe dans les journaux de génération.
-p:AndroidSigningKeyStore Nom de fichier du magasin de clés créé par keytool. Il s’agit de la keytool -keystore valeur utilisée lors de la création du magasin de clés.
-p:AndroidSigningStorePass Le mot de passe pour le fichier du magasin de clés. Il s'agit de la valeur fournie à keytool lors de la création du fichier de keystore et que vous devez saisir le mot de passe du keystore. Cela est dû au fait que le type de magasin de clés par défaut suppose que le mot de passe du magasin de clés et le mot de passe de clé sont identiques. Cette propriété prend également en charge les préfixes env: et file: qui peuvent être utilisés pour spécifier une variable d’environnement ou un fichier qui contient le mot de passe. Ces options permettent d’empêcher l’affichage du mot de passe dans les journaux de génération.
-p:PublishTrimmed Valeur booléenne qui indique si l’application doit être supprimée. La valeur par défaut est true pour les builds de mise en production.

Vous devez utiliser le même mot de passe que les valeurs des paramètres AndroidSigningKeyPass et AndroidSigningStorePass.

Pour obtenir la liste complète des propriétés de build, consultez Propriétés de build.

Important

Les valeurs de ces paramètres ne doivent pas être fournies sur la ligne de commande. Elles peuvent également être indiquées dans le fichier projet. Lorsqu’un paramètre est fourni sur la ligne de commande et dans le fichier projet, le paramètre de ligne de commande est prioritaire. Pour en savoir plus sur l’entrée des propriétés de build dans le fichier projet, consultez Définir les propriétés de build dans votre fichier projet.

Exécutez la dotnet publish commande avec les paramètres suivants pour générer et signer votre application :

dotnet publish -f net8.0-android -c Release -p:AndroidKeyStore=true -p:AndroidSigningKeyStore={filename}.keystore -p:AndroidSigningKeyAlias={keyname} -p:AndroidSigningKeyPass={password} -p:AndroidSigningStorePass={password}

Note

Dans .NET 8, la dotnet publish commande est par défaut dans la Release configuration. Par conséquent, la configuration de build peut être omise à partir de la ligne de commande.

Par exemple, utilisez la commande suivante pour générer et signer votre application à l’aide du magasin de clés créé précédemment :

dotnet publish -f net8.0-android -c Release -p:AndroidKeyStore=true -p:AndroidSigningKeyStore=myapp.keystore -p:AndroidSigningKeyAlias=myapp -p:AndroidSigningKeyPass=mypassword -p:AndroidSigningStorePass=mypassword

Les propriétés AndroidSigningKeyPass et AndroidSigningStorePass prennent en charge les préfixes env: et file: qui peuvent être utilisés pour spécifier une variable d’environnement ou un fichier contenant le mot de passe. La spécification du mot de passe de cette façon empêche son affichage dans les journaux de build. Par exemple, pour utiliser une variable d’environnement nommée 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

Important

Env: le préfixe n’est pas pris en charge si $(AndroidPackageFormat) est défini sur aab.

Pour utiliser un fichier situé à 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 publication génère l’application et y appose une signature, puis copie les fichiers AAB et APK dans le dossier bin\Release\net8.0-android\publish. Il existe deux fichiers AAB : un non signé et un autre signé. La variante signée a -signée dans le nom du fichier.

Pour plus d’informations sur la dotnet publish commande, consultez dotnet publish.

Note

Pour les applications Android, dotnet build vous pouvez également utiliser cette option pour générer et signer votre application. Toutefois, les fichiers AAB et APK sont créés dans le dossier bin\Release\net8.0-android plutôt que dans le sous-dossier de publication . dotnet build est également défini par défaut sur une Debug configuration. Par conséquent, le -c paramètre est requis pour spécifier la Release configuration.

Définir les propriétés de build dans votre fichier projet

Une alternative à la spécification des paramètres de build sur la ligne de commande consiste à les spécifier dans votre fichier projet dans un <PropertyGroup>. Le tableau suivant répertorie certaines propriétés courantes de build :

Propriété Valeur
<ApplicationTitle> Nom visible par l’utilisateur pour l’application.
<ApplicationId> Identificateur unique de l’application, tel que com.companyname.mymauiapp.
<ApplicationVersion> Version de la compilation qui identifie une itération de l’application.
<ApplicationDisplayVersion> Numéro de version de l’application.
<AndroidKeyStore> Valeur booléenne qui indique si l’application doit être signée. La valeur par défaut est false.
<AndroidPackageFormats> Propriété délimitée par des points-virgules qui indique si vous souhaitez empaqueter l’application en tant que fichier APK ou AAB. Définissez sur aab ou apk pour générer un seul format. La valeur par défaut pour les builds de mise en production est aab;apk.
<AndroidSigningKeyAlias> Alias de la clé dans le magasin de clés. Il s’agit de la keytool -alias valeur utilisée lors de la création du magasin de clés.
<AndroidSigningKeyPass> Mot de passe de la clé dans le fichier de magasin de clés. Il s’agit de la valeur fournie à keytool au moment de créer le fichier keystore, et vous êtes invité à entrer le mot de passe du keystore. Cela est dû au fait que le type de magasin de clés par défaut suppose que le mot de passe de clé et le mot de passe du magasin de clés sont identiques. Cette propriété prend également en charge les préfixes env: et file: qui peuvent être utilisés pour spécifier une variable d’environnement ou un fichier qui contient le mot de passe. Ces options permettent d’empêcher l’affichage du mot de passe dans les journaux de génération.
<AndroidSigningKeyStore> Nom de fichier du magasin de clés créé par keytool. Il s’agit de la keytool -keystore valeur utilisée lors de la création du magasin de clés.
<AndroidSigningStorePass> Le mot de passe pour le fichier du magasin de clés. Il s'agit de la valeur fournie à keytool lors de la création du fichier de keystore et que vous devez saisir le mot de passe du keystore. Cela est dû au fait que le type de magasin de clés par défaut suppose que le mot de passe du magasin de clés et le mot de passe de clé sont identiques. Cette propriété prend également en charge les préfixes env: et file: qui peuvent être utilisés pour spécifier une variable d’environnement ou un fichier qui contient le mot de passe. Ces options permettent d’empêcher l’affichage du mot de passe dans les journaux de génération.
<PublishTrimmed> Valeur booléenne qui indique si l’application doit être supprimée. La valeur par défaut est true pour les builds de mise en production.

Pour obtenir la liste complète des propriétés de build, consultez Propriétés de build.

Important

Les valeurs de ces propriétés de build ne doivent pas nécessairement être fournies dans le fichier projet. Elles peuvent également être indiquées sur la ligne de commande lorsque vous publiez l’application. Vous pouvez ainsi omettre des valeurs spécifiques de votre fichier projet.

L’exemple suivant montre un groupe de propriétés classique pour la création et la signature de votre application Android :

<PropertyGroup Condition="$(TargetFramework.Contains('-android')) and '$(Configuration)' == 'Release'">
    <AndroidSigningKeyStore>myapp.keystore</AndroidSigningKeyStore>
    <AndroidSigningKeyAlias>myapp</AndroidSigningKeyAlias>
</PropertyGroup>

Cet exemple <PropertyGroup> montre comment ajouter une vérification de condition, ce qui empêche ces paramètres d’être traités, sauf si la vérification de condition réussit. La vérification de condition recherche deux éléments :

  1. Le cadre cible est paramétré sur quelque chose contenant le texte -android.
  2. La configuration de build est définie sur Release.

Si l’une de ces conditions échoue, les paramètres ne sont pas traités. Plus important encore, les paramètres <AndroidSigningKeyStore> et <AndroidSigningKeyAlias> ne sont pas définis, ce qui empêche la signature de l’application.

Pour des raisons de sécurité, vous ne devez pas fournir de valeur pour <AndroidSigningKeyPass> et <AndroidSigningStorePass> dans le fichier projet. Vous pouvez fournir ces valeurs sur la ligne de commande lorsque vous publiez l’application, ou utiliser les préfixes env: ou file: pour empêcher l’affichage du mot de passe dans les journaux de compilation. Par exemple, pour utiliser une variable d’environnement nommée 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>

Important

Le préfixe env: n’est pas pris en charge lorsqu’il $(AndroidPackageFormat) est défini à aab.

Vous pouvez également utiliser un fichier situé à 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>

Distribuer l’application

Le fichier APK ou AAB signé peut être distribué avec l’une des approches suivantes :

  • L’approche la plus courante de la distribution d’applications Android aux utilisateurs consiste à utiliser Google Play. Google Play exige que vous envoyiez votre application en tant que bundle d’applications Android (AAB). Pour plus d’informations, consultez Charger votre application dans la console Play sur developer.android.com
  • Les fichiers APK peuvent être distribués aux appareils Android via un site web ou un serveur. Lorsque les utilisateurs accèdent à un lien de téléchargement à partir de leur appareil Android, le fichier est téléchargé. Android démarre automatiquement son installation sur l’appareil, si l’utilisateur a configuré ses paramètres pour autoriser l’installation des applications à partir de sources inconnues. Pour plus d’informations sur l’option d’autorisation des applications provenant de sources inconnues, consultez l’option Utilisateur pour les applications et sources inconnues sur developer.android.com.

Voir également