Saltar a contenido

Fundamentos de una aplicación

En Android, una aplicación es el conjunto de código, recursos y metadatos que se empaqueta en un archivo con extensión .apk1.

El SDK2 de Android compila y firma este paquete, que luego se instala en el dispositivo.

Aislamiento y seguridad

Android se basa en un núcleo Linux multiusuario. Cada aplicación instalada se trata como un usuario independiente con su propio entorno de ejecución:

  • UID único (User ID3): el sistema asigna a cada app un identificador de usuario Linux. Este UID garantiza que los archivos de una aplicación solo sean accesibles por ella misma.
  • Sandbox: cada aplicación se ejecuta en un entorno aislado (sandbox). Ninguna app puede acceder directamente a los datos de otra salvo que se compartan explícitamente.
  • Proceso independiente: por defecto, cada aplicación corre en su propio proceso Linux. Android lo inicia cuando se necesita y lo finaliza para liberar recursos.
  • Máquina Virtual: el código se ejecuta en una MV (Dalvik en versiones antiguas, ART – Android Runtime desde Android 5), lo que añade portabilidad y seguridad.

Este modelo responde al principio de mínimo privilegio: una app solo accede a lo que necesita y nunca a todo el sistema.

PoLP

El principio del mínimo privilegio (PoLP) es un concepto relacionado con la seguridad de la información según el cual un usuario o entidad solo debe tener acceso a los datos, los recursos y las aplicaciones que necesite para llevar a cabo una determinada tarea. Las organizaciones que aplican el principio del mínimo privilegio mejoran su estrategia de seguridad, ya que reducen de forma considerable su superficie de ataque y el riesgo de propagación de malware.

Compartición y permisos

Aunque las apps están aisladas, existen mecanismos controlados para la interacción:

  • UID compartido: dos aplicaciones pueden ejecutarse bajo el mismo UID y proceso si:

    1. Están firmadas con el mismo certificado digital.
    2. Declaran explícitamente la opción en el manifiesto (sharedUserId).

    Esto permite que compartan datos y recursos.

  • Permisos: las apps solicitan acceso a recursos sensibles (cámara, contactos, Bluetooth, etc.).

    • En la instalación (permisos normales).
    • En tiempo de ejecución (permisos peligrosos, desde Android 6).

    Bug

    El usuario siempre tiene la última palabra. Por mucha seguridad que pongamos, el peor virus para un sistema operativo es el ser humano.

Componentes de una aplicación

En Android, una aplicación se construye a partir de módulos que incluyen código, recursos y configuración.
Dentro de estos módulos, el sistema define cuatro tipos de componentes básicos: son los bloques esenciales y los puntos de entrada a tu app.

Los 4 componentes principales son:

  • Actividades (Activities)
  • Servicios (Services)
  • Receptores de emisiones (Broadcast Receivers)
  • Proveedores de contenido (Content Providers)

Cada tipo tiene una función concreta y un ciclo de vida propio.

Actividades

Representan la interfaz de usuario de la aplicación. Cada pantalla de una app suele ser una actividad distinta, y estas se comunican entre sí para dar coherencia al flujo del usuario.

Ejemplo

Una app de correo puede tener:

  • Una actividad con la lista de correos.
  • Otra para redactar un correo.
  • Otra para leer un correo recibido.

Aunque forman parte de la misma app, son actividades independientes.

Características:

  • Controlan lo que el usuario ve y hace en pantalla.
  • Permiten regresar a estados previos gracias al ciclo de vida de la actividad.
  • Pueden ser iniciadas por otras aplicaciones (ej. compartir un archivo).

Servicios

Son procesos que se ejecutan en segundo plano, sin interfaz de usuario. Se usan para tareas largas o que deben continuar aunque el usuario cambie de aplicación.

Ejemplo

  • Un servicio que reproduce música mientras usas WhatsApp.
  • Un servicio que sincroniza datos con un servidor aunque no abras la app.

Características:

  • Los hay visibles (ejecutan algo que el usuario espera, como la música) o invisibles (ejecutan tareas internas).
  • Pueden estar vinculados a otras apps que los usan como API4.
  • Se implementan extendiendo la clase Service.

Receptores de emisiones

Permiten que la aplicación reciba mensajes del sistema o de otras apps. Funcionan como “escuchas” de eventos globales.

Ejemplo

  • Un receptor que detecta cuando la batería está baja.
  • Un receptor que recibe la alarma programada para lanzar una notificación.

Características:

  • No necesitan que la app esté abierta para funcionar.
  • Generalmente hacen trabajos muy breves y delegan la lógica a otros componentes.
  • Se implementan extendiendo BroadcastReceiver.

Proveedores de contenido

Son la forma estándar de compartir datos entre aplicaciones. Ofrecen acceso estructurado a información que puede estar en una base de datos SQLite, en ficheros o incluso en la nube.

Ejemplo

El sistema Android ofrece un proveedor de contenido para Contactos. Gracias a él, apps como WhatsApp o Telegram pueden leer los números de tu agenda (con tu permiso).

Características:

  • Se identifican mediante URIs.
  • Permiten consultas y modificaciones de datos si la app lo autoriza.
  • Se implementan extendiendo ContentProvider.

Activación de componentes

Android no tiene un main() como en otros sistemas operativos. Cada componente se activa mediante intenciones (Intents) o resolvers:

  • Actividades y Servicios: startActivity(), startActivityForResult(), startService().
  • Receptores de emisiones: sendBroadcast(), sendOrderedBroadcast().
  • Proveedores de contenido: a través de un ContentResolver (query(), insert(), delete(), etc.).

Ejemplo

  • Una Intent puede abrir la cámara desde tu app para tomar una foto.
  • Otra Intent puede abrir una web en el navegador del sistema.

Android Manifest

Para que Android pueda reconocer y ejecutar los componentes de una aplicación, debe leer el archivo AndroidManifest.xml, que se encuentra en la raíz del proyecto.

Este archivo es imprescindible porque actúa como el “contrato” entre la app y el sistema: todo lo que la app quiere usar o exponer debe estar declarado aquí.

Funciones principales del manifiesto

  • Declarar componentes de la aplicación (actividades, servicios, receptores, proveedores).
  • Indicar los permisos que la app necesita (Internet, cámara, contactos, etc.).
  • Definir el nivel mínimo de API requerido para instalar la app.
  • Declarar características de hardware o software necesarias (Bluetooth, pantalla táctil, GPS…).
  • Indicar las bibliotecas externas que la app requiere (ej. Google Maps API).

Ejemplo de manifiesto con una actividad

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.project">

    <application
        android:icon="@drawable/app_icon"
        android:label="@string/app_name">

        <activity
            android:name="com.example.project.ExampleActivity"
            android:label="@string/example_label">
        </activity>

    </application>
</manifest>

Explicando el ejemplo

  • <manifest>: raíz del archivo, indica el paquete principal de la app.
  • <application>: define atributos globales como el icono o el nombre visible.
  • <activity>: cada actividad debe declararse con:
    • android:name: clase Java/Kotlin que implementa la actividad.
    • android:label: texto visible para el usuario (ej. el título en pantalla).

Reglas importantes

Todo componente debe declararse en el manifiesto:

  • <activity> → actividades.
  • <service> → servicios en segundo plano.
  • <receiver> → receptores de emisiones.
  • <provider> → proveedores de contenido.

Si un componente no está en el manifiesto → el sistema no podrá ejecutarlo.

Excepción

Los receptores de emisión también pueden registrarse dinámicamente en el código con registerReceiver().

El manifiesto es el “mapa” de tu aplicación: sin él, Android no sabe qué contiene tu app ni qué necesita para funcionar. A lo largo del curso iremos avanzando en el manifiesto de nuestra app, pero si quiere saber más ahora, puedes consultar la documentación Archivo AndroidManifest.xml.

Actividad

  • AC 104 (RA1 / CE1a CE1e / IC1 / 1p) Analiza qué ventajas tiene el modelo de sandboxing de Android frente a otros sistemas operativos.

  1. apk son las siglas de Android Package

  2. Un SDK (Software Development Kit) es un conjunto de herramientas, bibliotecas, código de ejemplo, documentación y procesos que se proporcionan a los desarrolladores para crear aplicaciones para un sistema o plataforma específica. 

  3. Un UID (User ID) es un Identificador Único para cada aplicación que el sistema operativo le asigna para aislarla de otras aplicaciones. 

  4. Las API son mecanismos que permiten a dos componentes de software comunicarse entre sí mediante un conjunto de definiciones y protocolos.