web-dev-qa-db-fra.com

Est-ce que le Android Art Runtime a-t-il la même méthode limite les limites que Dalvik?

Est-ce que le Android Art Runtime a la même méthode limite les limites de Dalvik? Actuellement, il y a une limite de méthodes de 64k dans le fichier de dex primaire

42
ajma

Le problème n'est pas avec le fichier d'exécution Dalvik ni le format de fichier DEX, mais avec l'ensemble actuel de instructions DALVIK . Plus précisément, les différentes méthodes d'invocation de la méthode, qui ressemblent à ceci:

invoke-kind {vC, vD, vE, vF, vG}, meth@BBBB

B: method reference index (16 bits)

Vous pouvez faire référence à un très grand nombre de méthodes dans un fichier Dex, mais vous ne pouvez invoquer que le premier 65536, car c'est toute la pièce que vous avez dans l'instruction d'invocation de la méthode.

J'aimerais souligner que la limitation est sur le nombre de méthodes référencées , pas le nombre de méthodes défini . Si votre fichier DEX n'a ​​que quelques méthodes, mais ensemble, ils appellent 70 000 méthodes définies à l'extérieur, vous allez dépasser la limite.

Une façon de résoudre ce problème consiste à ajouter des instructions supplémentaires prenant des références de méthodes plus larges. Une approche appelée "Jumbo Opcodes" a été mise en œuvre et libérée dans Android 4.0 (ICS), mais n'a jamais été entièrement mise en action, et a été retirée ultérieurement de l'arbre . (Je vois occasionnellement des messages ici avec des messages d'erreur de "DX" que les jumbo ops de référence ou des développeurs qui ont trébuché dessus .).

Notez que ce n'est pas le problème résolu par le hack Facebook Hack . Cela est dû à un tampon de taille fixe pour maintenir la classe/méthode/les méta-ondes de terrain. Il n'y a pas de limite spécifique à la méthode là-bas; Vous pouvez souffler le tampon en ayant beaucoup de champs.

Je crois comprendre que la mise en œuvre actuelle de l'art gère le même ensemble d'instructions que Dalvik le fait, la situation ne sera donc pas différente.

74
fadden

Anwar ghuloum a dit à -- ceci Android Developers Episode de Backstage pour lesquels ils ne vont pas réparer le bytecode dans un proche avenir.
Au lieu de, à partir de Android L Ils prennent en charge de manière native multi-dex en réduisant tous les fichiers Dex (à partir d'un APK) dans un seul fichier d'avoine.

5
Alex Lipov