Я играю с smali и baksmali в небольшом приложении для Android Hello World, которое я написал. Мой исходный код:
package com.hello;
import android.app.Activity;
import android.os.Bundle;
public class Main extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
, который затем был дизассемблирован до:
.class public Lcom/hello/Main;
.super Landroid/app/Activity;
.source "Main.java"
# direct methods
.method public constructor ()V
.locals 0
.prologue
.line 6
invoke-direct {p0}, Landroid/app/Activity;->()V
return-void
.end method
# virtual methods
.method public onCreate(Landroid/os/Bundle;)V
.locals 1
.parameter "savedInstanceState"
.prologue
.line 10
invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
.line 11
const/high16 v0, 0x7f03
invoke-virtual {p0, v0}, Lcom/hello/Main;->setContentView(I)V
.line 12
return-void
.end method
Я понимаю, что это своего рода промежуточное представление, но не уверен, что это такое. Насколько я понимаю, должна быть некоторая спецификация того, как понимать это представление, но я не могу понять, как его искать. Итак, учитывая apk-файл, может ли кто-нибудь объяснить непрофессиональным языком, как спецификация кода операции Dalvik используется для получения этого представления? На данный момент я понимаю следующее:
Любая информация (возможно, с некоторыми простыми примерами) о двух вышеупомянутых шагах очень помогла бы мне понять концепции.
Обновление 1 (опубликовано после ответа Криса):
По сути, я бы сделал следующее, чтобы получить байт-код Dalvik:
Затем дизассемблер читает файл classes.dex и определяет все классы, присутствующие в apk. Не могли бы вы предоставить мне некоторую информацию о том, как это делается? Разбирает ли файл в шестнадцатеричном режиме и ищет спецификацию Dalvik, а затем разрешает ее соответствующим образом? Или происходит что-то еще? Например, когда я использовал hexdump для classes.dex, он дал мне что-то вроде этого:
64 65 78 0a 30 33 ...
Используются ли они теперь для поиска кода операции?
Короче говоря, мне интересно узнать, как творится вся эта «магия». Так, например, если бы я научился писать этот инструмент, какой высокоуровневой дорожной карты мне следовало бы следовать?