То, на что вы смотрите, это байт-код davlik.Код Java переводится в байт-код Dalvik с помощью инструмента dx.Манифест - это отдельная проблема, о которой я расскажу через минуту.Фактически, когда вы компилируете свое приложение Android, инструмент dx преобразует ваш код Java в байт-код (так же, как javac преобразует байт-код Java в Java для стандартного приложения JVM), используя 256 кодов операций dalvik.
Например, invoke-super
- это код операции, который инструктирует dvm (виртуальная машина dalvik) вызывать метод в суперклассе.Точно так же invoke-interface
инструктирует dvm для вызова метода интерфейса.
Итак, вы можете видеть, что
super.onCreate(savedInstanceState);
преобразуется в
invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)
В этом случае invoke-super
принимает два параметра, группу {p0,p1
и параметр Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)
, который представляет собой спецификацию метода, которую он использует для поиска и разрешения метода при необходимости.
Затем в вызове invoke-direct
область конструктора.
invoke-direct {p0}, Landroid/app/Activity;-><init>()V
У каждого класса есть метод init
, который используется для инициализации членов данных класса, также известных как конструктор.Когда вы создаете класс, виртуальная машина также должна вызывать конструктор суперкласса.Это объясняет, почему конструктор для вашего класса вызывает конструктор Activity
.
Что касается манифеста, что происходит (это все в спецификациях Dalvik, если вы проверяете исходный код), что компилятор (который генерирует файл apk) преобразует манифест в более сжатый формат (двоичный файл xml) для экономии места.Манифест не имеет ничего общего с кодом, который вы разместили, он больше инструктирует dvm о том, как обрабатывать приложение целиком в отношении Activities
, Services
и т. Д. То, что вы опубликовали, это то, что на самом делеисполняется.
Это ответ высокого уровня на ваш вопрос.Если вам нужно больше, дайте мне знать, и я сделаю все возможное.
Редактировать Вы в основном правы.Декомпилятор считывает двоичные данные как поток байтов из файла dex.Он понимает, каким должен быть формат, и способен извлекать такую информацию, как константы, классы и т. Д. Что касается кодов операций, это именно то, что он делает.Он понимает, каково значение байта для каждого кода операции (или как оно представлено в файле dex), и может преобразовать его в удобочитаемую строку.Если бы вы собирались реализовать это, помимо понимания общих основ компиляторов, я бы начал с глубокого понимания структуры файла dex.Оттуда вам нужно будет создать таблицу, которая сопоставляет значения кода операции с удобочитаемой строкой.С помощью этой информации и некоторой дополнительной информации о строковых константах и т. Д. Вы можете создать представление скомпилированного класса в текстовом файле.Это имеет смысл?