Saltar a contenido

Documento del prototipo

Para reglas y prácticas de versión (cómo subir libs, cuándo cambiar compileSdk) ver stack/tecnologias.md.


Stack y configuración

Detalle de las versiones, plugins, gradle, manifest y recursos de la APK IslaBox.


Versiones (Gradle / Kotlin / Android)

Componente Versión Notas
Android Gradle Plugin 9.1.1 Reciente (Q1 2026). Verificado con context7
Kotlin 2.2.10 Reciente. Compatible con Compose Compiler moderno
Gradle wrapper 9.3.1 Distribución oficial, SHA256 verificado
compileSdk 37 Última disponible
minSdk 24 Android 7.0 Nougat (cubre ~99% del mercado)
targetSdk 35 Android 15 — edge-to-edge obligatorio
Java 11 Compilación. Recomendado migrar a 17

Catálogo de versiones (gradle/libs.versions.toml)

[versions]
agp = "9.1.1"             # Android Gradle Plugin
coreKtx = "1.18.0"        # AndroidX Core KTX
junit = "4.13.2"          # JUnit 4 (testing)
junitVersion = "1.3.0"    # AndroidX Test ext-junit
espressoCore = "3.7.0"    # Espresso (UI testing)
lifecycleRuntimeKtx = "2.10.0"
activityCompose = "1.13.0"
kotlin = "2.2.10"
composeBom = "2026.02.01"
navigationCompose = "2.8.7"
serialization = "1.7.3"
coil = "2.6.0"

Librerías declaradas

androidx-core-ktx            = "androidx.core:core-ktx"
navigation-compose            = "androidx.navigation:navigation-compose"
kotlinx-serialization-json    = "org.jetbrains.kotlinx:kotlinx-serialization-json"
androidx-lifecycle-runtime-ktx = "androidx.lifecycle:lifecycle-runtime-ktx"
androidx-activity-compose     = "androidx.activity:activity-compose"
androidx-compose-bom          = "androidx.compose:compose-bom"   # BOM
androidx-compose-ui           = "androidx.compose.ui:ui"
androidx-compose-ui-graphics  = "androidx.compose.ui:ui-graphics"
androidx-compose-ui-tooling   = "androidx.compose.ui:ui-tooling"
androidx-compose-ui-tooling-preview
androidx-compose-ui-test-manifest
androidx-compose-ui-test-junit4
androidx-compose-material3    = "androidx.compose.material3:material3"
androidx-compose-material-icons-extended
coil-compose                  = "io.coil-kt:coil-compose:2.6.0"

Plugins

android-application = "com.android.application"
kotlin-compose      = "org.jetbrains.kotlin.plugin.compose"
kotlin-serialization = "org.jetbrains.kotlin.plugin.serialization"

Verificación de versiones con context7

Librería Versión en app Estado Recomendación
Compose BOM 2026.02.01 ✅ Reciente Mantener
Material 3 (via BOM) ✅ Última Mantener
Material Icons Extended (via BOM) ✅ Última Mantener
Navigation Compose 2.8.7 ✅ Reciente Mantener
kotlinx-serialization 1.7.3 ✅ Reciente Mantener
Coil 2.6.0 ⚠️ Estable pero no la última (3.x) No migrar (3.x es multiplataforma, innecesario aquí)
Activity Compose 1.13.0 ✅ Reciente Mantener
Lifecycle Runtime KTX 2.10.0 ✅ Reciente Mantener
Core KTX 1.18.0 ✅ Reciente Mantener
JUnit 4.13.2 ✅ Estándar Considerar migrar a JUnit 5 cuando se sumen tests reales
Espresso 3.7.0 ✅ Reciente Mantener

No hay nada desactualizado crítico. La única mejora barata es subir compileOptions a Java 17.


Configuración de la app (app/build.gradle.kts)

android {
    namespace = "com.example.islabox"   // ⚠️ genérico, debería ser cu.islabox
    compileSdk = 37
    defaultConfig {
        applicationId = "com.example.islabox"  // ⚠️ idem
        minSdk = 24
        targetSdk = 35
        versionCode = 1
        versionName = "1.0"
        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            isMinifyEnabled = true
            // isShrinkResources = true  // Descomentar después
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
        }
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_11
        targetCompatibility = JavaVersion.VERSION_11   // ⚠️ considerar 17
    }
    buildFeatures {
        compose = true
    }
}

Observaciones

  1. namespace genérico: com.example.islabox es el default de Android Studio. Debería cambiarse a algo más específico (ej. cu.islabox.app) antes de publicar.
  2. isShrinkResources comentado: correcto por ahora, porque isMinifyEnabled = true ya activado puede romper recursos. Cuando se activen ambos, hay que probar.
  3. Java 11: Compose Compiler reciente y AGP 9.x funcionan mejor con Java 17. No bloquea, pero es una mejora de un par de líneas.
  4. Sin vectorDrawables.useSupportLibrary = true: OK porque minSdk = 24 ya soporta vectoriales nativamente.

Reglas de ProGuard (proguard-rules.pro)

Estado actual: VACÍO.

Esto significa que en builds release, la app fallará porque: - kotlinx-serialization necesita mantener los Companion y $serializer de las clases @Serializable. - kotlinx-serialization no entiende las clases de dominio (User, Reporte, etc.) sin reglas. - Compose Material 3 internamente necesita ciertas reglas (ya incluidas en las default de AGP).

Reglas mínimas recomendadas

# kotlinx-serialization
-keepattributes *Annotation*, InnerClasses
-dontnote kotlinx.serialization.AnnotationsKt
-keepclassmembers class **$Companion {
    kotlinx.serialization.KSerializer serializer(...);
}
-if @kotlinx.serialization.Serializable class **
-keepclassmembers class <1> {
    static <1>$Companion Companion;
}
-if @kotlinx.serialization.Serializable class ** {
    static **$* *;
}
-keepclassmembers class <2>$<3> {
    kotlinx.serialization.KSerializer serializer(...);
}

Gradle wrapper

gradle/wrapper/gradle-wrapper.properties:

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionSha256Sum=b266d5ff6b90eada6dc3b20cb090e3731302e553a27c5d3e4df1f0d76beaff06
distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip
networkTimeout=10000
validateDistributionUrl=true

Sin observaciones. Versión actual y firma válida.


gradle.properties

org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
kotlin.code.style=official

Sin observaciones. Memoria suficiente (2GB), encoding UTF-8.


settings.gradle.kts

pluginManagement {
    repositories {
        google { content { includeGroupByRegex("com\\.android.*"); includeGroupByRegex("com\\.google.*"); includeGroupByRegex("androidx.*") } }
        mavenCentral()
        gradlePluginPortal()
    }
}
plugins {
    id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0"
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories { google(); mavenCentral() }
}
rootProject.name = "IslaBox"
include(":app")

Sin observaciones. Configuración estándar con foojay-resolver para auto-descarga de JDK.


AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" />

<application
    android:allowBackup="true"
    android:dataExtractionRules="@xml/data_extraction_rules"
    android:fullBackupContent="@xml/backup_rules"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/Theme.IslaBox">
    <activity
        android:name=".MainActivity"
        android:exported="true"
        android:label="@string/app_name"
        android:theme="@style/Theme.IslaBox">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

Permisos declarados

Permiso Justificación Estado
INTERNET Para FastAPI (cuando se conecte) ✅ declarado pero no usado
CAMERA Capturas de órdenes, fotos de KYC, fotos de paquetes falta declarar
READ_MEDIA_IMAGES (API 33+) Seleccionar imágenes de galería falta declarar
READ_EXTERNAL_STORAGE (API <33) Idem para versiones viejas falta declarar
POST_NOTIFICATIONS (API 33+) Notificaciones push falta declarar
INTERNET ya está

Otras configuraciones

  • android:exported="true" en MainActivity ✅ (requerido para LAUNCHER en API 31+)
  • android:supportsRtl="true"
  • android:allowBackup="true" ⚠️ — debería ser false si guardaremos KYC localmente
  • android:dataExtractionRules y android:fullBackupContent vacíos → Google Play puede rechazar la app

Tema XML (res/values/themes.xml)

<style name="Theme.IslaBox" parent="android:Theme.Material.Light.NoActionBar" />

Observaciones: - Usa Material 1 (viejo). Compose pinta todo encima, así que no rompe, pero es mejor usar Theme.Material3.DayNight.NoActionBar o un theme custom. - No define colores del status bar / navigation bar (los maneja Compose con enableEdgeToEdge()).


Recursos de strings

res/values/strings.xml:

<resources>
    <string name="app_name">IslaBox</string>
</resources>

Observación: todos los strings están hardcodeados en cada pantalla (ej. "Iniciar Sesión", "Entrar", "¿Olvidaste tu contraseña?"). Para una app multi-idioma (la doc menciona Cuba, no especifica si la app es bilingüe), habría que moverlos a strings.xml. Por ahora es aceptable si se asume español únicamente.


Recursos de colores

res/values/colors.xml contiene los colores legacy de Material 1 (purple_200/500/700, teal_200/700, black, white). No se usan — Compose tiene su propia paleta en Color.kt.

Limpieza futura: eliminar colors.xml para evitar confusión.


Recursos de backup

res/xml/backup_rules.xml y res/xml/data_extraction_rules.xml están vacíos con comentarios de ejemplo. Para una app con KYC, deberían excluir explícitamente cualquier archivo sensible.


Resumen de la configuración

Aspecto Estado Acción
Versiones de librerías ✅ Al día Mantener
Plugins Kotlin/Compose/Serialization ✅ Al día Mantener
Java 11 ⚠️ Migrar a Java 17
ProGuard Agregar reglas de kotlinx-serialization
Permisos de cámara Declarar CAMERA, READ_MEDIA_IMAGES
Permisos de notificaciones Declarar POST_NOTIFICATIONS
Tema XML ⚠️ Migrar a Material 3
Strings ⚠️ Mover a strings.xml (si se quiere i18n)
Backup rules ⚠️ Configurar exclusiones de KYC
namespace genérico ⚠️ Cambiar a cu.islabox.app antes de publicar