Что означает «количество строк» ​​в файле Dex для Android?

Из adt-21-preview DOC

Строительство

Появился новый флаг для включения режима jumbo для dex, который позволяет большее количество строк в файлах dex; установите dex.force.jumbo = true в project.properties

Я покрасил это что такое также -dex-method-and-string-limits-in-an-android-app , где @SamWise отвечает:

При включенном jumbo dex ограничение ссылки на строку находится где-то между 110 000 и 120 000 000.

Вопрос:

Что такое строка или ссылка на строку в Dex? Они имеют в виду переменную длину? Например, если я напишу:

private String foo = "fessy";

Означает ли это, что строка равна 3 или длина значения, в моем случае 5?


Подвопрос:

Я использовал следующий скрипт dex-method-counts для вычисления количества методов, но я этого не сделал. найдите любую ссылку для вычисления количества String.

Пожалуйста помоги,


person snaggs    schedule 26.10.2014    source источник


Ответы (2)


Все строковые константы хранятся в файле dex в одном отсортированном списке. Затем на строки ссылаются в другом месте файла dex по индексу в этом списке.

Эти строковые индексы обычно представляют собой 32-разрядное целое число без знака. Что касается фактических инструкций, есть 2 инструкции, которые могут ссылаться на строку: const-string и const-string/jumbo. Первый принимает 16-битный строковый индекс, а второй — 32-битный строковый индекс.

Таким образом, максимальное количество строк 2^32 = 4294967296.

person JesusFreke    schedule 26.10.2014
comment
Итак, в моем случае private String foo = "fessy"; является строковой константой 1? - person snaggs; 27.10.2014
comment
У строки не будет индекса, пока она не будет записана в файл dex, а затем это зависит от того, где она соответствует всем другим строкам в файле dex. - person JesusFreke; 27.10.2014

Чтобы ответить на конкретный вопрос ОП:

private String foo = "fessy";

Это добавит две новые записи в таблицу строк, при условии, что никакой другой класс не использует переменную с именем foo, а строка "fessy" больше нигде в вашем приложении не появляется.

Если несколько независимых классов используют одно и то же имя для своих переменных/строковых литералов, в таблицу строк будет добавлена ​​только одна запись. Это одна из причин следовать согласованным соглашениям об именах (в идеале на основе кода Android Framework). Помимо улучшения читаемости, это помогает снизить количество строк.

Вы можете легко проверить количество строк, сначала извлекая class.dex из файла apk, а затем выгружая 4 байта заголовка DEX по смещению 56 (см. Формат исполняемого файла Dalvik):

$ jar xvf app.apk classes.dex && hexdump -s 56 -n 4 -e '1/4 "%d\n"' classes.dex

Максимальное количество строк для файла dex (не в режиме Jumbo) составляет 2 ^ 16 = 65 536.

person friederbluemle    schedule 22.11.2016