Processus de génération

Le processus de génération Xamarin.Android est chargé de tout coller : générer Resource.designer.cs, prendre en charge les @(AndroidAsset)actions de génération , @(AndroidResource)et d’autres actions de génération, générer des wrappers pouvant être appelé par Android et générer un .apk pour l’exécution sur les appareils Android.

Packages d’application

En gros, il existe deux types de packages d’application Android (les fichiers .apk) que le système de génération Xamarin.Android peut produire :

  • Les builds de mise en production, qui sont entièrement autonomes et ne nécessitent pas d’exécution de packages supplémentaires. Il s’agit des packages fournis à un App Store.

  • Des versions Debug, qui ne le sont pas.

Ces types de package correspondent au MSBuild Configuration qui produit le package.

Runtime partagé

Avant Xamarin.Android 11.2, le runtime partagé était une paire de packages Android supplémentaires qui fournissent la bibliothèque de classes de base (mscorlib.dll, etc.) et la bibliothèque de liaisons Android (Mono.Android.dll, etc.). Les versions Debug s’appuient sur le runtime partagé au lieu d’inclure la bibliothèque de classes de base et les assemblys de liaison dans le package d’application Android, ce qui explique la taille plus petite du package Debug.

Le runtime partagé peut être désactivé dans les builds Debug en définissant$(AndroidUseSharedRuntime) propriété de False.

La prise en charge du runtime partagé a été supprimée dans Xamarin.Android 11.2.

Déploiement rapide

Le déploiement rapide fonctionne en réduisant davantage la taille du package d’application Android. Pour ce faire, vous excluez les assemblys de l’application du package et déployez les assemblys de l’application directement dans le répertoire interne files de l’application, généralement situé dans /data/data/com.some.package. Le répertoire interne files n’étant pas un dossier accessible en écriture globale, l’outil run-as est utilisé pour exécuter toutes les commandes pour copier les fichiers dans ce répertoire.

Ce processus accélère le cycle de génération/déploiement/débogage, car le package n’est pas réinstallé lorsque seuls les assemblys sont modifiés. Seuls les assemblys mis à jour sont resynchronisés sur l’appareil cible.

Avertissement

Le déploiement rapide est connu pour échouer sur les appareils qui bloquent run-as, ce qui inclut souvent les appareils antérieurs à Android 5.0.

Le déploiement rapide est activé par défaut et peut être désactivé dans les versions Debug en définissant la propriété $(EmbedAssembliesIntoApk) sur True.

Le mode déploiement rapide amélioré peut être utilisé conjointement avec cette fonctionnalité pour accélérer encore plus les déploiements. Cela déploie à la fois les assemblys, les bibliothèques natives, les typesmaps et les dex dans le files répertoire. Toutefois, vous ne devriez vraiment avoir besoin de l’activer que si vous modifiez des bibliothèques natives, des liaisons ou du code Java.

Projets MSBuild

Le processus de génération de Xamarin.Android est basé sur MSBuild, qui est également le format de fichier projet utilisé par Visual Studio pour Mac et Visual Studio. En règle générale, les utilisateurs n’ont pas besoin de modifier manuellement les fichiers MSBuild : l’IDE crée des projets entièrement fonctionnels et les met à jour avec les modifications apportées, et appelle automatiquement des cibles de build si nécessaire.

Les utilisateurs avancés peuvent néanmoins souhaiter effectuer des opérations non prises en charge par l’interface graphique utilisateur de l’IDE : le processus de génération est donc personnalisable en modifiant le fichier projet directement. Cette page documente uniquement les fonctionnalités et personnalisations spécifiques à Xamarin.Android. De nombreuses autres choses sont possibles avec les éléments, propriétés et cibles MSBuild normaux.

Projets de liaison

Les propriétés MSBuild suivantes sont utilisées avec les projets de liaison :

Resource.designer.cs Génération

Les propriétés MSBuild suivantes sont utilisées pour contrôler la génération du Resource.designer.cs fichier :

Propriétés de signature

Les propriétés de signature contrôlent comment le package d’application est signé pour qu’il puisse être installé sur un appareil Android. Pour permettre une itération plus rapide des générations, les tâches Xamarin.Android ne signent pas les packages pendant le processus de génération, car l’opération de signature est assez lente. Au lieu de cela, les packages sont signés (si nécessaire) avant l’installation ou pendant l’exportation, par l’IDE ou par la cible de génération Install. Le fait d’appeler la cible SignAndroidPackage produit un package avec le suffixe -Signed.apk dans le répertoire de sortie.

Par défaut, la cible de signature génère si nécessaire une nouvelle clé de signature de débogage. Si vous souhaitez utiliser une clé spécifique, par exemple sur un serveur de build, les propriétés MSBuild suivantes sont utilisées :

keytool Mappage d’options

Considérez l’appel suivant keytool :

$ keytool -genkey -v -keystore filename.keystore -alias keystore.alias -keyalg RSA -keysize 2048 -validity 10000
Enter keystore password: keystore.filename password
Re-enter new password: keystore.filename password
...
Is CN=... correct?
  [no]:  yes

Generating 2,048 bit RSA key pair and self-signed certificate (SHA1withRSA) with a validity of 10,000 days
        for: ...
Enter key password for keystore.alias
        (RETURN if same as keystore password): keystore.alias password
[Storing filename.keystore]

Pour utiliser le magasin de clés généré ci-dessus, utilisez le groupe de propriétés :

<PropertyGroup>
    <AndroidKeyStore>True</AndroidKeyStore>
    <AndroidSigningKeyStore>filename.keystore</AndroidSigningKeyStore>
    <AndroidSigningStorePass>keystore.filename password</AndroidSigningStorePass>
    <AndroidSigningKeyAlias>keystore.alias</AndroidSigningKeyAlias>
    <AndroidSigningKeyPass>keystore.alias password</AndroidSigningKeyPass>
</PropertyGroup>

Créer des points d’extension

Le système de génération Xamarin.Android expose quelques points d’extension publics pour les utilisateurs souhaitant utiliser notre processus de génération. Pour utiliser l’un de ces points d’extension, vous devez ajouter votre cible personnalisée à la propriété MSBuild appropriée dans un PropertyGroup. Par exemple :

<PropertyGroup>
   <AfterGenerateAndroidManifest>
      $(AfterGenerateAndroidManifest);
      YourTarget;
   </AfterGenerateAndroidManifest>
</PropertyGroup>

Les points d’extension sont les suivants :

Attention à l’extension du processus de génération : si elles ne sont pas écrites correctement, les extensions de build peuvent affecter les performances de votre build, en particulier si elles s’exécutent sur chaque build. Il est vivement recommandé de lire la documentation MSBuild avant d’implémenter ces extensions.

Définitions de cibles

Les parties spécifiques à Xamarin.Android du processus de génération sont définies dans $(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets, mais des cibles normales spécifiques au langage comme Microsoft.CSharp.targets sont également nécessaires pour générer l’assembly.

Les propriétés de génération suivantes doivent être définies avant l’importation des cibles de langage :

<PropertyGroup>
  <TargetFrameworkIdentifier>MonoDroid</TargetFrameworkIdentifier>
  <MonoDroidVersion>v1.0</MonoDroidVersion>
  <TargetFrameworkVersion>v2.2</TargetFrameworkVersion>
</PropertyGroup>

Toutes ces cibles et propriétés peuvent être incluses pour C# en important Xamarin.Android.CSharp.targets :

<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />

Ce fichier peut être facilement adapté pour d’autres langages.