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 compte environ 35000 méthodes. Nous avons maintenant la tâche de mettre en place un nouveau service dans l'application où nous devons utiliser Protocol Buffers.

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 ne le savez pas, le compilateur Android a une limitation de 65536 méthodes par fichier .dex. Nous dépassons nettement cette limite et nous obtenons l'erreur suivante en essayant de compiler l'application:

  • Optimiser le fichier de manifeste Android pour le plus grand nombre de périphériques pris en charge
  • Comment développer une application dotée d'add-ons?
  • GridLayout (pas GridView) - Espaces entre les cellules
  • Comment utiliser NumberPicker dans l'application Android avec API 7?
  • Lame de dague de Gradle: ignorez par paquet
  • Comment un AsyncTask utilise-t-il encore une Activité si l'utilisateur a déjà navigué loin de là?
  • 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?

  • Définition programmée sur Android: layout_centerHorizontal
  • Android: la mise en page semble désordonnée dans certains appareils
  • Le module de test Android (Gradle Plugin 1.3) ne fonctionne pas: "débug-classes not found"
  • Comment définit-je les RecyclerViews imbriqués, tout en restant performant?
  • Application pour surveiller d'autres applications sur Android
  • Débogage sur Moto 360
  • 7 Solutions collect form web for “Comment résoudre le problème avec la limitation du compilateur Dalvik sur les méthodes 64K?”

    Vous pouvez utiliser un autre fichier DEX. Voici comment vous le faites:

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

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

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

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

    Dans les versions des services Google Play avant 6.5, vous devez compiler le paquet complet d'API dans votre application. Dans certains cas, il a rendu plus difficile de garder le nombre de méthodes dans votre application (y compris les API de framework, 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 sélectivement les API du service Google Play dans votre application. Par exemple, pour inclure uniquement les 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 ici

    Si c'est la première utilisation des tampons de protocole, vous pouvez regarder d'autres implémentations JavaME c.-à-d.

    • Protobuf-javame
    • Protobuf-j2me

    Il y en a d'autres dans les add ons de tiers . Si vous n'avez utilisé aucun d'entre eux, ils semblent être plus petits et ne disposent pas de toutes les méthodes créées par les tampons de protocole standard.

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

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

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.