java

Archivos DEX (Dalvik Executable): Introducción

En los entornos Java estándar, el código fuente de Java es compilado en bytecode de Java, y almacenado en archivos .class. Los archivos .class son leídos por la máquina virtual Java en tiempo de ejecución. Cada clase en tu código Java se traducirá en un archivo .class. Esto significa que si tienes, por ejemplo, un archivo .java (código fuente) que contiene una clase pública, una clase interna estática, y tres clases anónimas, el proceso de compilación (javac) nos generará 5 archivos .class.

En la plataforma Android, el código fuente de Java también se compila en archivos .class. Pero después de generar los archivos .class, mediante la herramienta dx son convertidos a un único archivo dex (Dalvik Executable). Mientras que un archivo .class contiene una sola clase, un archivo .dex contiene múltiples clases. Es el archivo .dex el que se ejecuta en la máquina virtual Dalvik.

El archivo .dex ha sido optimizado para el mínimo consumo de memoria y el diseño esta condicionado por la reutilización de datos. El siguiente diagrama compara el formato de los archivos .class utilizado por la JVM con el formato de .dex utilizado por la máquina virtual Dalvik.

.jar vs .dex

A grandes rasgos las estructura de un Archivo .dex consta de las siguientes partes:

  • Cabecera
  • Tabla con las posiciones de los Strings
  • Tabla con las posiciones de los Tipos
  • Tabla con las posiciones de las estructuras/Prototipos de los métodos
  • Tabla con las posiciones de las Propiedades de las clases o Campos de los métodos
  • Tabla con las posiciones de los Métodos
  • Tabla con las posiciones de las Clases
  • Datos

Salvo la tabla de Strings (que es a la que hacen referencia todas las tablas ya que es en esta parte donde se almacenan todos los nombre de clases, métodos, funciones, variable y tipos de datos), el resto sigue un orden jerárquico inverso, es decir, si quisiéramos desensamblar el archivos dex, tras obtener el listado de Strings, obtendríamos el listado de Clases, sus métodos, sus propiedades y campos de los métodos, la estructura de dichos métodos – que relaciona métodos y campos – y por ultimo los tipos, que nos indicaría los tipos de los campos de los métodos y los tipos que devuelven los métodos. Es decir, es una estructura relacional, que tiene como objetivo el reaprovechamiento máximo de la información, evitando redundancias y así conseguir un formato optimo para terminales móviles.

Como he indicado, son tablas donde se indica la posición donde esta la información que compone dicha tabla, normalmente mediante un Offset y opcionalmente una longitud. Estos datos junto con el código maquina están en la sección de datos.

En próximos artículos iremos desgranando con mas detalle, cada parte de la estructura del formato Dalvik Executable.

Fuente 1:http://davidehringer.com/software/android/The_Dalvik_Virtual_Machine.pdf
Fuente 2:http://www.scribd.com/doc/17194679/DalvikVMInternals#

Primeros pasos con Buzz (segunda parte): Un widget de Buzz para WordPress

En el articulo anterior analizábamos la API de acceso a Buzz. Una vez analizada ya podemos ver como integrar Buzz en nuestra pagina. Para eso vamos a utilizar la API de Google para leer feeds y un script propio que lo que hará es mostrarnos el código HTML de los comentarios en in iframe refrescándolo cada 1 segundo. De este modo es posible crear un widget de Buzz para nuestro wordpress.

Antes de nada hay que tener en cuenta dos aspectos importantes:

  • Al estar usando librerías Ajax de Google es necesario que solicites una clave API propia:
    <script type=”text/javascript” src=”http://www.google.com/jsapi?key=ABQIAAAAMGph6fpNzf-ET0oBGVVHJxRpfcICevY5tQgqnPHEJCivekQnPxSD1FOWXFY6-VJtM6TmsT-tOJc9mg“></script>
  • En el lector de RSS debes indicar el RSS de tu cuanta de Buzz en el articulo anterior te explicamos como obtenerla.

    var feed = new google.feeds.Feed(“http://buzz.googleapis.com/feeds/111738004311961586383/public/posted”);

sample.html

[code lang="html"]





Iker.perez





[/code]

buzz.js
[code lang="javascript"]
google.load("feeds", "1");
var Editor;
window.onload = function()
{
Editor = document.getElementById(‘buzz_msg_box’).contentWindow.document;
Editor.designMode = "on";

}

function initialize() {
var feed = new google.feeds.Feed("http://buzz.googleapis.com/feeds/111738004311961586383/public/posted");
feed.setNumEntries(20);
feed.load(function(result) {
if (!result.error) {
var alltest = "";
var simplepost = "";
for (var i = 0; i < result.feed.entries.length; i++) {
simplepost = "";
var entry = result.feed.entries[i];

simplepost +’

’+entry.publishedDate.split(" -")[0]+’:
’+entry.content+’

\r\n’;
simplepost = simplepost +’


\r\n’;
//entry.title+"
"+;
alltest = alltest + simplepost ;

}
Editor.body.innerHTML = alltest;
}
});
}

function reloadComments() {
google.setOnLoadCallback(initialize);
setTimeout(‘reloadComments()’,1000);
}

reloadComments();
[/code]


Ikalbeniz



 Scroll to top