Cuando tocas "Instalar" en un archivo APK o descargas una aplicación de Play Store, comienza una compleja secuencia de operaciones detrás de escena. Lo que parece ser una simple barra de progreso en realidad representa docenas de pasos que involucran análisis de paquetes, verificación criptográfica, administración de permisos, extracción de archivos y optimización de código. Comprender este proceso ayuda a explicar por qué a veces fallan las instalaciones y qué puede hacer al respecto.
En este artículo, recorreremos cada paso importante del proceso de instalación de Android, desde el momento en que el sistema recibe un APK hasta el punto en que la aplicación está lista para iniciarse.
Paso 1: Iniciar la instalación
El proceso de instalación comienza de forma diferente según la fuente:
- Tienda de juegos: La aplicación Play Store descarga el APK (o APK divididos) y llama al instalador de paquetes del sistema con privilegios especiales que omiten algunas confirmaciones de los usuarios.
- Descarga lateral: Cuando abre un archivo APK, Android inicia la actividad del instalador del paquete. En Android 8.0 y versiones posteriores, la aplicación que se instala debe tener el permiso "Instalar aplicaciones desconocidas" para su fuente específica.
- BAsD: El comando adb install se comunica directamente con el servicio del administrador de paquetes a través de USB, evitando por completo el instalador gráfico.
Independientemente del origen, todas las instalaciones acaban llegando al mismo servicio del sistema: el Servicio de administrador de paquetes (PMS). Esta es la autoridad central para todas las operaciones de paquetes en Android.
Paso 2: análisis del paquete
Antes que nada, el sistema necesita entender lo que está a punto de instalar. PackageManagerService invoca Analizador de paquetes para leer el archivo APK y extraer sus metadatos.
El analizador lee el archivo AndroidManifest.xml desde el APK. Este archivo XML binario contiene información crítica:
- Nombre del paquete: El identificador único de la aplicación (por ejemplo, com.example.myapp)
- Código y nombre de la versión: Se utiliza para determinar si se trata de una actualización o una instalación nueva
- Versiones mínimas y de destino del SDK: Determina la compatibilidad con el dispositivo.
- Permisos declarados: Tanto los permisos que solicita la aplicación como los permisos personalizados que define
- Componentes: Actividades, servicios, receptores de transmisión y proveedores de contenido que registra la aplicación
- Requisitos de Características de hardware y software: como cámara, GPS o versiones específicas de OpenGL
Si el manifiesto tiene un formato incorrecto o la estructura del APK no es válida, la instalación falla en esta etapa con un mensaje de "Error de análisis". Esta es una de las razones más comunes por las que los APK descargados no se instalan.
Paso 3: comprobaciones de compatibilidad
Una vez analizado el manifiesto, el sistema realiza una serie de comprobaciones de compatibilidad:
- Versión del SDK: Si el minSdkVersion de la aplicación es superior al nivel API del dispositivo, se rechaza la instalación.
- Compatibilidad ABI: Si el APK contiene bibliotecas nativas, el sistema verifica si coinciden con la arquitectura de CPU del dispositivo. Un APK que solo contenga bibliotecas armeabi-v7a no se instalará en un dispositivo solo x86.
- Características requeridas: Si la aplicación declara características de hardware requeridas (como android.hardware.telephony), el sistema verifica que el dispositivo las admita.
- Almacenamiento disponible: El sistema comprueba si hay suficiente espacio libre para instalar la aplicación, incluido espacio para las bibliotecas nativas extraídas y los archivos DEX optimizados.
Paso 4: Verificación de firma
Este es uno de los pasos más críticos en el proceso de instalación. Android verifica la firma criptográfica del APK para garantizar su integridad y autenticidad.
El proceso de verificación depende de qué esquemas de firma estén presentes:
Firma V1 (firma JAR)
El sistema busca archivos de firma en el directorio META-INF/ (.SF, .RSA o .DSA). Cada archivo del APK se verifica con los resúmenes enumerados en el manifiesto. Esto es lento porque cada archivo debe tener un hash individual.
Firma V2 (esquema de firma APK v2)
Introducido en Android 7.0, este esquema firma el APK completo como un blob binario. El bloque de firma se inserta entre el directorio central ZIP y el registro de fin del directorio central. La verificación es mucho más rápida porque opera en los bytes sin procesar sin necesidad de descomprimir entradas individuales.
Firma V3 (rotación de clave)
Disponible desde Android 9.0, V3 extiende V2 con soporte para rotación de claves. Incluye una estructura de prueba de rotación que vincula las claves de firma nuevas y antiguas, lo que permite a los desarrolladores cambiar su clave de firma mientras mantienen la compatibilidad de las actualizaciones.
Firma V4 (incremental)
Android 11 introdujo V4 para instalaciones incrementales. Proporciona una firma basada en árbol Merkle que permite la verificación de bloques individuales a medida que se transmiten al dispositivo.
Si la verificación de la firma falla por algún motivo, la instalación se cancela inmediatamente. Puede verificar la firma de un APK antes de la instalación usando nuestro Herramienta de verificación de APK.
Actualizar coincidencia de firmas
Si ya está instalada una aplicación con el mismo nombre de paquete, el sistema realiza una verificación adicional: el certificado de firma del nuevo APK debe coincidir con el certificado de instalación existente. Esto evita que una parte malintencionada reemplace una aplicación legítima con una versión manipulada. Si las firmas no coinciden, verá el error "Aplicación no instalada: el paquete entra en conflicto con un paquete existente con el mismo nombre".
Paso 5: Confirmación del usuario
Para instalaciones de carga local, el sistema muestra un cuadro de diálogo de confirmación de instalación que muestra:
- El nombre y el ícono de la aplicación (extraídos de los recursos del APK)
- Permisos que solicita la aplicación (en versiones anteriores de Android)
- Si se trata de una nueva instalación o una actualización
- Cualquier advertencia sobre el origen de la aplicación o los riesgos potenciales.
En Android 12 y versiones posteriores, la pantalla de confirmación es más sencilla ya que los permisos de tiempo de ejecución se otorgan individualmente cuando la aplicación los necesita por primera vez, en lugar de en el momento de la instalación.
Paso 6: Extracción y colocación de archivos
Una vez que el usuario confirma (o para las instalaciones de Play Store, automáticamente), el sistema comienza a extraer y colocar archivos:
Almacenamiento de APK
El archivo APK se copia en /data/app/[package-name]-[random]/base.apk. Para instalaciones de APK divididas, los archivos adicionales como split_config.arm64_v8a.apk se colocan junto al APK base. El APK original en la carpeta Descargas no se modifica ni se elimina.
Extracción de biblioteca nativa
Si el APK contiene bibliotecas nativas (en el directorio lib/, se extraen a /data/app/[package-name]-[random]/lib/[abi]/). En las versiones más nuevas de Android, las aplicaciones pueden optar por mantener las bibliotecas nativas comprimidas dentro del APK y cargarlas directamente usando android:extractNativeLibs="false", lo que ahorra espacio de almacenamiento.
Creación de directorio de datos
El sistema crea el directorio de datos privados de la aplicación en /data/data/[package-name]/ (o /data/user/0/[package-name]/ en dispositivos multiusuario). Este directorio es propiedad de un UID de Linux único asignado a la aplicación, lo que garantiza que ninguna otra aplicación pueda acceder a él sin privilegios de root.
Paso 7: Optimización DEX
En este paso, Android transforma el código de bytes de la aplicación en un formato optimizado para el hardware específico del dispositivo. El proceso ha evolucionado significativamente a lo largo de la historia de Android:
La era Dalvik (Android 4.4 y anteriores)
La máquina virtual Dalvik original utilizaba compilación Just-In-Time (JIT). Durante la instalación, el archivo classes.dex se optimizó en un archivo ODEX que contenía un código de bytes verificado y optimizado. Esto fue relativamente rápido, pero significó que la aplicación se ejecutara más lentamente en tiempo de ejecución ya que la mayor parte del código aún se interpretaba.
ART con AOT (Android 5.0 a 6.0)
Android Runtime (ART) reemplazó a Dalvik e introdujo la compilación Ahead-Of-Time (AOT). Durante la instalación, todo el código de bytes DEX se compiló en código de máquina nativo. Esto hizo que las aplicaciones se ejecutaran más rápido pero aumentó significativamente el tiempo de instalación y el uso de almacenamiento. Algunas aplicaciones tardaron varios minutos en instalarse.
Compilación guiada por perfiles (Android 7.0+)
El Android moderno utiliza un enfoque híbrido. Durante la instalación, sólo se compilan las rutas de inicio críticas. A medida que el usuario ejecuta la aplicación, el sistema recopila perfiles de ejecución que identifican rutas de código utilizadas con frecuencia. Durante el mantenimiento inactivo (normalmente mientras se carga durante la noche), el sistema compila estas rutas activas en código nativo. Esto equilibra la velocidad de instalación, el uso de almacenamiento y el rendimiento del tiempo de ejecución.
El código compilado se almacena en /data/dalvik-cache/ o junto con el APK como archivos .odex, .vdex y .art. El archivo .vdex contiene código DEX verificado, el archivo .odex contiene código nativo compilado y el archivo .art contiene imágenes de montón preinicializadas para un inicio más rápido.
Paso 8: Registro de permiso
PackageManagerService registra los permisos y componentes declarados de la aplicación en el sistema:
- Permisos de tiempo de instalación (como INTERNET o VIBRATE se otorgan automáticamente sin interacción del usuario).
- Permisos de tiempo de ejecución (como CAMERA o LOCATION están registrados pero no concedidos). La aplicación debe solicitarlos en tiempo de ejecución.
- Filtros de intención están registrados para que el sistema sepa qué aplicaciones pueden manejar qué acciones (como abrir una URL o compartir contenido).
- Proveedores de contenido están registrados ante sus autoridades para que otras aplicaciones puedan consultarlos.
Paso 9: Integración del sistema
Los pasos finales integran la aplicación en el sistema Android:
- Actualización de la base de datos del paquete: La base de datos de paquetes del sistema (/data/system/packages.xml se actualiza con la información de la nueva aplicación, incluido su UID asignado, permisos y declaraciones de componentes).
- Notificación del iniciador: El iniciador de la pantalla de inicio recibe una notificación sobre la nueva aplicación para que pueda mostrar el ícono de la aplicación.
- Transmisión: El sistema envía una transmisión PACKAGE_ADDED, lo que permite que otras aplicaciones reaccionen a la nueva instalación (por ejemplo, las aplicaciones de respaldo pueden programar una copia de seguridad).
- Contexto SELinux: Los archivos de la aplicación están etiquetados con el contexto de seguridad SELinux apropiado según su versión de SDK de destino y los permisos declarados.
Por qué fallan las instalaciones
Comprender el proceso de instalación ayuda a diagnosticar fallas comunes:
- "Error de análisis": El APK está dañado, incompleto o tiene un manifiesto con formato incorrecto. Esto sucede a menudo con descargas incompletas o archivos convertidos incorrectamente.
- "Aplicación no instalada" (la firma no coincide): Estás intentando actualizar una aplicación con un APK firmado con una clave diferente. Primero debe desinstalar la versión existente.
- "Almacenamiento insuficiente": No hay suficiente espacio para el APK, las bibliotecas extraídas y la salida de optimización DEX. El espacio real necesario suele ser entre 2 y 3 veces el tamaño del APK.
- "El paquete entra en conflicto con el paquete existente": Mismo nombre de paquete pero firma diferente. Común al cambiar entre Play Store y versiones descargadas.
- Bajada de versión bloqueada: De forma predeterminada, Android impide instalar una versión anterior sobre una más nueva. ADB puede anular esto con adb install -d.
Instalación de APK dividida
Al instalar APK divididos (de App Bundles), el proceso es ligeramente diferente. El sistema utiliza una API instalación basada en sesión:
- Se crea una nueva sesión de instalación.
- Cada APK dividido se escribe en la sesión.
- La sesión se confirma, lo que activa el proceso de verificación completo.
- Todas las divisiones deben tener nombres de paquetes, códigos de versión y certificados de firma coincidentes.
Este es el mecanismo utilizado por los instaladores y herramientas XAPK como nuestro Fusión de APKS a APK para manejar instalaciones de múltiples archivos.
Instalación a través de ADB
Cuando utiliza adb install, el proceso omite el instalador gráfico pero sigue el mismo proceso interno. ADB se comunica con el servicio del administrador de paquetes a través de una conexión de socket. Admite indicadores adicionales que no están disponibles a través de la GUI:
- -r: Reemplazar la aplicación existente (permitir reinstalar)
- -d: Permitir la degradación de la versión
- -g: Otorgar todos los permisos de tiempo de ejecución inmediatamente
- -t: Permitir la instalación de APK de solo prueba
- --install-multiple: Instalar APK divididos en una sola sesión
Qué sucede durante la desinstalación
Para completar, esto es lo que sucede cuando se elimina una aplicación:
- Los procesos de la aplicación se eliminan.
- El APK y las bibliotecas extraídas se eliminan de /data/app/
- Se elimina el directorio de datos privados de la aplicación (a menos que el usuario elija conservar los datos)
- Los archivos de caché DEX compilados se eliminan
- La base de datos del paquete está actualizada.
- Se envía una transmisión PACKAGE_REMOVED
- El iniciador elimina el ícono de la aplicación.
Tenga en cuenta que los archivos específicos de la aplicación en el almacenamiento externo (/Android/data/[package]/ y /Android/obb/[package]/ también se eliminan en Android 10 y versiones posteriores, gracias a la aplicación de almacenamiento limitado).
Por qué comprender PackageManager ahorra tiempo de depuración
El proceso de instalación de Android es una secuencia cuidadosamente orquestada de controles de seguridad, operaciones de archivos e integraciones de sistemas. Cada paso tiene un propósito, desde proteger a los usuarios contra aplicaciones manipuladas hasta optimizar el rendimiento del hardware específico. Cuando las instalaciones fallan, el error generalmente apunta a un paso específico en este proceso, y comprender el proceso lo ayuda a diagnosticar y resolver problemas rápidamente.
La instalación desde Play Store, la descarga manual de un APK y el envío de una compilación con ADB se canalizan a través del mismo canal subyacente, el que garantiza que cada aplicación en su dispositivo haya sido verificada, colocada correctamente y optimizada para su hardware.