Looking for android Answers? Try Ask4KnowledgeBase
Looking for android Keywords? Try Ask4Keywords

AndroidMultidex et la limite de méthode Dex


Introduction

DEX désigne les fichiers de code-octet exécutables de l'application Android (APK) sous la forme de fichiers Dalvik Executable (DEX), qui contiennent le code compilé utilisé pour exécuter votre application.

La spécification Dalvik Executable limite le nombre total de méthodes pouvant être référencées dans un seul fichier DEX à 65 536 (64 Ko), y compris les méthodes d'infrastructure Android, les méthodes de bibliothèque et les méthodes de votre propre code.

Pour surmonter cette limite, vous devez configurer le processus de génération de votre application afin de générer plusieurs fichiers DEX, appelés Multidex.

Remarques

Qu'est ce que le dex?

Dex est le nom du format de fichier et du codage auquel le code Java Android est compilé. Les premières versions d'Android chargeraient et exécuteraient des binaires dex directement dans une machine virtuelle nommée Dalvik. Les versions plus récentes d'Android utilisent Android Runtime (ART), qui traite les fichiers dex comme une représentation intermédiaire et effectue de nouvelles compilations avant d'exécuter l'application.

Dex est un format de fichier très ancien, en termes de durée de vie des smartphones, conçu pour les périphériques dont la mémoire principale était mesurée en dizaines de mégaoctets. Les limites de conception de ces jours sont restées avec nous à ce jour.

Le problème:

Le format de fichier dex encode une limite au nombre de méthodes pouvant être référencées dans un seul fichier binaire. Étant donné que la partie du format de fichier qui stocke le nombre de références comporte deux octets, le nombre maximal de références de méthode est 0xFFFF ou 65535. Si une application contient plus de ce nombre de références de méthode, la compilation échouera.

Que faire à ce sujet:

Google a fourni un moyen de contourner ce problème, appelé Multidex. Il comporte des composants à la compilation et à l'exécution. Comme son nom l'indique, au moment de la compilation, il divisera le code entre un ou plusieurs fichiers dex . Lors de l'exécution, le ClassLoader par défaut ClassLoader à rechercher les classes à partir de ces fichiers.

Cette approche fonctionne bien sur les nouveaux périphériques, mais présente des inconvénients importants. Il peut augmenter le temps de démarrage de l' application de façon spectaculaire, et sur les appareils plus anciens peuvent causer Application Not Responding des échecs.

Multidex, bien qu'efficace, devrait être évité si possible.

Comment éviter la limite:

Avant de configurer votre application pour permettre l'utilisation de références de méthode 64 Ko ou plus, vous devez prendre des mesures pour réduire le nombre total de références appelées par votre code d'application, y compris les méthodes définies par votre code d'application ou les bibliothèques incluses. Les stratégies suivantes peuvent vous aider à éviter d’atteindre la limite de référence dex:

  • Examinez les dépendances directes et transitives de votre application - Assurez-vous que toute dépendance de bibliothèque importante que vous incluez dans votre application est utilisée d'une manière qui dépasse la quantité de code ajoutée à l'application. Un anti-pattern commun est d'inclure une très grande bibliothèque car quelques méthodes utilitaires étaient utiles. La réduction des dépendances du code de votre application peut souvent vous aider à éviter la limite de référence dex.
  • Supprimez le code inutilisé avec ProGuard - Configurez les paramètres ProGuard pour que votre application exécute ProGuard et assurez-vous que la réduction des créations est activée. L'activation du rétrécissement garantit que vous ne livrez pas de code inutilisé avec vos APK.

Le premier point nécessite une diligence et une discipline de la part du développeur. Lors de l'intégration de bibliothèques tierces, il faut tenir compte de la taille de la bibliothèque. Par exemple, deux bibliothèques JSON populaires sont Jackson et Gson. Fonctionnellement, ils sont assez similaires, mais Gson a tendance à voir une plus grande utilisation dans Android. L’une des raisons est que Jackson pèse environ 9 000 méthodes, alors que Gson en contribue 1 900.

Plusieurs outils sont disponibles pour aider les développeurs à suivre la taille de leur application:

  • dexcount-gradle-plugin indique le nombre de références de méthode dans votre APK ou AAR sur chaque version
  • dex-method-count est un outil en ligne de commande qui compte le nombre de références de méthode dans un APK
  • www.methodscount.com est un service Web qui comptera les références de méthode dans tout fichier APK que vous téléchargez.

Multidex et la limite de méthode Dex Exemples Liés