web-dev-qa-db-fra.com

Comment résoudre le problème avec la limitation du compilateur Dalvik sur les méthodes 64K?

Mon équipe et moi avons hérité d'un grand projet Android d'une autre équipe. L'ensemble de l'application avec toutes les bibliothèques incluses aurait environ 35000 méthodes. Nous avons maintenant la tâche d'implémenter un nouveau service dans l'application où nous devons utiliser les tampons de protocole.

Le problème est que le fichier .jar généré avec tous les fichiers .proto requis crée un autre couple de 35000 méthodes, soit 70000 méthodes. Et si vous n'êtes pas au courant, le compilateur Android a une limitation de 65536 méthodes par fichier .dex. Nous dépassons clairement cette limite et nous obtenons l'erreur suivante en essayant de compiler l'application:

Unable to execute dex: method ID not in [0, 0xffff]: 65536
Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536

Oui, l'architecture de l'application devrait probablement être restructurée mais cela prendra du temps. Et pour l'instant, nous essayons de trouver une solution pour contourner temporairement ce problème.

Aucune suggestion?

27
Ricardo Amaral

Vous pouvez utiliser un autre fichier DEX. Voici comment procéder:

http://Android-developers.blogspot.co.il/2011/07/custom-class-loading-in-dalvik.html

12
Udinic

Activez Proguard ( http://developer.Android.com/tools/help/proguard.html ) pour supprimer les méthodes inutilisées. Le générateur de protobuf crée des milliers de méthodes qui ne sont jamais réellement utilisées.

Les micro-protobuffers ( https://code.google.com/p/micro-protobuf/ ) peuvent également être utiles.

7
fadden

Square avait des problèmes similaires et ils ont construit Wire pour faire face à l'explosion de la méthode causée par les protobufs. Ils affirment avoir tué 10 000 méthodes.

4
Abhay Buch

Dans les versions des services Google Play antérieures à la version 6.5, vous deviez compiler l'intégralité du package d'API dans votre application. Dans certains cas, cela a rendu plus difficile de maintenir le nombre de méthodes dans votre application (y compris les API d'infrastructure, les méthodes de bibliothèque et votre propre code) sous la limite de 65 536.

À partir de la version 6.5, vous pouvez plutôt compiler de manière sélective les API du service Google Play dans votre application. Par exemple, pour inclure uniquement l'API Google Fit et Android Wear), remplacez la ligne suivante dans votre fichier build.gradle:

compile 'com.google.Android.gms:play-services:6.5.87'

avec ces lignes:

compile 'com.google.Android.gms:play-services-fitness:6.5.87'
compile 'com.google.Android.gms:play-services-wearable:6.5.87'

pour plus de référence, vous pouvez cliquer sur ici

4
akshay

S'il s'agit de la première utilisation de tampons de protocole, vous pouvez envisager d'autres implémentations JavaME, c'est-à-dire.

il y en a d'autres listés dans Add ons tiers . S'ils n'en ont utilisé aucun, mais ils semblent être plus petits et n'ont pas toutes les méthodes créées par les tampons de protocole standard.

1
Bruce Martin

Nous avons récemment ajouté Nano Protobufs à Android ce qui réduit considérablement le nombre de méthodes générées.

1
Wink Saville

Si vous utilisez Eclipse, c'est le travail le plus simple Cliquez ici!

0
mboy