Au moment de la construction, l'outil aapt rassemble toutes les ressources que vous avez définies (par des fichiers séparés ou des définitions explicites dans des fichiers) et leur attribue des ID de ressources.
Un ID de ressource est un nombre de 32 bits de la forme : PPTTNNNN. PP est le paquet pour lequel la ressource est destinée ; TT est le type de la ressource ; NNNNN est le nom de la ressource dans ce type. Pour les ressources des applications, PP est toujours 0x7f.
Les valeurs TT et NNNNN sont attribuées par aapt de manière arbitraire -- en fait, pour chaque nouveau type, le prochain numéro disponible est attribué et utilisé (en commençant par 1) ; de même, pour chaque nouveau nom dans un type, le prochain numéro disponible est attribué et utilisé (en commençant par 1).
Donc si nous avons ces fichiers de ressources gérés par aapt dans cet ordre :
layout/main.xml
drawable/icon.xml
layout/listitem.xml
Le premier type que nous voyons est "layout", ce qui donne TT == 1. Le premier nom sous ce type est "main", ce qui donne NNNN == 1. L'ID final de la ressource est 0x7f010001.
Ensuite, nous voyons "drawable", ce qui donne TT == 2. Le premier nom de ce type est "icon", qui reçoit donc NNNN == 1. L'ID final de la ressource est 0x7f020001.
Enfin, nous voyons un autre "layout" qui a TT == 1 comme avant. Il a un nouveau nom "listitem" et obtient donc la valeur suivante NNNN == 2. L'ID final de la ressource est 0x7f010002.
Notez que par défaut, aapt n'essaie pas de garder ces identifiants identiques entre les builds. Chaque fois que les ressources changent, elles peuvent toutes obtenir de nouveaux identifiants. Chaque fois qu'elles sont construites, un nouveau R.java est créé avec les identifiants actuels afin que votre code obtienne les valeurs correctes. Pour cette raison, vous ne devez jamais conserver les identifiants des ressources à un endroit où ils peuvent être utilisés dans différentes versions de votre application.
Une fois les ressources compilées et les identifiants attribués, aapt génère le fichier R.java pour votre code source et un fichier binaire appelé "resources.arsc" qui contient tous les noms, identifiants et valeurs des ressources (pour les ressources provenant d'un fichier distinct, leur valeur est le chemin d'accès à ce fichier dans le fichier .apk), dans un format qui peut facilement être mappé et analysé sur l'appareil au moment de l'exécution.
Vous pouvez obtenir un résumé du fichier resources.arsc dans un apk avec la commande "aapt dump resources <path-to-apk>".
Le format de la table des ressources binaires est documenté dans le fichier d'en-tête des structures de données des ressources ici :
https://github.com/Android/platform_frameworks_base/blob/master/libs/androidfw/include/androidfw/ResourceTypes.h
L'implémentation complète de la lecture de la table des ressources sur le dispositif est ici :
https://github.com/Android/platform_frameworks_base/blob/master/libs/androidfw/ResourceTypes.cpp