Es mágico para Android para localizar el recurso apropiado sólo a través de la R. id.XXX.

AFAIK, la recopilación de recursos en formato binario, así que, ¿cómo esta asignación lógica de trabajo bajo el capó?

Tal vez esto funciona así:

Para, por ejemplo, en el layout1.xml, tenemos:

<Button android:id="@+id/button1" >

y AAPT va a generar esto en el R.java:

public static final int button1=0x7f05000b;

Cuando el *.apk es genrated, el @+id/button1 con ser substituded con «0x7f05000b».

Por lo tanto, cuando nos llame:

findViewById(R.id.button1);

esencialmente estamos todavía hacer la búsqueda basada en la IDENTIFICACIÓN, a pesar de que el ID es un número como 0x7f05000b.

Gracias!

AGREGAR

Lo que realmente quiero saber, es como el identificador de recursos entero se analiza en el contenido del recurso? En otras palabras, ¿cómo es el tiempo de ejecución de Android localizar el contenido del recurso con el id de recursos como la única pista?

Por ejemplo, ¿cómo es un dibujable imagen que se encuentra con un identificador de recursos? O cómo es un valor de cadena se encuentra con un identificador de recursos?

InformationsquelleAutor smwikipedia | 2011-06-29

5 Comentarios

  1. 176

    Al momento de la construcción, la aapt herramienta recopila todos los recursos que se han definido (aunque por separado o de los archivos de definiciones explícitas en los archivos) y asigna los Identificadores de recursos para ellos.

    Un recurso ID es un número de 32 bits de la forma: PPTTNNNN. El PP es el paquete de recursos es para; TT es el tipo de los recursos; NNNN es el nombre del recurso en ese tipo. Para aplicaciones de recursos, que el PP es siempre 0x7f.

    El TT y NNNN valores son asignados por aapt arbitrariamente, básicamente para cada nuevo tipo el siguiente número disponible es asignado y utilizado (empezando por 1); de la misma manera para cada nuevo nombre de un tipo, el siguiente número disponible es asignado y utilizado (empezando por 1).

    Así que si tenemos estos archivos de recursos manejados por aapt en este orden:

    layout/main.xml
    drawable/icon.xml
    layout/listitem.xml

    El primer tipo que vemos es «diseño», de modo que se da TT == 1. El primer nombre en virtud de que el tipo es «principal», de modo que se da NNNN == 1. El final de ID de recurso es 0x7f010001.

    Siguiente vemos «dibujable», de modo que se da TT == 2. El primer nombre para ese tipo es el «icono» de modo que obtiene NNNN == 1. El final de ID de recurso es 0x7f020001.

    Vemos otro «diseño», que ha TT == 1 como antes. Esto tiene un nombre nuevo «listitem», de modo que se obtiene el siguiente valor NNNN == 2. El final de ID de recurso es 0x7f010002.

    Nota que aapt por defecto no hace ningún intento de mantener estos identificadores de la misma entre generaciones. Cada vez que los recursos que cambiar, todos ellos pueden obtener nuevos identificadores. Cada vez que se construye un nuevo R.java se crea con el actual identificadores por lo que su código se obtiene los valores correctos. Debido a esto, usted nunca debe persistir identificadores de recursos en cualquier lugar en donde pueden ser utilizados a través de diferentes versiones de tu aplicación.

    Una vez que la recopilación de recursos y los identificadores asignados, aapt genera el R.java archivo de código fuente y un archivo binario llamado «de los recursos.arsc» que contiene todos los nombres de los recursos, los identificadores, y los valores (por los recursos que provienen de archivo independiente, su valor es la ruta de acceso a ese archivo en el .apk), en un formato que puede fácilmente mmapped y analizar en el dispositivo en tiempo de ejecución.

    Usted puede obtener un resumen de los recursos.arsc archivo en un apk con el comando «aapt volcado de recursos <path-to-apk>».

    El formato de los binarios de la tabla de recursos está documentado en el archivo de encabezado para el recurso de estructuras de datos aquí:

    https://github.com/android/platform_frameworks_base/blob/master/libs/androidfw/include/androidfw/ResourceTypes.h

    La plena aplicación para la lectura de la tabla de recursos en el dispositivo está aquí:

    https://github.com/android/platform_frameworks_base/blob/master/libs/androidfw/ResourceTypes.cpp

    • muy detallado! muchas gracias!
    • Por CIERTO, son estos detalles documentados en algún lugar?
    • Los detalles de la implementación no están documentados, además de la estructura de las definiciones de I enlace aquí.
    • Me recuerda a las famosas palabras de Linus:»RTFSC»…
    • los enlaces están muertos
    • He actualizado
    • Por CIERTO, en mi humilde opinión, «RTFSC» está mal. La fuente es una interpretación de la especificación y se puede cambiar. Si no hay ninguna especificación, el comportamiento es oficialmente indefinido. La lectura de la fuente sólo le dice lo que el autor pensaba que el spec significó en el momento en que la escribió. Se indica lo que sucede ahora, pero no es lo que se a suceder más tarde. Todavía Dianne excelente explicación probablemente le dará lo que usted necesita saber y siguen siendo pertinentes para el futuro previsible.
    • Creo que RTFSC es correcto aquí como la pregunta en primer lugar es de aproximadamente bajo el capó cosas (que nunca es oficialmente spec’d), no se API. La interna de la especificación es la SC 🙂
    • Son referencias a cadenas y otros valores en XML resuelto en la compilación o en tiempo de ejecución? <TextView text=»@string/foo» />?

  2. 5

    De lo que yo entiendo, aapt se auto-generar Identificadores únicos para cada uno de sus recursos y almacenarlos en una tabla. Esta tabla se conserva como el «de los recursos.arsc» archivo ubicado en «bin/recursos.ap_» (este es sólo un archivo ZIP, así que siéntase libre para abrir favorito utilizando el ZIP del visor). La tabla también persiste como R.java que ya sabéis que permite hacer referencia a los recursos en Java.

    Si quieres más información sobre el archivo ARSC, sugiero buscar en Google, o revisar el código de http://code.google.com/p/android-apktool/.

    -Dan

    • Gracias por la pista importante. Voy a tomar una búsqueda. Voy a marcar su respuesta, si no es mejor que aparezca uno. Gracias.
    • Ahora me pregunto ¿cuál es el esquema de la tabla?
  3. 1

    Una nota final: para el tiempo más largo, yo no lo uso relativo de los diseños debido a que muchos de los artículos tienen que hacer referencia a los elementos más abajo en el archivo xml, y yo no sabía cómo hacer referencia a un @id/foo que no había sido definidos todavía.

    <!-- doesn't work -->
    <TextView android:layout_above="@id/foo">above</textview>
    <TextView android:id="@+id/foo">below</textview>

    Entonces un día me di cuenta (duh) que puede definir un identificador de la referencia; no tiene que ser en el elemento que lleva el id:

    <!-- works -->
    <TextView android:layout_above="@+id/foo">above</textview>
    <TextView android:id="@id/foo">below</textview>
  4. 0

    La magia está en el Eclipse plug-in y el R.java el archivo se genera en una aplicación del «gen» de la carpeta. Si usted mirada en este archivo, verá asignaciones estáticas para cada XXX en R. xx.XXX donde xx puede ser anim, arreglo, color, y cualquier otro tipo de recurso.

Dejar respuesta

Please enter your comment!
Please enter your name here