¿Comprender el desmontaje del código Dalvik?

Estoy jugando consmali y baksmali en una pequeña aplicación de Android Hello World que he escrito. Mi código fuente es:

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);
    }
}

que luego se desmontó para:

.class public Lcom/hello/Main;
.super Landroid/app/Activity;
.source "Main.java"


# direct methods
.method public constructor <init>()V
    .locals 0

    .prologue
    .line 6
    invoke-direct {p0}, Landroid/app/Activity;-><init>()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

Entiendo que se trata de algún tipo de representación intermedia, pero no estoy seguro de qué es. Según tengo entendido, debe haber alguna especificación sobre cómo entender esta representación, pero no puedo entender cómo buscarla. Entonces, dado un archivo apk, ¿alguien puede explicar en términos simples cómoDalvik opcode especificación se utiliza para llegar a esta representación? Mi comprensión actual es esta:

Dado un APK, podría extraer AndroidManifest.xml en formato XML binario y usar una herramienta comoaxml2xml.pl para obtener una versión "textual" del manifiesto que no está completa O podría usar elapktool para obtener una forma más legible. Pero todavía no estoy seguro de qué especificación están utilizando para convertir el XML binario en texto.Los desensambladores sonde alguna manera utilizando la especificación de código de operación Dalvil para leer los archivos dex y convertirlos en la representación anterior.

Cualquier información (tal vez con algunos ejemplos simples) sobre los dos pasos anteriores me ayudaría de manera excelente a entender los conceptos correctamente.

Actualización 1 (publicada después de la respuesta de Chris):

Entonces, esencialmente, haría lo siguiente para llegar al código de bytes de Dalvik:

Tome un apk y extráigalo para obtener los archivos classes.dex.

Luego, el desensamblador lee el archivo classes.dex y determina todas las clases presentes en el apk. ¿Me puede proporcionar alguna información sobre cómo se hace esto? ¿Analiza el archivo en modo hexadecimal y busca la especificación Dalvik y luego lo resuelve adecuadamente? ¿O está sucediendo algo más? Por ejemplo, cuando usé hexdump en classes.dex, me dio algo como esto:

64 65 78 0a 30 33 ...

¿Se utilizan ahora para las búsquedas de Opcode?

Suponiendo que la herramienta pudo separar el bytecode entrante en clases separadas, ¿continúa escaneando los códigos hexadecimales del archivo classes.dex y utiliza la especificación Davlik para generar el nombre de Opcode apropiado de la tabla?

En realidad, en resumen, estoy interesado en saber cómo se hace toda esta "magia". Entonces, por ejemplo, si tuviera que aprender a escribir esta herramienta, ¿cuál es la hoja de ruta de alto nivel que debería seguir?

Respuestas a la pregunta(1)

Su respuesta a la pregunta