La tabla strings, es una estructura que contiene las posiciones de los recursos string que utiliza nuestra aplicación. En esta lista de strings tendremos desde nombres de clases, métodos, variables o constantes que nos indicaran el tipo de los datos. Es una lista ordenada ya que desde otras estructuras se hará referencia a los strings en función de su posición en la lista. Es decir, en el proceso de compilación, se extraen los strings de todas las estructuras y código, se eliminan duplicados y se meten en una lista ordenada, por lo que a partir de entonces, ahí donde había un string ahora hay un entero que hace referencia a la posición del string en la lista. Con esto se consigue reducir el tamaño de la aplicación evitando la redundancia de recursos.
Para entenderlo mejor, a partir de este momento vamos a desensamblar, paso a paso, un archivo .dex de ejemplo que hemos obtenido a partir de este ejemplo http://marakana.com/forums/android/examples/49.html que es pequeño y usa la NDK (de cara a ser un ejemplo relativamente completo).
Analizando la cabecera como explicamos en el artículo anterior obtenemos el offset o desplazamiento desde el inicio del fichero donde empieza la tabla de posiciones de los strings, y el numero de strings. Por tanto obtenemos que la tabla de strings empieza en la posición 0×00000070 y que tiene 79 (0x0000004F) elementos. Por tanto deberemos recorrer el archivo desde la posición 0×00000070 en bloques de 32bist, 79 veces para obtener la posición de los 79 strings.

En el ejemplo de la imagen superior recorremos los tres primeros strings. La estructura de cada string es, un byte que indica la longitud del string y a continuación el string, por tanto, el primer string esta en la posición 0x0000084E, su longitud es de 0×08 caracteres y su valor es “<clinit>”. El segundo string esta en la posición 0×00000858, es de longitud 0×06 y valor “<init>”, el tercero esta en la posición 0×00000860 es de longitud 0×01 y valor “I”. Seguiríamos así con los 79 strings, con lo que en el ejemplo de la imagen obtendríamos la siguiente lista.
- <clinit>
- <init>
- I
- III
- IL
- L
- LI
- Landroid/app/Activity;
- Landroid/os/Bundle;
- Landroid/text/Editable;
- Landroid/view/View$OnClickListener;
- Landroid/view/View;
- Landroid/widget/Button;
- Landroid/widget/EditText;
- Landroid/widget/TextView;
- Lcom/marakana/NDKDemo$1;
- Lcom/marakana/NDKDemo;
- Lcom/marakana/NativeLib;
- Lcom/marakana/R$attr;
- Lcom/marakana/R$drawable;
- Lcom/marakana/R$id;
- Lcom/marakana/R$layout;
- Lcom/marakana/R$string;
- Lcom/marakana/R;
- Ldalvik/annotation/EnclosingClass;
- Ldalvik/annotation/EnclosingMethod;
- Ldalvik/annotation/InnerClass;
- Ldalvik/annotation/MemberClasses;
- Ljava/lang/CharSequence;
- Ljava/lang/Integer;
- Ljava/lang/Object;
- Ljava/lang/String;
- Ljava/lang/System;
- NDKDemo.java
- NativeLib.java
- R.java
- TextView01
- V
- VI
- VL
- accessFlags
- add
- app_name
- attr
- buttonCalc
- drawable
- findViewById
- getText
- hello
- helloText
- icon
- id
- layout
- loadLibrary
- main
- name
- nativeLib
- ndk_demo
- onClick
- onCreate
- outText
- parseInt
- res
- result
- savedInstanceState
- setContentView
- setOnClickListener
- setText
- string
- textOut
- this
- this$0
- toString
- v
- v1
- v2
- value
- value1
- value2
A partir de ahora las siguientes estructuras que vayamos desensamblando harán referencia a esta lista de strings.