Partager via


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

Pour distribuer une application Android .NET Multi-platform App UI (.NET MAUI), vous devez la signer avec une clé de votre magasin de clés. Un magasin de clés est une base de données de certificats de sécurité créée à l’aide de l’outil 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 les applications non 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ébogables. Toutefois, ce magasin de clés n’est pas reconnu comme un magasin de clés valide pour la distribution des applications. Par conséquent, vous devez créer et utiliser un magasin de clés privé pour signer des builds de mise en production. Cette étape 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 vous 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

    Si Visual Studio est ouvert, utilisez le menu Affichage>Terminal 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 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

    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 avec l’option -list :

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

Générer 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 commande dotnet publish, en fournissant les paramètres suivants :

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

Avertissement

La tentative de publication d’une solution .NET MAUI entraîne la commande dotnet publish 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 commande dotnet publish 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 paramètres courants :

Paramètre Valeur
-p:ApplicationTitle Nom de l’application visible par l’utilisateur.
-p:ApplicationId Identificateur unique de l’application, par exemple com.companyname.mymauiapp.
-p:ApplicationVersion Version de la build 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 le paramètre 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 valeur keytool -alias 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 magasin de clés, et vous êtes invité à entrer le mot de passe du magasin de clés. Cela est dû au fait que le type de magasin de clés par défaut suppose que le mot de passe de la 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 du fichier de magasin de clés créé par keytool. Il s’agit de la valeur keytool -keystore utilisée lors de la création du magasin de clés.
-p:AndroidSigningStorePass Mot de passe du fichier de magasin de clés. Il s’agit de la valeur fournie à keytool lors de la création du fichier de magasin de clés, et vous êtes invité à entrer le mot de passe du magasin de clés. Cela est dû au fait que le type de magasin de clés par défaut suppose que le mot de passe de la 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:PublishTrimmed Valeur booléenne qui indique si l’application doit être découpé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 nécessairement ê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 commande dotnet publish 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}

Remarque

Dans .NET 8, la commande dotnet publish est par défaut dans la configuration Release. 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 qui contient le mot de passe. Si vous spécifiez le mot de passe de cette façon, vous empêchez son affichage dans les journaux de génération. 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

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

Pour utiliser un fichier situé dans 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

Le fait de publier génère et signe l’application, 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é. Le nom de fichier de la variante signée contient l’élément -signed.

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

Remarque

Pour les applications Android, vous pouvez également utiliser dotnet build 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 publish. dotnet build est également défini par défaut sur une configuration Debug. Par conséquent, le paramètre -c est requis pour spécifier la configuration Release.

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 de l’application visible par l’utilisateur.
<ApplicationId> Identificateur unique de l’application, par exemple com.companyname.mymauiapp.
<ApplicationVersion> Version de la build 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 le paramètre 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 valeur keytool -alias 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 lors de la création du fichier de magasin de clés, et vous êtes invité à entrer le mot de passe du magasin de clés. Cela est dû au fait que le type de magasin de clés par défaut suppose que le mot de passe de la 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 du fichier de magasin de clés créé par keytool. Il s’agit de la valeur keytool -keystore utilisée lors de la création du magasin de clés.
<AndroidSigningStorePass> Mot de passe du fichier de magasin de clés. Il s’agit de la valeur fournie à keytool lors de la création du fichier de magasin de clés, et vous êtes invité à entrer le mot de passe du magasin de clés. Cela est dû au fait que le type de magasin de clés par défaut suppose que le mot de passe de la 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.
<PublishTrimmed> Valeur booléenne qui indique si l’application doit être découpé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 génération 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> ajoute une vérification de condition, ce qui empêche ces paramètres d’être traités, à moins que la vérification de condition ne réussisse. La vérification de condition recherche deux éléments :

  1. L’infrastructure cible est définie sur un élément 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 indiquer 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 génération. 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 si $(AndroidPackageFormat) est défini sur aab.

Pour utiliser un fichier situé dans C:\Users\user1\AndroidSigningPassword.txt, vous pouvez également exécuter la ligne de commande :

<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 pour distribuer des applications Android aux utilisateurs est l’utilisation de Google Play. Google Play nécessite que vous envoyiez votre application en tant qu’ensemble d’applications Android (AAB). Pour en savoir plus, consultez Importer votre application dans la Play Console 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 en savoir plus sur l’autorisation des applications provenant de sources inconnues, consultez Acceptation des applications et des sources inconnues par l’utilisateur sur developer.android.com.

Voir aussi