Glosario
1. Cómo usar este glosario
Es el vocabulario compartido de todo el corpus. Cuando un documento usa un término técnico por primera vez lo explica en una frase y enlaza aquí para la definición completa.
Está ordenado alfabéticamente, ignorando mayúsculas y prefijos de puntuación. Los términos técnicos se mantienen en inglés, que es como aparecen en las especificaciones, en el código y en los mensajes de error que el lector se va a encontrar de verdad.
Si buscas una ruta de aprendizaje en vez de una definición suelta, el orden natural es:
- El contenedor —
APK,ZIP,Local File Header,Central Directory,EOCD - El código —
DEX,bytecode Dalvik,smali,ART,D8,R8 - Los recursos —
AXML,resources.arsc,chunk,string pool,resource ID - La distribución —
AAB,split,APK Set,bundletool - La firma —
v1av4,APK Signing Block,lineage,zipalign - La protección —
ProGuard,R8,mapping.txt,packer,PairIP
2. Términos
A
AAB (Android App Bundle) — Formato de publicación de Google Play con extensión .aab.
No se instala: es un contenedor intermedio del que Play genera los APK concretos para cada
dispositivo. Internamente usa Protocol Buffers en vez de los formatos binarios del APK.
Ver AAB, splits y contenedores.
aapt / aapt2 (Android Asset Packaging Tool) — Herramienta oficial de Google que compila
los recursos: convierte res/ y AndroidManifest.xml en resources.arsc y en AXML.
aapt2 es la versión con compilación separada por fichero y enlazado posterior; aapt está
obsoleta pero sigue distribuyéndose.
ABI (Application Binary Interface) — Arquitectura de CPU para la que está compilado el
código nativo. Las vigentes en Android: arm64-v8a, armeabi-v7a, x86_64, x86. Cada
una tiene su directorio bajo lib/.
ADB (Android Debug Bridge) — Herramienta de comunicación con el dispositivo o emulador.
adb install-multiple es la vía para instalar un conjunto de splits sin fusionarlos.
Adler-32 — Suma de comprobación que ocupa los bytes 8 a 11 de la cabecera de un fichero
DEX, calculada sobre todo lo que va detrás. Cambiar un byte del DEX sin recalcularla
hace que el fichero sea rechazado.
AndroidManifest.xml — El manifiesto de la aplicación: nombre de paquete, versión,
permisos, componentes (activity, service, receiver, provider), minSdkVersion y
targetSdkVersion. Dentro del APK no es XML de texto: está en formato AXML.
anti-debug — Conjunto de técnicas con las que una aplicación detecta que se la está
depurando: leer TracerPid de /proc/self/status, llamar a ptrace(PTRACE_TRACEME) sobre
sí misma, medir tiempos. Ver
Anti-análisis y hardening.
APK (Android Package) — El fichero que Android instala. Es un ZIP con una estructura
convenida: AndroidManifest.xml en AXML, classes*.dex, resources.arsc, res/,
assets/, lib/<abi>/, META-INF/.
APK Set — Contenedor con extensión .apks que produce bundletool a partir de un AAB.
Es un ZIP que agrupa los splits más un toc.pb que describe qué contiene cada uno.
La extensión miente con frecuencia: 14 de los 16 .apks del corpus de verificación no llevan
toc.pb. Medidos uno a uno, los catorce llevan manifest.json con "xapk_version": "2":
son .xapk de APKCombo con la extensión cambiada, no zips planos anónimos.
APK Signing Block — Bloque de datos insertado entre el último fichero y el
Central Directory del ZIP, donde viven las firmas v2, v3, v3.1 y los metadatos
asociados. Se reconoce por la cadena mágica APK Sig Block 42.
Ver APK Signing Block.
APKEditor — Herramienta en Java construida sobre ARSCLib que edita APK sin necesitar
aapt2, y que sabe fusionar splits.
apksigner — Herramienta oficial de firma y verificación de las build-tools del SDK.
Es el oráculo diferencial de cualquier implementación alternativa de firma: lo que se
firme por otra vía, apksigner tiene que aceptarlo, y su veredicto de verificación es el que
manda.
APKiD — Herramienta de identificación de compiladores, ofuscadores y packers a partir
de huellas estáticas en el DEX y en los binarios nativos. El equivalente de PEiD para
Android.
.apkm — Contenedor de APKMirror. ZIP que agrupa splits junto a un info.json y su
propia firma JAR (META-INF/APKMIRRO.RSA).
apktool — Herramienta clásica de desempaquetado y reempaquetado. Decodifica recursos a
XML de texto y DEX a smali, permite editar y vuelve a construir el APK invocando a
aapt2. Su dependencia de aapt2 es la fuente de buena parte de sus fallos de
reempaquetado.
ARSCLib — Biblioteca Java que lee y escribe resources.arsc sin usar aapt2. Es la
base de APKEditor.
ART (Android Runtime) — El runtime de Android desde la versión 5.0, sustituto de Dalvik.
Compila el DEX a código nativo mediante dex2oat, produciendo ficheros .oat, .vdex y
.art en el dispositivo.
assets/ — Directorio del APK con ficheros que se entregan tal cual, sin compilar ni
indexar en resources.arsc. Se leen con AssetManager.
AXML (Android Binary XML) — Formato binario en el que se guardan los ficheros XML dentro
de un APK, incluido AndroidManifest.xml y todo lo de res/*.xml. Comparte con
resources.arsc el sustrato de chunks y el string pool.
Ver XML binario.
B
baksmali — Desensamblador de DEX a smali. Su inverso es smali. Es la vía estándar
para editar el código de una aplicación sin tener el código fuente.
baseline profile — Fichero (baseline.prof, baseline.profm) que lista los métodos que
conviene compilar de antemano, para que ART los tenga listos en el primer arranque.
bundletool — Herramienta oficial que convierte un AAB en APK Set, genera el conjunto
de splits para un dispositivo concreto y los instala. Versión usada en las mediciones de
este corpus: 1.18.3.
bytecode Dalvik — El juego de instrucciones que contiene un DEX. Basado en registros,
a diferencia del bytecode de la JVM, que está basado en pila.
Ver Bytecode Dalvik.
C
Central Directory — Índice al final de un ZIP con una entrada por fichero. Es la
autoridad sobre qué contiene el archivo: un lector correcto lo consulta a él y no a los
Local File Header. La divergencia entre ambos es la raíz de varias vulnerabilidades
históricas de Android.
chunk — Unidad estructural de los formatos binarios de recursos de Android. Todo
chunk empieza por un ResChunk_header con tipo, tamaño de cabecera y tamaño total, lo que
permite saltarse los que no se entienden sin perderlos. Es la propiedad que hace posible el
round-trip byte-exacto.
classes.dex — El primer fichero DEX de un APK. Con multidex le acompañan
classes2.dex, classes3.dex y sucesivos.
code_item — Estructura del DEX que contiene el cuerpo de un método: número de
registros, instrucciones, bloques try/catch e información de depuración.
config split — Split que contiene solo los recursos de una configuración: una
densidad, un idioma o una ABI. Se nombra config.xxhdpi, config.es, config.arm64_v8a.
D
D8 — Compilador de Google que convierte bytecode de la JVM (.class) en DEX.
Sustituye a dx. Su hermano con optimización y ofuscación es R8.
Dalvik — La máquina virtual original de Android, sustituida por ART en Android 5.0.
Da nombre al bytecode Dalvik, que sigue vigente.
data descriptor — Estructura opcional del ZIP que se escribe detrás de los datos de
una entrada cuando el tamaño no se conocía al escribir la cabecera. Se señala con el bit 3
del campo de flags. Es una de las fuentes clásicas de discrepancia entre lectores.
deflate — Algoritmo de compresión por defecto del ZIP (método 8). El otro método
habitual en un APK es stored (método 0), sin comprimir, obligatorio para resources.arsc
y para las bibliotecas nativas que se cargan directamente del APK.
deofuscación — Recuperar nombres o estructura legibles de código ofuscado. Se divide en
determinista —aplicar un mapping.txt, renombrar recursos— y heurística —inferir
nombres sin mapping—.
Ver Deofuscación.
DEX (Dalvik EXecutable) — Formato del código compilado de Android. Un solo fichero
contiene muchas clases, con los string, tipos, prototipos, campos y métodos agrupados en
tablas compartidas. Ver Formato DEX.
dex2jar — Herramienta que convierte DEX en un .jar de clases Java, para poder
aplicarle un decompilador de Java convencional. Es la ruta alternativa a jadx.
dexdump — Utilidad de las build-tools que vuelca la estructura y el bytecode de un
DEX en texto. Útil como oráculo de bajo nivel.
DexGuard — Ofuscador y protector comercial de Guardsquare, el hermano de pago de
ProGuard. Añade cifrado de strings y de clases, ofuscación de control flow, comprobaciones
de integridad y packing. Presente en Netflix dentro del corpus de verificación.
digest — Resumen criptográfico. En la firma de un APK se calculan digests por bloques
de 1 MiB del contenido del fichero, y luego un digest sobre la concatenación de todos ellos.
E
ELF (Executable and Linkable Format) — Formato de los binarios nativos de Linux, y por
tanto de los .so que viven en lib/<abi>/ de un APK.
EOCD (End Of Central Directory) — Estructura final de un ZIP que indica dónde empieza
el Central Directory y cuántas entradas tiene. Se localiza buscando su firma 0x06054b50
desde el final. Es el punto de entrada de cualquier lector de ZIP.
extractNativeLibs — Atributo del manifiesto que decide si las bibliotecas nativas se
copian al disco al instalar (true) o se cargan directamente desde el APK (false). En
el segundo caso deben estar sin comprimir y alineadas.
F
feature module — Módulo de funcionalidad de un AAB que se descarga bajo demanda en vez
de venir en la instalación inicial. Produce su propio split. El bundle de Netflix del
corpus trae split_voip y split_partnermodule, que son el caso difícil de la fusión.
Frida — Framework de instrumentación dinámica que inyecta JavaScript en un proceso en ejecución. Herramienta central del análisis dinámico, y por tanto objetivo habitual de las protecciones anti-análisis.
frosting — Bloque 0x2146444e del APK Signing Block que Google Play inserta al
distribuir, no la cadena de firma de Android. Contiene metadatos en Protocol Buffers
firmados con clave de Google. No está en apksig y apksigner no lo reporta, así que hay que
buscarlo en el binario. Su presencia es una huella de procedencia: aparece en 25 de los
717 APK del corpus, exactamente los que vienen de Play.
Ver APK Signing Block.
fs-verity — Mecanismo del kernel de Linux que verifica la integridad de un fichero de forma perezosa mediante un árbol de Merkle. Es la base de la firma v4 de Android.
G
Ghidra — Suite de ingeniería inversa de la NSA, de código abierto. Se usa sobre el código
nativo (.so) de un APK, y con extensiones también sobre DEX.
I
.idsig — Fichero acompañante que contiene la firma v4: el árbol de Merkle y la firma
sobre su raíz. Viaja al lado del APK, no dentro.
incremental install — Modo de instalación de Android que arranca la aplicación antes de
haber transferido el APK completo, verificando cada bloque al vuelo. Es lo que motiva la
existencia de la firma v4.
J
jadx — Decompilador de DEX a Java, de código abierto y en Java. Es la referencia del
sector, y la pieza que nadie reimplementa: rehacerlo cuesta más que todo lo demás junto,
así que lo habitual es invocarlo como subproceso.
JAR signing — El esquema de firma v1, heredado del formato JAR de Java. Firma cada
entrada por separado mediante META-INF/MANIFEST.MF, META-INF/*.SF y un bloque PKCS#7.
Su debilidad estructural es que no cubre el contenedor entero.
JNI (Java Native Interface) — El puente entre el código Java/Kotlin y el código nativo.
El punto por el que la lógica sensible se mueve a .so para dificultar el análisis.
JKS (Java KeyStore) — Formato de almacén de claves de Java, hoy sustituido por PKCS#12
pero todavía muy presente en keystores antiguos de firma de aplicaciones.
K
keystore — Almacén cifrado con la clave privada y el certificado con los que se firma un
APK. Formatos: JKS (antiguo) y PKCS#12 (.p12, actual).
L
LEB128 (Little Endian Base 128) — Codificación de enteros de longitud variable que usa el
DEX en casi todas sus estructuras de datos. Variantes uleb128 (sin signo), sleb128 (con
signo) y uleb128p1 (sin signo, desplazado en uno para poder representar -1).
lineage — Cadena de rotación de certificados de la firma v3: acredita que una clave nueva sucede legítimamente a una anterior, con los permisos que se le hayan concedido.
Local File Header — Cabecera que precede a los datos de cada entrada dentro de un ZIP.
Contiene una copia de parte de la información que también está en el Central Directory, y
esa duplicación es precisamente el problema.
M
mapping.txt — Fichero que produce R8 o ProGuard con la correspondencia entre los
nombres originales y los ofuscados. Sin él, la ofuscación es irreversible en la práctica;
con él, es reversible de forma determinista.
Ver R8 y ProGuard.
merge — Fusionar un conjunto de splits en un único APK instalable. Exige unir tablas
de recursos, sanear el manifiesto, renumerar los DEX y resolver colisiones de identificador.
Ver Fusión de splits.
META-INF/ — Directorio del APK con los metadatos de la firma v1 y otros artefactos:
MANIFEST.MF, *.SF, *.RSA/*.DSA/*.EC, services/, *.kotlin_module.
MobSF (Mobile Security Framework) — Plataforma de análisis estático y dinámico de aplicaciones móviles. Marca el suelo gratuito del escaneo básico.
multidex — Mecanismo para superar el límite de 65.536 referencias a método por fichero
DEX, repartiendo las clases en varios classes*.dex.
MUTF-8 (Modified UTF-8) — Variante de UTF-8 que usa el DEX para sus cadenas: codifica
el carácter nulo en dos bytes y los caracteres fuera del plano básico como pares subrogados.
No es UTF-8 estándar, y tratarlo como tal produce errores sutiles.
O
oat / odex / vdex — Ficheros que produce dex2oat en el dispositivo al compilar el DEX
de una aplicación instalada. Contienen código nativo y metadatos de verificación. Solo
aparecen en el dispositivo, nunca dentro del APK distribuido.
ofuscación — Transformar un programa para dificultar su comprensión sin cambiar su comportamiento. Va desde renombrar identificadores hasta cifrar strings, aplanar el flujo de control o mover lógica a código nativo.
opcode — Código de operación de una instrucción del bytecode Dalvik. Ocupa un byte y
determina el formato del resto de la instrucción.
P
packer — Protector que sustituye el DEX original por un stub que descifra y carga el
código real en tiempo de ejecución. Ejemplos: Jiagu, Bangcle, Virbox, SecNeo.
Ver Packers y protectores.
PairIP — Tecnología de protección de integridad de Google Play que reestructura el código de la aplicación y lo ata a la instalación concreta. El corpus de verificación no contiene ninguna muestra.
PKCS#7 / CMS — Formato de mensaje criptográfico firmado. Es el contenido de los ficheros
.RSA/.DSA/.EC de la firma v1. Especificado en el RFC 5652.
Play Integrity — API de Google que permite a una aplicación comprobar si se ejecuta sobre un dispositivo y una instalación legítimos. Sucesora de SafetyNet Attestation.
ProGuard — El ofuscador y reductor clásico de Java y Android, hoy desplazado por R8 en
la cadena de compilación oficial pero todavía presente en proyectos antiguos y como
generador del formato mapping.txt.
Protocol Buffers (protobuf) — Formato de serialización de Google. Es lo que usa el AAB
internamente (BundleConfig.pb, resources.pb, toc.pb), a diferencia del APK, que usa
los formatos binarios propios de Android.
R
R8 — El reductor, optimizador y ofuscador oficial de Android, integrado en la cadena de
compilación. Hace en un solo paso el trabajo de D8 más el de ProGuard. Produce el
mapping.txt.
res/ — Directorio del APK con los recursos compilados: res/layout/, res/drawable/,
res/values/. Los .xml que contiene están en formato AXML. Cuando el nombre de los
ficheros está ofuscado, se ven rutas como res/AB/x1.xml.
Res_value — Estructura de 8 bytes que representa un valor de recurso tipado: entero,
referencia, color, dimensión, cadena. Aparece tanto en resources.arsc como en AXML.
ResChunk_header — Cabecera de 8 bytes común a todos los chunks de los formatos de
recursos: tipo (2 bytes), tamaño de cabecera (2 bytes), tamaño total (4 bytes). Es la pieza
que permite ignorar sin perder.
resource ID — Identificador de 32 bits de un recurso, con la forma 0xPPTTEEEE: PP es
el paquete, TT el tipo y EEEE la entrada. El paquete de la aplicación es normalmente
0x7f y el del framework de Android, 0x01.
resources.arsc — La tabla de recursos del APK: asocia cada resource ID con sus
valores para cada configuración (idioma, densidad, orientación, versión de API). No existe
ningún escritor de este formato en Rust, lo que lo convierte en el camino crítico de cualquier
implementación fuera de Java.
Ver Tabla de recursos.
retrace — Aplicar un mapping.txt en sentido inverso para recuperar los nombres
originales en una traza de pila o en un informe. Es deofuscación determinista y sin riesgo.
round-trip — Leer un fichero, volver a escribirlo y obtener exactamente los mismos bytes.
Es la puerta de viabilidad de cualquier escritor de resources.arsc: sin round-trip
byte-exacto no hay editor, hay visor.
S
SAI (Split APKs Installer) — Aplicación de instalación de splits cuyo formato de
contenedor es un ZIP plano con ficheros split_*.apk. Es una de las variantes que el
detector de formato tiene que reconocer por estructura.
smali — Sintaxis de texto para el bytecode Dalvik, y nombre del ensamblador que la
convierte en DEX. Su inverso es baksmali. También el nombre del crate de Rust de azw413,
cuya licencia GPL-3.0-only obliga a aislarlo en un proceso separado para integrarlo desde un
producto con licencia permisiva.
source stamp — Bloque opcional dentro del APK Signing Block (identificador
0x6dff800d) que acredita el origen de la aplicación de forma independiente a la firma de
distribución.
split — Cada uno de los APK parciales que componen una aplicación distribuida como
AAB. Hay un base.apk y luego splits de configuración y de módulo de funcionalidad.
Todos comparten packageName y versionCode.
string pool — Tabla de cadenas compartida, presente tanto en AXML como en
resources.arsc. Admite codificación UTF-8 o UTF-16 según un flag, y puede llevar estilos
asociados. Es la pieza más delicada del round-trip byte-exacto.
T
targetSdkVersion — Nivel de API contra el que se declara compilada la aplicación. Determina qué comportamientos del sistema se le aplican y, para las publicadas en Play, está sujeta a un mínimo obligatorio que sube cada año.
toc.pb — Tabla de contenidos en Protocol Buffers que bundletool incluye en la raíz de
un APK Set genuino. Su presencia es el criterio para distinguir un .apks real de un zip
plano de splits con la extensión puesta a mano.
type spec — Chunk de resources.arsc que declara, para un tipo de recurso, qué
configuraciones hacen variar cada entrada. Es el índice que permite decidir qué entradas
puede descartar un split.
V
verificación de bytecode — Comprobación que hace ART al cargar un DEX: que los
registros tienen los tipos esperados, que los saltos caen dentro del método, que las
invocaciones son coherentes. Un DEX editado a mano que no supere la verificación produce
un fallo en tiempo de carga, no en tiempo de ejecución.
v1, v2, v3, v3.1, v4 — Los esquemas de firma de APK.
v1 es JAR signing, por entrada;
v2 firma el fichero completo;
v3 añade rotación de claves;
v3.1 añade segmentación por nivel de API;
v4 añade un árbol de Merkle en un fichero .idsig aparte, para la instalación incremental.
Existe además un v3.2 cuyas constantes están en el apksigner de las build-tools 37 pero
que no aparece documentado en ninguna fuente pública.
Ver Esquemas de firma.
X
.xapk — Contenedor de APKCombo y APKPure. ZIP con los splits y un manifest.json
que incluye una clave xapk_version.
Z
ZIP — El formato de archivo sobre el que está construido el APK, el AAB y todos los
contenedores de splits. Especificado por PKWARE en APPNOTE.TXT.
Ver Contenedor ZIP.
zipalign — Herramienta oficial que alinea las entradas sin comprimir de un APK a un
límite de bytes, para que el sistema pueda mapearlas en memoria directamente. Se ejecuta
antes de firmar con v2 o superior, nunca después.
Zip64 — Extensión del formato ZIP para archivos de más de 4 GiB o más de 65.535
entradas. Añade sus propias estructuras EOCD y un localizador.
3. Siglas de un vistazo
| Sigla | Desarrollo |
|---|---|
| AAB | Android App Bundle |
| aapt | Android Asset Packaging Tool |
| ABI | Application Binary Interface |
| ADB | Android Debug Bridge |
| APK | Android Package |
| ART | Android Runtime |
| AXML | Android Binary XML |
| CD | Central Directory |
| CMS | Cryptographic Message Syntax |
| DEX | Dalvik EXecutable |
| ELF | Executable and Linkable Format |
| EOCD | End Of Central Directory |
| JKS | Java KeyStore |
| JNI | Java Native Interface |
| LEB128 | Little Endian Base 128 |
| LFH | Local File Header |
| MUTF-8 | Modified UTF-8 |
| SAI | Split APKs Installer |
| SDK | Software Development Kit |
Las definiciones de este glosario se ampliarán y se contrastarán contra las fuentes oficiales en los documentos de referencia de cada formato, que son los que llevan la bibliografía completa. Este documento es un índice de vocabulario, no la autoridad sobre ningún formato.