Código fuente de referencia
1. Qué es y por qué existe
El documento anterior termina con una lista de catorce 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 futuro. La rama de desarrollo de AOSP contiene código que no está en ningún dispositivo. Documentar desdemaines la forma más rápida de escribir algo que es cierto en el repositorio y falso en el mundo. La sección 2.3 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 este corpus 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.)
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 rama de desarrollo. Contiene código que aún no ha salido en ningún dispositivo | Para ver hacia dónde va algo |
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. El corpus ya usa esta 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 un campo «existe» cuando no existe en ningún teléfono.
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). 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.536 entradas por tipo |
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 86 KB 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 no documenta) 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: https://android.googlesource.com/platform/tools/apksig/+/refs/heads/main/
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á aquí: las constantes de v3.2 no aparecen en la rama pública de apksig.
Se obtuvieron del apksigner.jar de las build-tools 37.0.0 con javap -constants
(20-firma/01 §2). Y los identificadores de bloque de
terceros —dependency metadata, frosting, Meituan— no están en AOSP en absoluto: para eso, §4.10.
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 |
|---|---|
smali/src/main/antlr/smaliParser.g |
La gramática ANTLR: la especificación real del lenguaje smali. No existe otra |
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: el repositorio contiene un árbol duplicado bajo third_party/smali/. Usar
siempre las rutas sin ese prefijo.
4.4 ARSCLib — rama main
La reimplementación en Java de los formatos de recursos, sin aapt2. Es la referencia de
diseño obligada para cualquier lector de resources.arsc escrito desde cero.
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).
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 el corpus 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) 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 §11
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 corpus: 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 |
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/ |
Existe, pero es un duplicado | Las rutas sin ese prefijo |
google/smali blob/master/… |
Redirige | blob/main/… |
Constantes de firma v3.2 en apksig |
No están | apksigner.jar de las build-tools, con javap -constants |
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/heads/main/libs/androidfw/ Consultado el 12 de agosto de 2026. De aquí sale la tabla de la sección 3.1. 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/heads/main/tools/aapt2/ Consultado el 12 de agosto 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/heads/main/libdexfile/dex/dex_instruction.h Consultado el 12 de agosto 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. 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/heads/main/ Consultado el 12 de agosto de 2026. De aquí sale quedexlayout/ya no existe y la lista de directorios relacionados conDEXque sí quedan (sección 3.2 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/heads/main/runtime/verifier/method_verifier.cc Consultados el 12 de agosto de 2026. Secciones 3.2 y 3.5. - AOSP —
platform/tools/apksig— https://android.googlesource.com/platform/tools/apksig/+/refs/heads/main/ Consultado el 12 de agosto de 2026. Las dieciséis rutas de la tabla de la sección 3.3 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/heads/main/zip_archive.cc y https://android.googlesource.com/platform/build/+/refs/heads/main/tools/zipalign/ZipAlign.cpp Consultados el 12 de agosto de 2026. Sección 3.4. 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). - 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 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: 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 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 y las rutas de cada uno. De aquí salen íntegras las tablas de las secciones 4.1 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, incluido queProguardMapWriter.javadevuelve 404 y que el lado de escritura esProguardMapSupplier.java. - Documentos ya escritos del corpus —
10-formatos/,20-firma/,30-herramientas/y40-ofuscacion/Consultados el 12 de agosto de 2026. La tabla de trazabilidad de la sección 5 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 a 3.5 resumen lo que cada documento declara haber tomado de cada fichero.