texto - ¿Cómo funciona la asignación entre los recursos de Android y la ID de recursos?
strings.xml español (5)
Para Android es mágico ubicar el recurso adecuado solo a través de R.id.XXX .
AFAIK, los recursos están compilados en formato binario, entonces, ¿cómo funciona esta lógica de mapeo bajo el capó?
Tal vez funciona así:
Por ejemplo, en el layout1.xml , tenemos:
<Button android:id="@+id/button1" >
y AAPT generará esto en R.java:
public static final int button1=0x7f05000b;
Cuando genna * .apk, el @ + id / button1 se sustituye por "0x7f05000b".
Por lo tanto, cuando llamamos:
findViewById(R.id.button1);
esencialmente seguimos haciendo la búsqueda basada en la ID, aunque la ID es un número como 0x7f05000b.
¡Gracias!
AÑADIR
Lo que realmente quiero saber es cómo se analiza el entero de la identificación del recurso en el contenido del recurso. En otras palabras, ¿cómo el tiempo de ejecución de Android ubica el contenido del recurso con la identificación del recurso como la única pista?
Por ejemplo, ¿cómo se encuentra una imagen dibujable con una identificación de recurso? ¿O cómo se encuentra un valor de cadena con una identificación de recurso?
En tiempo de compilación, la herramienta aapt recopila todos los recursos que ha definido (a través de archivos separados o definiciones explícitas en archivos) y les asigna identificadores de recursos.
Un ID de recurso es un número de 32 bits del formulario: PPTTNNNN. PP es el paquete para el que es el recurso; TT es el tipo de recurso; NNNN es el nombre del recurso en ese tipo. Para recursos de aplicaciones, PP siempre es 0x7f.
Los valores TT y NNNN son asignados por aapt arbitrariamente; básicamente, para cada tipo nuevo, se asigna y usa el siguiente número disponible (comenzando por 1); Del mismo modo, para cada nuevo nombre en un tipo, el siguiente número disponible se asigna y se usa (comenzando con 1).
Entonces, 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", por lo que se le da TT == 1. El primer nombre bajo ese tipo es "main", por lo que se le da NNNN == 1. El ID del recurso final es 0x7f010001.
Luego vemos "dibujable", por lo que se le da TT == 2. El primer nombre para ese tipo es "icono", de modo que obtiene NNNN == 1. El ID del recurso final es 0x7f020001.
Por último, vemos otro "diseño" que tiene TT == 1 como antes. Esto tiene un nuevo nombre "listitem", por lo que obtiene el siguiente valor NNNN == 2. El ID del recurso final es 0x7f010002.
Tenga en cuenta que aapt de forma predeterminada no intenta mantener estos identificadores entre las compilaciones. Cada vez que cambian los recursos, todos pueden obtener nuevos identificadores. Cada vez que se crean, se crea un nuevo R.java con los identificadores actuales para que su código obtenga los valores correctos. Debido a esto, nunca debe persistir en los identificadores de recursos en ningún lugar donde puedan ser utilizados en diferentes compilaciones de su aplicación.
Una vez que los recursos están compilados y los identificadores asignados, aapt genera el archivo R.java para su código fuente y un archivo binario llamado "resources.arsc" que contiene todos los nombres de recursos, identificadores y valores (para los recursos que provienen de un archivo separado) , su valor es la ruta a ese archivo en .apk), en un formato que puede mapearse y analizarse fácilmente en el dispositivo en tiempo de ejecución.
Puede obtener un resumen del archivo resources.arsc en una apk con el comando "aapt dump resources <path-to-apk>".
El formato de la tabla de recursos binarios está documentado en el archivo de encabezado para las estructuras de datos de recursos aquí:
La implementación completa para leer la tabla de recursos en el dispositivo está aquí:
https://github.com/android/platform_frameworks_base/blob/master/libs/androidfw/ResourceTypes.cpp
La magia está en el complemento Eclipse y el archivo R.java se genera automáticamente en la carpeta "gen" de una aplicación. Si echas un vistazo a este archivo, verás asignaciones estáticas para cada XXX en R.xx.XXX donde xx puede ser anim, array, color y cualquier otro tipo de recurso.
Por lo que entiendo, aapt generará automáticamente identificadores únicos para cada uno de sus recursos y los almacenará en una tabla de búsqueda. Esta tabla de búsqueda persiste como el archivo "resources.arsc" ubicado en "bin / resources.ap_" (esto es solo un archivo ZIP, así que siéntase libre de abrir usando su visor ZIP favorito). La tabla de búsqueda también persiste como R.java, que como usted sabe le permite hacer referencia a sus recursos en Java.
Si desea obtener más información sobre el archivo ARSC, sugeriría buscar en Google o revisar el código de http://code.google.com/p/android-apktool/ .
-Dan
Si está interesado en la implementación interna (lado del dispositivo) eche un vistazo a loadDrawable () en Resources.java . Consulte la excelente respuesta de hackbod para obtener información sobre cómo https://github.com/android/platform_frameworks_base/blob/master/libs/androidfw/ResourceTypes.cpp tabla de recursos.
Para saber cómo se traducen los diseños a View desde el LayoutInfater ID de recurso LayoutInfater .java
Una nota final: durante el tiempo más largo, no usé diseños relativos porque muchos elementos necesitan referenciar elementos más abajo en el archivo xml, y no sabía cómo hacer referencia a un @ id / foo que no se había definido 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) de que puedes definir una identificación en la referencia; no tiene que estar en el elemento que lleva la identificación:
<!-- works -->
<TextView android:layout_above="@+id/foo">above</textview>
<TextView android:id="@id/foo">below</textview>