Что такое Smali Code Android

Я немного узнаю о Dalvik VM, dex и Smali.

Я читал о smali, но все еще не могу понять, где его место в цепочке компиляторов. И какова его цель.
Вот несколько вопросов:

  1. Как я знаю, dalvik, как и другие виртуальные машины, запускает байт-код, в случае Android это де-байтовый код.
  2. Что такое smali? ОС Android или Dalvik Vm работают с ним напрямую, или это один и тот же байт-код dex, но более читаемый для человека?
  3. Это что-то вроде дизассемблера для исполняемого файла Windows (например, OllyDbg), состоящего из кода разных машин (например, D3, 5F), и для каждого машинного кода имеется соответствующая команда сборки, но Dalvik Vm также является программным обеспечением, поэтому smali является читаемым представлением байткодов
  4. Существует новая среда для АРТ. Является ли он по-прежнему использовать байт-коды или он выполняет собственный код?

Заранее спасибо.

Ответ 1

Когда вы создаете код приложения, файл apk содержит файл.dex, который содержит двоичный байт-код Dalvik. Это формат, который платформа действительно понимает. Тем не менее, это не так просто читать или изменять двоичный код, поэтому есть инструменты для преобразования в читаемое представление и из него. Самый обычный читаемый для человека формат известен как Смали. Это по сути то же самое, что вы упомянули об этом.

Например, скажем, у вас есть Java-код, который делает что-то вроде

int x = 42

Предполагая, что это первая переменная, тогда код dex для метода, скорее всего, будет содержать шестнадцатеричную последовательность

13 00 2A 00

Если вы запустите baksmali, вы получите текстовый файл, содержащий строку

const/16 v0, 42

Это, очевидно, намного более читаемый, чем двоичный код. Но платформа ничего не знает о smali, это просто инструмент, облегчающий работу с байт-кодом.

Dalvik и ART берут файлы.dex, содержащие байт-коды dalvik. Он полностью прозрачен для разработчика приложений, единственное отличие - это то, что происходит за кулисами, когда приложение установлено и запущено.