Código fuente de referencia
Antes conviene leer «Especificaciones oficiales»
1. Qué es y por qué existe
El documento anterior termina con una lista de trece cosas que ninguna especificación
cubre: el layout de resources.arsc, el de AXML, las reglas de match de
ResTable_config, la tolerancia del lector de ZIP de Android, la gramática completa de
mapping.txt, los formatos de perfil de ART. Este documento dice qué fichero abrir para
cada una.
Es el más práctico del bloque y también el más frágil, por dos motivos que conviene tener presentes desde la primera línea:
- Las rutas se mueven. Entre versiones de Android, los ficheros cambian de sitio, se
parten y desaparecen.
art/dexlayout/ya no existe en la ramamain;ARSCDecoder.javade apktool tampoco. Ambas se comprobaron el 12 de agosto de 2026 y ambas se citaban habitualmente hace poco. - Leer
maines leer el pasado.aosp-maines de solo lectura desde el 27 de marzo de 2025: Google desarrolla en interno y publica el código en ramas de release dos veces al año, y el manifiestoandroid-latest-releaseapunta siempre a la más reciente —android17-releaseel 24 de septiembre de 2026—. El último commit demaines del 26 de marzo de 2025 enplatform/frameworks/baseyplatform/art, y del 8 de marzo enplatform/tools/apksig. Lo que no aparece enmainpuede ser, simplemente, posterior: es lo que pasó con la firma v3.2, que está en la etiquetaandroid-17.0.0_r1y no enmain. La «sección 2.3 · La regla: fijar una etiqueta, no leer main» es la regla que evita eso, y es la parte más importante del documento.
Todas las rutas de aquí se comprobaron el 12 de agosto de 2026 y devolvieron HTTP 200, salvo las que se señalan expresamente como inexistentes (que se señalan precisamente porque alguien las va a buscar).
2. Cómo leer AOSP sin clonarlo
AOSP son más de un centenar de gigabytes repartidos en cientos de repositorios git. No hace falta clonar nada para leer un fichero, y para el trabajo de esta documentación clonar es contraproducente: un clon envejece en silencio.
Hay tres vías, y sirven para cosas distintas.
2.1 cs.android.com — navegar y buscar
https://cs.android.com/android/platform/superproject/main
Es Code Search: el buscador de código de Google sobre AOSP. Lo que aporta y las otras vías no: referencias cruzadas. Al pinchar sobre un símbolo muestra dónde se define y todos los sitios donde se usa, que es exactamente lo que hace falta cuando uno se pregunta «¿quién escribe este campo?».
Formato de enlace directo a un fichero:
https://cs.android.com/android/platform/superproject/main/+/main:<ruta>
Y con número de línea, añadiendo ;l=<n>:
https://cs.android.com/android/platform/superproject/main/+/main:frameworks/base/libs/androidfw/include/androidfw/ResourceTypes.h;l=200
Búsqueda por símbolo en todo AOSP:
https://cs.android.com/search?q=ResTable_package&ss=android
Cuándo: para explorar y para entender. Los cuatro enlaces de arriba devuelven 200, comprobado.
Su límite: sirve HTML pensado para un navegador. No es la vía para descargar el fichero.
2.2 android.googlesource.com — el fichero crudo y fijado
https://android.googlesource.com/ es la instancia de Gitiles sobre los repositorios reales. El patrón general:
https://android.googlesource.com/<repo>/+/<ref>/<ruta>
Y el detalle que lo hace útil de verdad: añadiendo ?format=TEXT devuelve el fichero en
base64, sin HTML alrededor. Eso permite descargar y procesar sin clonar:
curl -s 'https://android.googlesource.com/platform/frameworks/base/+/refs/heads/main/libs/androidfw/include/androidfw/ResourceTypes.h?format=TEXT' \
| base64 -d > ResourceTypes.h
wc -c ResourceTypes.h
86255 ResourceTypes.h
(Ejecutado el 12 de agosto de 2026 en la máquina de referencia.) La orden lleva
refs/heads/main a propósito, como ejemplo de lo que la «sección 2.3 · La regla: fijar una etiqueta, no leer main» desaconseja: esa rama
está congelada desde el 27 de marzo de 2025 y el fichero que baja no es el vigente. Con la
etiqueta android-17.0.0_r1, el mismo ResourceTypes.h tiene 90.638 bytes, no 86.255, y
kIdmapCurrentVersion pasa de 0x0000000Au a 0x0000000Bu (comprobado el 25 de septiembre
de 2026).
Cuándo: siempre que haya que leer el contenido de verdad, extraer constantes o comparar dos versiones.
2.3 La regla: fijar una etiqueta, no leer main
Las dos formas de <ref>:
<ref> |
Qué da | Cuándo |
|---|---|---|
refs/heads/main |
La antigua rama de desarrollo, congelada el 27 de marzo de 2025. No lleva nada posterior | Para nada que tenga que estar al día |
refs/heads/android17-release |
La rama que nombra hoy el manifiesto android-latest-release: lo último que se ha publicado |
Para ver lo más reciente |
refs/tags/android-16.0.0_r4 |
Una release concreta y congelada | Para documentar y para implementar |
Comprobado el 12 de agosto de 2026: la etiqueta más alta publicada es android-17.0.0_r1,
y existen también android-16.0.0_r1 a _r4 y android-15.0.0_r1 a _r36. Se verificó
además que la misma etiqueta resuelve en los distintos repositorios —platform/art,
platform/tools/apksig y platform/system/libziparchive devuelven 200 para
android-15.0.0_r1, android-16.0.0_r4 y android-17.0.0_r1—, lo que permite fijar una
release y leer todos los componentes coherentes entre sí.
TAG=android-16.0.0_r4
BASE=https://android.googlesource.com/platform/frameworks/base/+/refs/tags/$TAG
curl -s "$BASE/libs/androidfw/include/androidfw/ResourceTypes.h?format=TEXT" | base64 -d | head -40
Por qué importa tanto. Esta documentación ya usa la técnica para fechar cambios: la tabla
7.4 de «XML binario» determina en qué versión de Android se
introdujo la validación del tipo del chunk raíz comparando seis etiquetas, y la tabla 8.2 de
«Tabla de recursos» reconstruye el historial de
campos de ResTable_config del mismo modo. Sin etiquetas eso no se puede hacer, y con
solo main uno acaba afirmando que algo «no existe» cuando está en la última release.
2.4 La API de GitHub, para los espejos y la comunidad
Parte de AOSP se espeja en github.com/aosp-mirror, y todas las herramientas de la comunidad
viven en GitHub. La API sirve contenido y metadatos sin clonar:
# ¿existe esta ruta? (200 / 404) y metadatos del fichero
curl -s -o /dev/null -w '%{http_code}\n' \
https://api.github.com/repos/skylot/jadx/contents/jadx-core/src/main/java/jadx/core/Jadx.java
# el contenido en crudo
curl -s https://raw.githubusercontent.com/google/bundletool/master/src/main/proto/commands.proto | head -30
# la rama por defecto, que no siempre es la que uno supone
curl -s https://api.github.com/repos/pxb1988/dex2jar | python3 -c 'import sys,json;print(json.load(sys.stdin)["default_branch"])'
Aviso sobre la rama por defecto. No dar por hecho master ni main: se comprobaron las
diez y no coinciden (tabla en «§4.11 · Ramas por defecto y estado — comprobado el 12 de agosto de 2026»). pxb1988/dex2jar usa 2.x, y cualquier URL con
master sobre ese repositorio falla.
3. AOSP: dónde está cada cosa
3.1 Los recursos — la autoridad sin especificación
Este es el bloque que justifica el documento entero.
| Ruta | Qué define |
|---|---|
frameworks/base/libs/androidfw/include/androidfw/ResourceTypes.h |
La cabecera. Todas las estructuras: ResChunk_header, ResStringPool_header, ResTable_header, ResTable_package, ResTable_typeSpec, ResTable_type, ResTable_config, ResTable_entry, Res_value, y las constantes RES_*, TYPE_*, COMPLEX_*, SORTED_FLAG, UTF8_FLAG |
frameworks/base/libs/androidfw/ResourceTypes.cpp |
El lector. validate_chunk, las dos decodeLength (UTF-8 y UTF-16), ResStringPool::setTo, ResXMLTree::setTo, ResXMLParser::nextNode, y la lógica de configuración: match(), isBetterThan(), isMoreSpecificThan() |
frameworks/base/libs/androidfw/LoadedArsc.cpp |
VerifyResTableType, VerifyResTableEntry, GetEntryOffset con la búsqueda binaria sobre entradas dispersas, y el límite de 65.535 entradas por tipo (entryCount > 0xFFFF se rechaza) |
frameworks/base/libs/androidfw/AssetManager2.cpp |
Cómo se resuelve un resource ID en tiempo de ejecución, con overlays y configuración del dispositivo |
frameworks/base/tools/aapt2/format/binary/TableFlattener.cpp |
El escritor. Las condiciones exactas con que aapt2 emite FLAG_SPARSE, FLAG_OFFSET16 y FLAG_COMPACT, y kSparseEncodingThreshold = 60 |
frameworks/base/tools/aapt2/format/binary/XmlFlattener.cpp |
El escritor del AXML: cómo se construye el resource map y en qué orden salen los atributos |
frameworks/base/tools/aapt2/Resource.h |
kAppPackageId = 0x7f, kFrameworkPackageId = 0x01 y la descripción canónica de 0xPPTTEEEE |
frameworks/base/tools/aapt2/cmd/Link.cpp |
La validación del rango de --package-id, el 0x00 de --shared-lib y el rango reservado 0x02–0x7e |
Por qué es la autoridad. No hay documento que describa resources.arsc. Lo que
ResourceTypes.cpp acepta al leer es el formato; lo que TableFlattener.cpp escribe es
lo que hay en los ficheros reales. Y no son lo mismo: el lector acepta bastante más de lo
que el escritor produce, y esa diferencia es donde viven las malformaciones deliberadas que
documenta «XML binario §7.3».
Por dónde entrar: ResourceTypes.h primero, entero. Son unos 90 KB en android-17.0.0_r1 y es la mejor hora que
se puede invertir en este dominio. Después TableFlattener.cpp si se va a escribir, o
LoadedArsc.cpp si se va a leer.
3.2 El código — DEX y bytecode
| Ruta | Qué define |
|---|---|
art/libdexfile/dex/dex_file.h |
kDexEndianConstant, kDexNoIndex32, kSha1DigestSize, kDexContainerVersion = 41 (el DEX de contenedor, que la spec describe en «Container format» y da por experimental en Android 16) y los campos container_size_ y header_offset_ |
art/libdexfile/dex/standard_dex_file.h |
kNumDexVersions = 6 |
art/libdexfile/dex/standard_dex_file.cc |
kDexMagicVersions con las seis versiones aceptadas — y el motivo de que no exista la 036 |
art/libdexfile/dex/dex_instruction.h |
El bytecode. kNumPackedOpcodes = 0x100, enum Code con los opcodes, kPackedSwitchSignature = 0x0100, kSparseSwitchSignature = 0x0200, kArrayDataSignature = 0x0300, kMaxVarArgRegs = 5 y los flags kVerify* |
art/libdexfile/dex/dex_instruction_list.h |
La macro que enumera todas las instrucciones con su formato y sus flags. Es la tabla de opcodes en forma ejecutable |
art/libdexfile/dex/dex_file_structs.h |
Las estructuras del fichero (ClassDef, CodeItem, TryItem…) tal como las modela ART |
art/libdexfile/dex/dex_file_verifier.cc |
Qué comprobaciones estructurales hace ART antes de aceptar un DEX. Es la lista de lo que un fichero generado a mano tiene que cumplir |
art/runtime/verifier/method_verifier.cc |
La verificación de bytecode: VerifyInstruction, CodeFlowVerifyMethod y los mensajes de Fail(VERIFY_ERROR_BAD_CLASS_HARD) |
art/dexdump/dexdump.cc |
El volcador de referencia. Útil como oráculo: si dexdump lee algo distinto que tu parser, el equivocado eres tú |
Los valores de dex_instruction.h citados arriba se leyeron del fichero el 12 de agosto de
2026 con ?format=TEXT.
Ruta que ya no existe: ⚠️ art/dexlayout/ fue eliminado de la rama main. Se
comprobó el 12 de agosto de 2026 listando el árbol de platform/art: los directorios
relacionados con DEX que quedan son dexdump, dexlist, libdexfile, dex2oat,
dexoptanalyzer y dexopt_chroot_setup. Quien busque dexlayout.cc por una referencia
antigua tiene que ir a una etiqueta anterior.
3.3 La firma — tools/apksig
apksig es la biblioteca que hay detrás de apksigner, y es el mejor código de todo AOSP
para este propósito: está en Java, es autocontenido y sus comentarios son buenos.
Raíz, a propósito en main para ilustrar el error de la «sección 2.3 · La regla: fijar una etiqueta, no leer main»:
https://android.googlesource.com/platform/tools/apksig/+/refs/heads/main/. Esa rama no recibe
commits desde marzo de 2025 y le falta v3.2 (abajo); para leer lo vigente,
refs/tags/android-17.0.0_r1.
Prefijo común de las rutas: src/main/java/com/android/apksig/
| Ruta (bajo el prefijo) | Qué define |
|---|---|
ApkVerifier.java |
El flujo completo de verificación. Qué esquema se intenta en qué orden, bajo qué condiciones, y los códigos de error (V31_BLOCK_FOUND_WITHOUT_V3_BLOCK…). Si solo se puede leer un fichero, es este |
ApkSigner.java |
El lado de la firma: orden de operaciones y qué se recalcula |
internal/apk/ApkSigningBlockUtils.java |
APK_SIGNING_BLOCK_MAGIC, VERITY_PADDING_BLOCK_ID = 0x42726577, CONTENT_DIGESTED_CHUNK_MAX_SIZE_BYTES, generateApkSigningBlock y la normalización del offset del Central Directory en el EOCD |
internal/apk/SignatureAlgorithm.java |
La tabla de algoritmos: identificador, parámetros PSS exactos y minSdkVersion de cada uno. Esto no está completo en ninguna spec |
internal/apk/ContentDigestAlgorithm.java |
Los algoritmos de digest de contenido y sus tamaños de bloque |
internal/apk/v1/V1SchemeVerifier.java |
El JAR signing: MANIFEST.MF, .SF y el bloque PKCS#7 |
internal/apk/v2/V2SchemeConstants.java |
0x7109871a y STRIPPING_PROTECTION_ATTR_ID = 0xbeeff00d |
internal/apk/v2/V2SchemeVerifier.java |
La verificación de v2 paso a paso |
internal/apk/v2/V2SchemeSigner.java |
La generación de v2 |
internal/apk/v3/V3SchemeConstants.java |
0xf05368c0 (v3), 0x1b93ad61 (v3.1), 0x3ba06f8c (proof-of-rotation), y los umbrales MIN_SDK_WITH_V3_SUPPORT / MIN_SDK_WITH_V31_SUPPORT |
internal/apk/v3/V3SchemeVerifier.java |
La verificación de v3 y v3.1 |
SigningCertificateLineage.java |
Las capacidades del lineage con sus valores y la advertencia sobre PAST_CERT_ROLLBACK |
internal/apk/v3/V3SigningCertificateLineage.java |
El formato binario del lineage, en el comentario // FORMAT (little endian): |
internal/apk/v4/V4Signature.java |
El .idsig: CURRENT_VERSION, HASHING_ALGORITHM_SHA256, LOG2_BLOCK_SIZE_4096_BYTES y el orden de campos de HashingInfo y SigningInfo |
internal/util/VerityTreeBuilder.java |
CHUNK_SIZE = 4096 y calculateLevelOffset: la construcción real del árbol de Merkle |
internal/apk/stamp/SourceStampConstants.java |
stamp-cert-sha256, 0x2b09189e, 0x6dff800d, 0x9d6303f7 y 0xe43c5946 |
Por dónde entrar: ApkVerifier.java, y desde ahí seguir las llamadas. La estructura del
paquete internal/apk/vN/ es tan regular que una vez visto un esquema se leen los otros solos.
Lo que no está en main: las constantes de v3.2, que llegaron después de congelarse la
rama. Están en la etiqueta android-17.0.0_r1: V3SchemeConstants.java trae
APK_SIGNATURE_SCHEME_V32_BLOCK_ID = 0x70e1c89f, MIN_SDK_WITH_V32_SUPPORT = AndroidSdkVersion.C,
que vale 37, y los atributos 0xbf940529 y 0x9f06b79c («20-firma/01 §7»).
Y los identificadores de bloque de terceros —dependency metadata, frosting, Meituan— no están
en AOSP en absoluto: para eso, «§4.10 · avast/apkverifier — rama master».
3.4 El contenedor — ZIP y alineación
| Ruta | Qué define |
|---|---|
system/libziparchive/zip_archive.cc |
El lector de ZIP de Android. El barrido hacia atrás en busca del EOCD, y sobre todo qué acepta y qué rechaza: la tolerancia real, que la spec de PKWARE no describe |
system/libziparchive/zip_archive_common.h |
kMaxCommentLen = 65535 y las estructuras zip64 (Zip64EocdRecord, Zip64EocdLocator) |
system/libziparchive/zip_writer.cc |
El escritor: qué produce Android cuando escribe un ZIP |
build/tools/zipalign/ZipAlign.cpp |
getAlignment(): la alineación se decide por extensión de fichero, y las entradas comprimidas se copian sin alinear |
Por qué importa zip_archive.cc más que APPNOTE.TXT para este dominio: la especificación
describe el ZIP correcto; los APK del mundo real no siempre lo son. La divergencia entre
Local File Header y Central Directory, el data descriptor ausente con el flag del bit 3
puesto, el comentario del EOCD con basura — todo eso solo se resuelve viendo qué hace este
fichero. Es la raíz de las vulnerabilidades históricas Master Key y Janus
(«Contenedor ZIP §12»).
3.5 Los artefactos auxiliares
| Ruta | Qué define |
|---|---|
art/libprofile/profile/profile_compilation_info.cc |
kProfileMagic, kProfileVersion y las secciones de baseline.prof. Es la única autoridad: no hay spec |
art/runtime/oat/oat_file_assistant.cc |
La ruta oat/<isa>/ y la relación entre .odex, .vdex y .art |
frameworks/support/.../profileinstaller/ProfileTranscoder.java |
MAGIC_PROF y MAGIC_PROFM — el lado de AndroidX. Vive en la rama androidx-main, no en main |
4. Herramientas de la comunidad: por dónde se entra
Un enlace al repositorio no sirve de nada. Lo que sirve es el fichero por el que se empieza. Todas las rutas de esta sección se verificaron contra la API de GitHub el 12 de agosto de 2026 y devuelven HTTP 200.
4.1 jadx — rama master
El decompilador de referencia. Su arquitectura es de plugins de entrada más un pipeline de visitors.
| Fichero | Qué se aprende |
|---|---|
jadx-core/src/main/java/jadx/core/Jadx.java |
El mapa del pipeline entero. getPassesList() enumera en orden todos los visitors. Es el mejor punto de entrada global de todo el proyecto |
jadx-plugins/jadx-dex-input/src/main/java/jadx/plugins/input/dex/DexReader.java |
La lectura del contenedor DEX que alimenta al core |
jadx-core/src/main/java/jadx/core/dex/instructions/InsnDecoder.java |
La traducción de opcodes Dalvik a la IR interna |
jadx-core/src/main/java/jadx/core/codegen/ClassGen.java |
La generación del texto Java final |
https://github.com/skylot/jadx/blob/master/jadx-core/src/main/java/jadx/core/Jadx.java
Empieza por Jadx.java. La lista de passes explica en cincuenta líneas por qué decompilar
es difícil, mejor que cualquier artículo.
4.2 apktool — rama main
Fichero (bajo brut.apktool/apktool-lib/src/main/java/brut/androlib/) |
Qué se aprende |
|---|---|
ApkDecoder.java |
El orquestador de apktool d |
res/decoder/BinaryResourceParser.java |
El parser de resources.arsc: parseTable(), parsePackage() y el switch sobre RES_TABLE_PACKAGE_TYPE, RES_TABLE_TYPE_SPEC_TYPE… |
res/decoder/BinaryXmlResourceParser.java |
La decodificación de AXML a XML de texto |
res/AaptInvoker.java |
La invocación literal de aapt2: cómo construye los argumentos de compile y link. Aquí se ve de dónde vienen la mitad de sus fallos de reempaquetado |
⚠️ Rutas que ya no existen: ARSCDecoder.java y ResourcesDecoder.java fueron
refactorizados y no están en el árbol actual. Se siguen citando en documentación de
terceros. El sustituto es BinaryResourceParser.java.
4.3 smali / baksmali (google/smali) — rama main
| Fichero | Qué se aprende |
|---|---|
third_party/smali/src/main/antlr/smaliParser.g |
La gramática ANTLR: la especificación real del lenguaje smali. No existe otra. smali/src/main/antlr/smaliParser.g es un symlink a ella |
dexlib2/src/main/java/com/android/tools/smali/dexlib2/dexbacked/DexBackedDexFile.java |
El corazón de dexlib2: lectura perezosa del DEX a partir de offsets del header |
baksmali/src/main/java/com/android/tools/smali/baksmali/Main.java |
Entrada del desensamblador |
smali/src/main/java/com/android/tools/smali/smali/Main.java |
Entrada del ensamblador |
⚠️ Aviso: third_party/smali/ no es un duplicado. Es la ubicación canónica de las fuentes
BSD heredadas de JesusFreke. De los 964 ficheros del repositorio (recontados el 25 de
septiembre de 2026), 40 cuelgan de ahí y 36 no existen en ninguna otra ruta
—third_party/baksmali/…/Baksmali.java, los diez de Adaptors/, LiteralTools.java,
util/Hex.java—: pedir la versión sin prefijo devuelve 404. Android.bp tiene un homónimo
distinto en la raíz, y las tres gramáticas .g sí aparecen fuera, pero son symlinks de menos
de 120 bytes que apuntan hacia dentro —el repositorio tiene un cuarto, el LICENSE de la raíz—
(smali/src/main/antlr/smaliParser.g → ../../../../third_party/smali/src/main/antlr/smaliParser.g).
Trampa al verificar: la API de contenidos de GitHub resuelve esos symlinks y devuelve el
fichero real con "type":"file", así que una comprobación por esa vía no detecta nada; el stub
solo se ve con raw.githubusercontent.com, con la vista blob o listando el árbol.
4.4 ARSCLib — rama main
La reimplementación en Java de los formatos de recursos, sin aapt2. Es la referencia de
diseño obligada de cualquier reimplementación.
Fichero (bajo src/main/java/com/reandroid/) |
Qué se aprende |
|---|---|
arsc/chunk/TableBlock.java |
La raíz de resources.arsc: Chunk<TableHeader> con su string pool y sus paquetes |
arsc/chunk/PackageBlock.java |
El paquete: tipos, specs e IDs |
arsc/chunk/xml/ResXmlDocument.java |
La estructura de un documento AXML |
apk/ApkModule.java |
La API de alto nivel; es por donde entran APKEditor y los demás consumidores |
Por qué leerlo: es el ejemplo trabajado de modelar los chunks fielmente para poder
reescribirlos, que es exactamente el problema del round-trip byte-exacto.
4.5 APKEditor — rama master
| Fichero | Qué se aprende |
|---|---|
src/main/java/com/reandroid/apkeditor/merge/Merger.java |
El comando merge completo: runCommand() crea un ApkBundle, lo fusiona, y luego sanitizeManifest() y fixFilePermissions() |
src/main/java/com/reandroid/apkeditor/merge/MergerOptions.java |
Los flags del comando |
Matiz importante: la fusión real no está aquí, está en ApkBundle de ARSCLib («§4.4 · ARSCLib — rama main»).
APKEditor es la CLI; la lógica es de la biblioteca.
4.6 dex2jar — rama 2.x
| Fichero | Qué se aprende |
|---|---|
dex-reader/src/main/java/com/googlecode/d2j/reader/DexFileReader.java |
La lectura del DEX |
dex-translator/src/main/java/com/googlecode/d2j/converter/Dex2IRConverter.java |
Paso 1: bytecode Dalvik → IR propia |
dex-translator/src/main/java/com/googlecode/d2j/dex/Dex2Asm.java |
Paso 2 y núcleo: convertClass() emite bytecode JVM con ASM. Aquí está el problema difícil, que es pasar de registros a pila |
dex-translator/src/main/java/com/googlecode/d2j/dex/Dex2jar.java |
La fachada que escribe el .jar |
⚠️ La rama por defecto es 2.x. Las URL con master no funcionan. Último push del
repositorio: julio de 2024.
4.7 APKiD — rama master
| Fichero | Qué se aprende |
|---|---|
apkid/rules.py |
RulesManager: cómo se recopilan y compilan las reglas YARA |
apkid/apkid.py |
Scanner: scan_file_obj(), _scan_zip() y _should_scan() — la lógica de qué entradas del APK merece la pena escanear |
apkid/rules/dex/compilers.yara |
El ejemplo canónico de regla: identificar el compilador que produjo el DEX |
apkid/rules/apk/packers.yara |
Las huellas de packer a nivel de contenedor |
Las reglas se organizan en apkid/rules/{apk,dex,elf,dll,res}/ con categorías repetidas
(common, obfuscators, packers, protectors, anti-vm, abnormal).
Sobre el alcance: estas reglas son material de detección e identificación, que es exactamente lo que aquí se documenta. Leerlas no enseña a desempaquetar nada; enseña qué cadenas y qué estructuras delatan a cada familia.
4.8 bundletool — rama master
Fichero (bajo src/main/java/com/android/tools/build/bundletool/) |
Qué se aprende |
|---|---|
commands/BuildApksCommand.java |
La superficie del comando: todos los flags y modos |
commands/BuildApksManager.java |
La lógica real de execute() |
splitters/SplitApksGenerator.java |
La generación de splits: variantes y dimensiones de targeting |
io/ApkSerializerManager.java |
Cómo se serializan los splits al .apks final |
⚠️ ShardedApksGenerator no existe en el árbol actual. El directorio splitters/ contiene
los splitters por dimensión (AbiNativeLibrariesSplitter, CountrySetAssetsSplitter…).
Y sus .proto («§6.2 del documento 01 · Los .proto de bundletool») son la autoridad
sobre el APK Set.
4.9 R8 — r8.googlesource.com, rama main
No está en GitHub. Se lee con el mismo patrón de Gitiles que AOSP:
https://r8.googlesource.com/r8/+/refs/heads/main/<ruta>
Fichero (bajo src/main/java/com/android/tools/r8/) |
Qué se aprende |
|---|---|
naming/ProguardMapReader.java |
La lectura de mapping.txt: parse(), parseClassMappings(), parseMemberMappings(), parseSignature(), parseRange(). Es la gramática real, que doc/retrace.md solo cubre a medias |
naming/ProguardMapSupplier.java |
La escritura: writeProguardMap(), y el ProguardMapId que es el SHA-256 del contenido |
naming/ClassNameMapper.java |
El modelo de datos del mapping |
R8.java |
El punto de entrada del compilador |
⚠️ naming/ProguardMapWriter.java no existe (404 comprobado). No hay ninguna clase
*MapWriter: el lado de escritura es ProguardMapSupplier.java. Es un error de búsqueda
natural y por eso se deja anotado.
4.10 avast/apkverifier — rama master
Verificador de firma independiente, en Go. Vale la pena precisamente porque no es de Google: documenta los identificadores de bloque que AOSP no reconoce.
| Fichero | Qué se aprende |
|---|---|
signingblock/signingblock.go |
El parseo del APK Signing Block: la magia partida en apkSigBlockMagicHi/Lo, la localización desde el EOCD y pickAndVerify() |
signingblock/frosting.go |
El bloque 0x2146444e de Google Play, del que no hay documentación oficial |
signingblock/schemev2.go, schemev3.go, schemev31.go |
Cada esquema por separado |
apkverifier.go |
La API pública |
De aquí salen los tres identificadores de «APK Signing Block §4»
que no están en apksig.
4.11 Ramas por defecto y estado — comprobado el 12 de agosto de 2026
| Repositorio | Rama por defecto | Último push |
|---|---|---|
skylot/jadx |
master |
5 ago 2026 |
iBotPeaches/Apktool |
main |
11 ago 2026 |
google/smali |
main |
14 jul 2026 |
REAndroid/ARSCLib |
main |
1 jul 2026 |
REAndroid/APKEditor |
master |
19 may 2026 |
pxb1988/dex2jar |
2.x |
21 jul 2024 |
rednaga/APKiD |
master |
27 jul 2026 |
google/bundletool |
master |
15 dic 2025 |
avast/apkverifier |
master |
10 jul 2026 |
R8 (r8.googlesource.com) |
main |
— |
El análisis de mantenimiento y bus factor de estos proyectos está en «Mapa del ecosistema»; aquí solo interesa la rama, porque de ella dependen todas las URL de arriba.
5. Tabla de trazabilidad
El mapa del muestrario: qué código sostiene cada documento. Si una afirmación de la columna izquierda se pone en duda, se comprueba en la de la derecha.
| Documento | Fuentes de código que lo respaldan |
|---|---|
| «10-formatos/01 · Contenedor ZIP» | system/libziparchive/zip_archive.cc, zip_archive_common.h; build/tools/zipalign/ZipAlign.cpp |
| «10-formatos/02 · Formato DEX» | art/libdexfile/dex/dex_file.h, standard_dex_file.{h,cc}, dex_file_structs.h, dex_file_verifier.cc |
| «10-formatos/03 · Bytecode Dalvik» | art/libdexfile/dex/dex_instruction.h, dex_instruction_list.h; art/runtime/verifier/method_verifier.cc; google/smali (smaliParser.g, dexlib2) |
| «10-formatos/04 · XML binario» | androidfw/ResourceTypes.h y .cpp; aapt2/format/binary/XmlFlattener.cpp; ARSCLib ResXmlDocument.java; apktool BinaryXmlResourceParser.java |
| «10-formatos/05 · Tabla de recursos» | androidfw/ResourceTypes.h y .cpp, LoadedArsc.cpp; aapt2/format/binary/TableFlattener.cpp, Resource.h, cmd/Link.cpp; ARSCLib TableBlock.java; apktool BinaryResourceParser.java |
| «10-formatos/06 · AAB y splits» | bundletool (commands.proto, config.proto, targeting.proto, SplitApksGenerator.java); aapt2/Resources.proto |
| «10-formatos/07 · Código nativo» | gABI y AAELF64 (spec, no código); build/tools/zipalign/ZipAlign.cpp |
| «10-formatos/08 · Artefactos auxiliares» | art/libprofile/.../profile_compilation_info.cc; art/runtime/oat/oat_file_assistant.cc; apksig/.../SourceStampConstants.java; ProfileTranscoder.java |
| «20-firma/01 · Esquemas v1-v3» | apksig: ApkVerifier.java, V3SchemeConstants.java, V2SchemeConstants.java, SigningCertificateLineage.java, V3SigningCertificateLineage.java, ApkSigningBlockUtils.java |
| «20-firma/02 · APK Signing Block» | apksig: ApkSigningBlockUtils.java, SignatureAlgorithm.java, ContentDigestAlgorithm.java, los *SchemeConstants.java, SourceStampConstants.java; avast/apkverifier para los bloques de terceros |
| «20-firma/03 · Firma v4» | apksig: V4Signature.java, V4SchemeSigner.java, V4SchemeVerifier.java, VerityTreeBuilder.java, ApkVerifier.java |
| «20-firma/04 · Alineación» | build/tools/zipalign/ZipAlign.cpp |
| «40-ofuscacion/01 · R8 y ProGuard» | R8: ProguardMapReader.java, ProguardMapSupplier.java, ClassNameMapper.java, MapVersion.java, dex/Marker.java; platform/tools/base para las reglas por defecto de AGP |
| «40-ofuscacion/02 · Ofuscadores comerciales» | APKiD: apkid/rules/{apk,dex,elf}/obfuscators.yara y packers.yara |
| «40-ofuscacion/03 · Packers y protectores» | APKiD: apkid/rules/apk/packers.yara y homólogas de dex/ y elf/ |
| «40-ofuscacion/04 · Anti-análisis» | APKiD: apkid/rules/dex/protectors.yara y las reglas anti-vm |
| «40-ofuscacion/05 · Deofuscación» | R8: doc/retrace.md y ProguardMapReader.java; aapt2 optimize --save-obfuscation-map |
| «30-herramientas/» | Los diez repositorios de la «sección 4 · Herramientas de la comunidad: por dónde se entra» |
Tres documentos —«10-formatos/07» en su mayor parte, y las partes de spec de «02» y «03»— se sostienen en especificación publicada y no necesitan código. Son la excepción, y por eso están en el «documento 01».
6. Trampas verificadas
Resumen de lo que se comprobó y falló, para que nadie repita la búsqueda:
| Se busca | Estado | Qué usar |
|---|---|---|
art/dexlayout/dexlayout.cc |
404 en main |
Eliminado. Usar una etiqueta anterior |
apktool ARSCDecoder.java |
No existe | res/decoder/BinaryResourceParser.java |
apktool ResourcesDecoder.java |
No existe | Ídem |
R8 naming/ProguardMapWriter.java |
404 | naming/ProguardMapSupplier.java |
bundletool ShardedApksGenerator |
No existe | splitters/SplitApksGenerator.java |
dex2jar en rama master |
404 | Rama 2.x |
google/smali bajo third_party/smali/ |
No es un duplicado: es la ubicación canónica, y lo que aparece fuera son symlinks | Las rutas con ese prefijo («§4.3 · smali / baksmali (google/smali) — rama main») |
google/smali blob/master/… |
Redirige | blob/main/… |
Constantes de firma v3.2 en apksig, rama main |
No están: la rama se congeló antes | La etiqueta android-17.0.0_r1 |
Bloques 0x504b4453, 0x2146444e, 0x71777777 |
No están en AOSP | avast/apkverifier |
Fuentes
Todas las rutas de este documento se comprobaron el 12 de agosto de 2026: las de AOSP y R8 con
curl sobre android.googlesource.com y r8.googlesource.com, y las de GitHub con la API
(GET /repos/<org>/<repo>/contents/<ruta>?ref=<rama>). Las señaladas como inexistentes
devolvieron 404 o no aparecen en el listado del árbol.
- AOSP —
frameworks/base/libs/androidfw/— https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-17.0.0_r1/libs/androidfw/ Consultado el 25 de septiembre de 2026. De aquí sale la tabla de la «sección 3.1 · Los recursos — la autoridad sin especificación». El contenido concreto deResourceTypes.h,ResourceTypes.cppyLoadedArsc.cppestá desarrollado en «10-formatos/04» y «10-formatos/05», que los citan campo a campo. - AOSP —
frameworks/base/tools/aapt2/— https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-17.0.0_r1/tools/aapt2/ Consultado el 25 de septiembre de 2026. Rutas verificadas:Resource.h,Resources.proto,cmd/Link.cpp,format/binary/TableFlattener.cpp,format/binary/XmlFlattener.cpp. - AOSP —
art/libdexfile/dex/— https://android.googlesource.com/platform/art/+/refs/tags/android-17.0.0_r1/libdexfile/dex/dex_instruction.h Consultado el 25 de septiembre de 2026, descargado con?format=TEXTy decodificado. De aquí se leyeron directamentekNumPackedOpcodes = 0x100,kPackedSwitchSignature = 0x0100,kSparseSwitchSignature = 0x0200,kArrayDataSignature = 0x0300ykMaxVarArgRegs = 5citados en la «sección 3.2 · El código — DEX y bytecode». Verificadas ademásdex_file.h,standard_dex_file.{h,cc},dex_file_structs.h,dex_file_verifier.ccydex_file_loader.cc. - AOSP — listado del árbol de
platform/art— https://android.googlesource.com/platform/art/+/refs/tags/android-17.0.0_r1/ Consultado el 25 de septiembre de 2026. De aquí sale quedexlayout/ya no existe y la lista de directorios relacionados conDEXque sí quedan («sección 3.2 · El código — DEX y bytecode» y tabla 6). - AOSP —
art/runtime/verifier/method_verifier.cc,art/dexdump/dexdump.cc,art/runtime/oat/oat_file_assistant.cc,art/libprofile/profile/profile_compilation_info.cc— https://android.googlesource.com/platform/art/+/refs/tags/android-17.0.0_r1/runtime/verifier/method_verifier.cc Consultados el 25 de septiembre de 2026. Secciones «3.2» y «3.5». - AOSP —
platform/tools/apksig— https://android.googlesource.com/platform/tools/apksig/+/refs/tags/android-17.0.0_r1/ Consultado el 25 de septiembre de 2026. Las dieciséis rutas de la tabla de la «sección 3.3 · La firma — tools/apksig» se verificaron una a una. Su contenido está desarrollado en «20-firma/01», «02» y «03». - AOSP —
system/libziparchiveybuild/tools/zipalign— https://android.googlesource.com/platform/system/libziparchive/+/refs/tags/android-17.0.0_r1/zip_archive.cc y https://android.googlesource.com/platform/build/+/refs/tags/android-17.0.0_r1/tools/zipalign/ZipAlign.cpp Consultados el 25 de septiembre de 2026. «Sección 3.4 · El contenedor — ZIP y alineación». Se comprobó queZipAlign.cppestá disponible tanto enandroid.googlesource.comcomo en el espejogithub.com/aosp-mirror/platform_build, que es el que citan «10-formatos/01» y «20-firma/04». - AOSP — listado de etiquetas de
platform/frameworks/base— https://android.googlesource.com/platform/frameworks/base/+refs Consultado el 12 de agosto de 2026. De aquí sale que la etiqueta más alta esandroid-17.0.0_r1y la existencia deandroid-16.0.0_r1–_r4yandroid-15.0.0_r1–_r36(«sección 2.3 · La regla: fijar una etiqueta, no leer main»). - Comprobación de resolución de etiquetas entre repositorios — ejecutada con
curlel 12 de agosto de 2026 sobreplatform/art,platform/tools/apksigyplatform/system/libziparchivecon las etiquetasandroid-15.0.0_r1,android-16.0.0_r4yandroid-17.0.0_r1: las nueve combinaciones devolvieron HTTP 200. De aquí sale la afirmación de la «sección 2.3 · La regla: fijar una etiqueta, no leer main» de que una misma etiqueta permite leer todos los componentes coherentes entre sí. cs.android.com— https://cs.android.com/android/platform/superproject/main Consultado el 12 de agosto de 2026. Se verificaron los cuatro formatos de enlace de la «sección 2.1 · cs.android.com — navegar y buscar»: la raíz, el enlace a fichero con+/main:<ruta>, el enlace con;l=<n>y la búsquedasearch?q=…&ss=android. Los cuatro devolvieron HTTP 200.- Mecanismo
?format=TEXTde Gitiles — comprobado el 12 de agosto de 2026 descargandoResourceTypes.hde la ramamainy de la etiquetaandroid-16.0.0_r4, decodificando conbase64 -d. El tamaño de 86.255 bytes de la «sección 2.2 · android.googlesource.com — el fichero crudo y fijado» es la salida real dewc -c. - API de GitHub —
https://api.github.com/repos/<org>/<repo>y/contents/<ruta>?ref=<rama>Consultada el 12 de agosto de 2026 para los nueve repositorios de la «sección 4 · Herramientas de la comunidad: por dónde se entra» y las rutas de cada uno. De aquí salen íntegras las tablas de las «secciones 4.1 · jadx — rama master» a 4.8 y 4.10, la tabla de ramas por defecto de 4.11 y las cinco entradas de rutas inexistentes de la tabla 6. - R8 —
r8.googlesource.com/r8— https://r8.googlesource.com/r8/+/refs/heads/main/src/main/java/com/android/tools/r8/naming/ProguardMapReader.java Consultado el 12 de agosto de 2026 con?format=TEXT. De aquí sale la tabla de la «sección 4.9 · R8 — r8.googlesource.com, rama main», incluido queProguardMapWriter.javadevuelve 404 y que el lado de escritura esProguardMapSupplier.java. - Documentos ya escritos de esta documentación — «
10-formatos/», «20-firma/», «30-herramientas/» y «40-ofuscacion/» Consultados el 12 de agosto de 2026. La tabla de trazabilidad de la «sección 5 · Tabla de trazabilidad» se construyó extrayendo conpython3la sección## Fuentesde los treinta documentos que la tienen y reagrupando por fichero de código, no por documento. Las columnas «qué define» de las «secciones 3.1 · Los recursos — la autoridad sin especificación» a 3.5 resumen lo que cada documento declara haber tomado de cada fichero. - API de GitHub — árbol de
google/smali— https://api.github.com/repos/google/smali/git/trees/main?recursive=1 · Consultado el 25 de septiembre de 2026. De aquí sale quesmali/src/main/antlr/smaliParser.gtiene modo120000(symlink) y apunta athird_party/smali/src/main/antlr/smaliParser.g(secciones «4.3» y «6»).