LiteCoding

Заметки о программировании

smali2java: От лексем к сущностям

without comments

В прошлый раз я рассказал о том, как происходит разбор smali-файла. Но на этом цепочка превращений не заканчивается. Для того, чтобы впоследствии получить java-код, нужно сначала вычленить и распознать smali-сущности. Парсер возвращает нам лишь лексемы, но мы уже на этапе разбора можем создать экземпляры сущностей с помощью реализации интерфейса Visitor.

Для этого в пакете com.litecoding.smali2java есть 3 класса, заканчивающиеся на «Builder». Вообще, можно было создать и один класс, но для того, чтобы избежать в будущем проблем, связанных с классом-монстром, я выделил несколько групп сущностей, и создал иерархию наследования. Тем самым классом, с которым мы будем иметь дело, является SmaliClassBuilder. Он отвечает за генерацию макросущностей, таких как поля, методы, директивы компилятора smali.

Но наибольший интерес представляет метод generateCmdFromRules класса BasicSmaliBuilder. Как следует из кода, парсер занимается только разбором последовательности, похожей на сущность. Никакой валидации данных (за исключением соответствия строки правилу) не производится. Именно тут разбираются все параметры (как подсущности) и добавляются к команде.

Сами сущности находятся в пакете com.litecoding.smali2java.entity.smali, и по своему характеру они являются структурами, где хранятся разобранные данные. Тут особое внимание стоит обратить на класс OpcodeData, который является хранилищем команд. Он уже поддерживает все известные на данный момент команды, поэтому добавление новых команд сводится к написанию новых правил вида cmdXXXX. Но в данный момент мы говорим просто про разбор. Для того, чтобы научить правильно преобразовывать новые команды из smali-сущностей в java-сущности (которые затем можно будет отрендерить в исходный код на Java), нужно дописать дополнительную функциональную нагрузку в класс JavaRenderer (который, к слову, еще не написан). Появление такого класса ознаменует переход smali2java от pre-Alpha к alpha-стадии.

В следующей заметке мы поговорим о необходимости генерации блоков smali-сущностей, и как это реализовано в smali2java.

Share and Enjoy:
  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • LinkedIn
  • Tumblr

Written by Дмитрий Воробьев

Пятница, Январь 18th, 2013 at 06:22

Leave a Reply

You must be logged in to post a comment.