¿Cómo funciona el mapeo entre los recursos de android y el ID de recursos?

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

AFAIK, los recursos se compilan en formato binario, así que ¿cómo funciona esta lógica de asignación bajo el capó?

Tal vez funciona así:

Por ejemplo, en el layout1.xml , tenemos:

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

Y AAPT generará esto en el R.java:

 public static final int button1=0x7f05000b; 

Cuando el * .apk es genrated, el @ + id / button1 con ser sustituido con "0x7f05000b".

Así, cuando llamamos:

 findViewById(R.id.button1); 

Esencialmente estamos haciendo la búsqueda basada en el ID, aunque el ID es un número como 0x7f05000b.

¡Gracias!

AÑADIR

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

Por ejemplo, ¿cómo se puede encontrar una imagen dibujable con un ID de recurso? ¿O cómo se encuentra un valor de cadena con un ID de recurso?

En el momento de la compilación, la herramienta aapt recopila todos los recursos que ha definido (aunque archivos separados o definiciones explícitas en archivos) y les asigna ID de recursos.

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

Los valores TT y NNNN son asignados arbitrariamente por aapt – básicamente para cada nuevo tipo se asigna y utiliza el siguiente número disponible (comenzando con 1); Del mismo modo para cada nuevo nombre en un tipo, se asigna y utiliza el siguiente número disponible (comenzando con 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 "disposición" de modo que se da TT == 1. El primer nombre bajo ese tipo es "principal" por lo que se da NNNN == 1. El ID de recurso final es 0x7f010001.

A continuación vemos "dibujable" por lo que se da TT == 2. El primer nombre para ese tipo es "icono" para que obtiene NNNN == 1. El ID de recurso final es 0x7f020001.

Por último vemos otro "layout" que tiene TT == 1 como antes. Esto tiene un nuevo nombre "listitem" para que obtiene el siguiente valor NNNN == 2. El ID de recurso final es 0x7f010002.

Tenga en cuenta que aapt por defecto no intenta mantener estos identificadores iguales entre las compilaciones. Cada vez que cambian los recursos, todos pueden obtener nuevos identificadores. Cada vez que se construyen, se crea un nuevo R.java con los identificadores actuales para que el código obtenga los valores correctos. Debido a esto, nunca debe identificar identificadores persistentes de recursos en ningún lugar donde puedan ser utilizados en diferentes compilaciones de su aplicación.

Una vez compilados los recursos 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 recursos que vienen de archivos separados , Su valor es la ruta de acceso a ese archivo en el archivo .apk), en un formato que puede ser fácilmente mapeado y analizado en el dispositivo en tiempo de ejecución.

Puede obtener un resumen del archivo resources.arsc en un apk con el comando "aapt dump resources <path-to-apk>".

El formato de la tabla de recursos binarios se documenta en el archivo de encabezado para las estructuras de datos de recursos aquí:

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

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

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 extraer datos de la tabla de recursos

Para saber cómo se traducen las presentaciones en View desde ID de recurso, consulte LayoutInfater .java

Por lo que entiendo, aapt generará automáticamente identificaciones únicas para cada uno de sus recursos y los almacenará en una tabla de consulta. Esta tabla de búsqueda se mantiene como el archivo "resources.arsc" ubicado en "bin / resources.ap_" (esto es sólo un archivo ZIP, así que siéntase libre de abrirlo usando su visor ZIP favorito). La tabla de búsqueda también se mantiene 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 que Google lo busque o revise el código de http://code.google.com/p/android-apktool/ .

Decano

Una nota final: durante más tiempo, no utilicé 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) que se puede definir un id en la referencia; No tiene que estar en el elemento que lleva el identificador:

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

La magia se encuentra en el complemento de Eclipse y el archivo R.java se autogenera en la carpeta "gen" de una aplicación. Si echas un vistazo a este archivo, verás las asignaciones estáticas para cada XXX en R.xx.XXX donde xx puede ser anim, matriz, color y cualquier otro tipo de recurso.

  • ¿Hay algo similar al sistema de recursos de Android en una escala menor?
  • Acceso a una fuente en la carpeta de activos del archivo XML de Android
  • ¿Cómo puedo tener res / values-pt_PT y res / values-pt_BR en Android?
  • Obtener valor de color mediante programación cuando se trata de una referencia (tema)
  • ¿Cómo obtener los calificadores para un recurso dado (al usarlo)?
  • Gradle build falló en Android Studio versiones nuevas y viejas en OSX
  • Uso de estilos privados (No se encontró ningún recurso que coincida con el nombre dado)
  • No conseguir el pulgar con géneros - jugador de música universal
  • Recursos $ NotFoundException se lanza integrando Facebook-android-sdk-3.0
  • Adición de directorios a carpetas de recursos en Android
  • Android.R.id.home no puede encontrar el símbolo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.