Comment résoudre le problème avec Dalvik limitation de compilateur sur 64 KO méthodes?

Mon équipe et moi avons hérité d'un grand projet Android à partir 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 de mettre en œuvre un nouveau service dans l'application, où nous avons besoin d'utiliser des Tampons de Protocole.

Le problème est que le générés .fichier jar avec tout le nécessaire .proto fichiers crée un autre couple de 35000 méthodes, c'est 70000 méthodes. Et si vous n'êtes pas au courant, l'Android compilateur a une limitation de 65536 méthodes par .dex fichier. Nous sommes clairement au-dessus de 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 doit probablement être restructuré, mais cela prendra du temps. Et pour l'instant nous essayons de trouver une solution pour contourner temporairement ce problème.

Des suggestions?

  • Le Facebook de l'équipe vient de poster un message sur ce problème précis, l'autre jour. facebook.com/notes/facebook-engineering/...
  • Si votre application contient que de nombreuses méthodes (et vous ne pouvez pas vous débarrasser de certains d'entre eux), la solution sera probablement de la séparation de l'application dans les plus petites pièces qui peuvent être intégrées à séparer dex fichiers. Voir ce billet de blog pour un exemple de comment faire cela.
  • le Facebook problème était dû à un trop petit "LinearAlloc" tampon dans les anciennes versions d'Android (froyo, gingerbread). Les 64 KO de la méthode de référence limite est cuit dans le Dalvik instructions elles-mêmes.
  • Voir ce post [stackoverflow.com/questions/15209831/... [1]: stackoverflow.com/questions/15209831/...