τTau SolutionsReferencias

Código fuente de referencia

Antes conviene leer «Especificaciones oficiales»

panorama · Actualizado el 25 de septiembre de 2026

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 rama main; ARSCDecoder.java de apktool tampoco. Ambas se comprobaron el 12 de agosto de 2026 y ambas se citaban habitualmente hace poco.
  • Leer main es leer el pasado. aosp-main es 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 manifiesto android-latest-release apunta siempre a la más reciente —android17-release el 24 de septiembre de 2026—. El último commit de main es del 26 de marzo de 2025 en platform/frameworks/base y platform/art, y del 8 de marzo en platform/tools/apksig. Lo que no aparece en main puede ser, simplemente, posterior: es lo que pasó con la firma v3.2, que está en la etiqueta android-17.0.0_r1 y no en main. 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.

  1. 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 de ResourceTypes.h, ResourceTypes.cpp y LoadedArsc.cpp está desarrollado en «10-formatos/04» y «10-formatos/05», que los citan campo a campo.
  2. 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.
  3. 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=TEXT y decodificado. De aquí se leyeron directamente kNumPackedOpcodes = 0x100, kPackedSwitchSignature = 0x0100, kSparseSwitchSignature = 0x0200, kArrayDataSignature = 0x0300 y kMaxVarArgRegs = 5 citados en la «sección 3.2 · El código — DEX y bytecode». Verificadas además dex_file.h, standard_dex_file.{h,cc}, dex_file_structs.h, dex_file_verifier.cc y dex_file_loader.cc.
  4. 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 que dexlayout/ ya no existe y la lista de directorios relacionados con DEX que sí quedan («sección 3.2 · El código — DEX y bytecode» y tabla 6).
  5. 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».
  6. 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».
  7. AOSP — system/libziparchive y build/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ó que ZipAlign.cpp está disponible tanto en android.googlesource.com como en el espejo github.com/aosp-mirror/platform_build, que es el que citan «10-formatos/01» y «20-firma/04».
  8. 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 es android-17.0.0_r1 y la existencia de android-16.0.0_r1–_r4 y android-15.0.0_r1–_r36 («sección 2.3 · La regla: fijar una etiqueta, no leer main»).
  9. Comprobación de resolución de etiquetas entre repositorios — ejecutada con curl el 12 de agosto de 2026 sobre platform/art, platform/tools/apksig y platform/system/libziparchive con las etiquetas android-15.0.0_r1, android-16.0.0_r4 y android-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í.
  10. 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úsqueda search?q=…&ss=android. Los cuatro devolvieron HTTP 200.
  11. Mecanismo ?format=TEXT de Gitiles — comprobado el 12 de agosto de 2026 descargando ResourceTypes.h de la rama main y de la etiqueta android-16.0.0_r4, decodificando con base64 -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 de wc -c.
  12. 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.
  13. 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 que ProguardMapWriter.java devuelve 404 y que el lado de escritura es ProguardMapSupplier.java.
  14. 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 con python3 la sección ## Fuentes de 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.
  15. 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 que smali/src/main/antlr/smaliParser.g tiene modo 120000 (symlink) y apunta a third_party/smali/src/main/antlr/smaliParser.g (secciones «4.3» y «6»).