90 votes

Comment réduire le code - limite de méthode 65k dans dex

J'ai une assez grande application Android qui s'appuie sur de nombreux projets de la bibliothèque. Le Android compilateur a une limitation de 65536 méthodes par .dex fichier et je suis dépassement de ce nombre.

En gros, il existe deux chemins que vous pouvez choisir (à moins que je sache) quand vous frappez la méthode de limite.

1) réduire votre code

2) Construire plusieurs dex fichiers (voir ce blog)

Je l'ai regardé en deux et essayé de savoir quelle était la cause de ma méthode de comptage d'aller si haut. Le Google Drive de l'API prend le plus gros morceau avec la Goyave dépendance à plus de 12 000. Total des libs pour le Lecteur API v2 atteindre plus de 23 000!

Ma question je suppose, qu'en pensez-vous dois-je faire? Dois-je enlever intégration à Google Drive comme une caractéristique de mon application? Est-il un moyen pour réduire l'API vers le bas (oui, j'utilise proguard)? Dois-je aller les multiples dex route (ce qui est plutôt douloureux, et notamment avec le tiers Api)?

68voto

Jared Rummler Points 661

On dirait que Google a enfin la mise en œuvre d'une solution de contournement/fix pour dépassement de la 65K méthode limite de dex fichiers.

Sur le 65K Limite de Référence de l'application Android (APK) fichiers contiennent des exécutable fichiers bytecode dans la forme de Dalvik Executable (DEX) les fichiers qui contiennent le code compilé utilisé pour exécuter votre application. L' Dalvik Executable limites de spécification du nombre total de méthodes qui peuvent être référencés dans une seule DEX fichier à 65 536, y compris Android cadre des méthodes, des méthodes de bibliothèques, et des méthodes dans votre propre code. Aller au-delà de cette limite, vous devez configurer votre application processus de génération pour générer plus d'un fichier DEX, connu comme un multidex la configuration.

Multidex le support avant de Android 5.0

Les Versions de la plate-forme avant d'Android 5.0 utiliser le Dalvik runtime pour l'exécution de code de l'application. Par défaut, Dalvik limites des applications à un seul des classes.dex fichier bytecode par APK. Afin de contourner ce problème limitation, vous pouvez utiliser le multidex bibliothèque de prise en charge, qui devient une partie de la primaire DEX fichier de votre application, puis gère l'accès à la le supplément de DEX fichiers et le code qu'ils contiennent.

Multidex support pour Android 5.0 et supérieur

Android 5.0 et supérieur utilise un moteur d'exécution ART qui nativement prend en charge le chargement de plusieurs dex fichiers de l'application des fichiers APK. L'ART réalise des pré-compilation au moment de l'installation de l'application qui analyse les classes(..N).dex fichiers et les compile en un seul .avoine fichier pour l'exécution par l'appareil Android. Pour plus d'informations sur l'Android 5.0 moment de l'exécution, voir l'Introduction de l'ART.

Voir: la création d'Applications avec Plus de 65K Méthodes


Multidex Bibliothèque De Prise En Charge

Cette bibliothèque fournit un soutien pour la construction de les applications avec plusieurs Dalvik Executable (DEX) des fichiers. Applications de référence plus de 65536 méthodes sont nécessaires à l'utilisation de multidex configurations. Pour plus d'informations sur l'utilisation de multidex, voir la création d'Applications avec Plus de 65K Méthodes.

Cette bibliothèque est située dans l' /extras/android/support/multidex/ répertoire après avoir télécharger le Android Bibliothèques de prise en charge. L' la bibliothèque ne contient pas de ressources d'interface utilisateur. Pour l'inclure dans votre projet d'application, suivez les instructions pour l'Ajout de bibliothèques sans ressources.

Le script de build Gradle dépendance identificateur pour cette bibliothèque est comme suit:

com.android.support:multidex:1.0.+ Cette dépendance de la notation précise la version 1.0.0 ou plus.


Vous devriez toujours éviter de heurter la 65K méthode limite en utilisant activement proguard et l'examen de vos dépendances.

7voto

petey Points 5823

Utilisation proguard pour alléger vos apk en tant que méthodes qui sont inutilisés ne seront pas dans votre version finale. Double vérifier que vous avez les éléments suivants dans votre proguard fichier de configuration à utiliser proguard avec goyave (toutes mes excuses si vous avez déjà présent, il n'est pas connu au moment de la rédaction) :

# Guava exclusions (http://code.google.com/p/guava-libraries/wiki/UsingProGuardWithGuava)
-dontwarn sun.misc.Unsafe
-dontwarn com.google.common.collect.MinMaxPriorityQueue
-keepclasseswithmembers public class * {
    public static void main(java.lang.String[]);
} 

# Guava depends on the annotation and inject packages for its annotations, keep them both
-keep public class javax.annotation.**
-keep public class javax.inject.**

En outre, si vous utilisez ActionbarSherlock, de passer à la v7 appcompat bibliothèque de prise en charge permettra également de réduire votre méthode de comptage par beaucoup (basée sur l'expérience personnelle). Les Instructions sont situés :

7voto

pixel Points 4391

Vous pouvez utiliser Jar Jar Links pour réduire d’énormes bibliothèques externes telles que les services Google Play (méthodes 16K!).

Dans votre cas , vous aurez juste déchirer tout de Google Play jar services , sauf common internal et drive sous-packages.

3voto

Amjed Baig Points 81

3voto

prmottajr Points 1208

Je pense qu’à long terme, casser votre application en plusieurs dex serait la meilleure solution.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X