Имеет ли время исполнения Android ART те же ограничения ограничений метода, что и Dalvik? В настоящее время существует предел 64k методов в файле первичного dex
Имеет ли время исполнения Android ART те же ограничения, что и Dalvik?
Ответ 1
Проблема заключается не в времени исполнения Dalvik, а в формате DEX, но в текущем наборе инструкций Dalvik. В частности, различные методы вызова метода, которые выглядят следующим образом:
invoke-kind {vC, vD, vE, vF, vG}, [email protected]
B: method reference index (16 bits)
Вы можете ссылаться на очень большое количество методов в DEX файле, но вы можете использовать только первый 65536, потому что все пространство, которое вы имеете в инструкции вызова метода.
Я хотел бы указать, что ограничение относится к числу методов, на которые ссылается, а не к числу определенных методов. Если ваш файл DEX имеет только несколько методов, но вместе они называют 70 000 различных внешних методов, вы превысите предел.
Один из способов исправить это - добавить дополнительные инструкции, которые используют более широкие ссылки на методы. Подход под названием "jumbo opcodes" был реализован и выпущен в Android 4.0 (ICS), но никогда не был полностью введен в действие и позже был удален из дерева. (Иногда я вижу сообщения с сообщениями об ошибках из "dx", которые ссылаются на jumbo ops, или на разработчиков, которые наткнулись на них.)
Обратите внимание, что проблема не решена с помощью взлома Facebook. Это связано с буфером фиксированного размера для хранения метаданных класса/метода/поля. Там нет никакого конкретного метода; вы можете продуть буфер, имея много полей.
Я понимаю, что текущая реализация ART обрабатывает тот же набор инструкций, что и Dalvik, поэтому ситуация не будет отличаться.
Ответ 2
Анвар Гулум сказал в этом в Android-разработчике Backstage эпизод, что они не собираются исправлять байт-код в ближайшем будущем. Вместо этого, начиная с Android L, они будут поддерживать mult-dex, свернув все файлы dex (из APK) в один файл oat.