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¶
namespacegenérico:com.example.islaboxes el default de Android Studio. Debería cambiarse a algo más específico (ej.cu.islabox.app) antes de publicar.isShrinkResourcescomentado: correcto por ahora, porqueisMinifyEnabled = trueya activado puede romper recursos. Cuando se activen ambos, hay que probar.- 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.
- Sin
vectorDrawables.useSupportLibrary = true: OK porqueminSdk = 24ya 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"enMainActivity✅ (requerido para LAUNCHER en API 31+)android:supportsRtl="true"✅android:allowBackup="true"⚠️ — debería serfalsesi guardaremos KYC localmenteandroid:dataExtractionRulesyandroid:fullBackupContentvací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 |