2013-11-14 3 views
0

Дэн Борнстейн говоритПолучить загруженный метод подсчета?

the bytecode instruction set doesn't have a way to refer to method numbers requiring more than 16 bits.

... который немного тревожным для тех, кто пердеж вокруг с вторичной DEX нагрузки, потому что они работают на большой, развалившись приложение, которое попадает в 64K методы за ограничение файла. Похоже, да, у вас может быть приложение с сотнями тысяч методов, но при этом вы создали бомбу замедленного действия: рано или поздно какой-то постоянный пользователь будет использовать достаточное количество кодов, которые Dalvik загружает достаточно классов, которые загружали количество методов превышает 65 536, и ваше приложение будет аварийно завершено.

Мы facing just this issue, и меня попросили узнать, есть ли способ узнать, сколько методов действительно было загружено. Я ткнул в JavaDoc и сделал несколько Googling, и придумал пустой. Отсюда мой вопрос:

Есть ли способ узнать, во время выполнения, сколько методов действительно было загружено? (Без повторной компиляции Dalvik, чтобы разоблачить эту информацию!)

+0

Прошу прощения, но, конечно: вы написали '64K методов на файл'? Значит, у вас есть файл с 64K методами? Или я неправильно истолковываю это? – Nanne

+0

Это 64K методов в apk, а не в одном исходном файле. И, да, наше приложение действительно настолько велико, даже после обрезки некоторых библиотек, которые мы используем. –

+0

Проверьте. Я понял, что вы имели в виду один исходный файл, поэтому я даже не мог понять, как это будет работать :). Все еще большой, но, возможно, менее смешной;) – Nanne

ответ

2

Ограничение метода 64K не связано с тем, сколько методов присутствует в VM во время выполнения. Речь идет о том, как много методов ссылаются в одном файле DEX. Любые сбои из-за чрезмерного количества методов будут происходить во время процесса преобразования «dx».

(Если вы посмотрите на инструкции по вызову метода bytecode format, вы увидите, что они включают в себя 16-разрядный индекс для целевого метода. Этот индекс предназначен для таблицы в формате DEX-файла, а не для VM- глобальная таблица.)

Единственное соответствующее ограничение времени выполнения - это объем памяти, необходимый для хранения метаданных (vtables и т. д.) для классов, полей и методов. Это то, что Facebook hacked around, чтобы получить очень большое приложение, работающее над более старыми версиями Android.

+0

Спасибо! Я никогда не смотрел на байтовые коды, поэтому неправильно понял, что сказал Дэн: «Я думал, что это 16-разрядный индекс в глобальной таблице VM, и решил, что вы просто не думали об этом, когда говорили:« Единственный практический предел на количество методов, которые могут быть загружены в память, накладывается размером LinearAlloc «еще в сентябре. –

Смежные вопросы