Files
pluriwave/ARQ-REVISION-F1.md
agent-arq 64f6e37373
Some checks failed
Flutter CI/CD — PluriWave / Test + Build (push) Has been cancelled
feat(ci): Gitea Actions CI/CD Flutter + revisión arquitectura F1 (#2)
2026-04-04 16:44:04 +02:00

144 lines
5.2 KiB
Markdown

# Revisión Arquitectura — PluriWave Fase 1
**Arq | 2026-04-04**
---
## Decisión: stack APROBADO con ajustes menores
El stack propuesto es sólido para una app de radio Flutter. Sin conflictos bloqueantes de dependencias. Sin problemas de licencia.
---
## Stack analizado
| Paquete | Versión declarada | Latest | Licencia |
|---------|------------------|--------|----------|
| `just_audio` | `^0.9.42` | 0.10.5 | Apache-2.0 + MIT ✅ |
| `audio_service` | `^0.18.15` | 0.18.18 | MIT ✅ |
| `audio_session` | `^0.1.21` | 0.2.3 | N/A (OSI) ✅ |
| `sqflite` | `^2.4.1` | 2.4.2 | BSD-2 ✅ |
| `flutter_animate` | `^4.5.2` | 4.5.2 | BSD-3 ✅ |
| `google_mobile_ads` | comentado | 7.0.0 | Apache-2.0 ✅ |
---
## Análisis de compatibilidad de versiones
### Dependencia crítica: `audio_session`
Tres paquetes compiten por `audio_session`:
- `just_audio 0.9.42` requiere: `^0.1.14` → ≥0.1.14 <0.2.0
- `audio_service 0.18.15` requiere: `^0.1.20` → ≥0.1.20 <0.2.0
- `pubspec.yaml` declara: `^0.1.21` → ≥0.1.21 <0.2.0
**Intersección**: ≥0.1.21 <0.2.0 → disponibles hasta 0.1.25 → **SIN CONFLICTO ✅**
### `rxdart`
Ambos paquetes requieren `>=0.26.0 <0.29.0`. rxdart latest es 0.28.0. **SIN CONFLICTO ✅**
### `js` (dep transitiva de `audio_service`)
`audio_service` requiere `js >=0.6.3 <0.8.0`. Esto es solo para la plataforma web. Si no hay web target, es irrelevante. Si en el futuro se añade web: aceptable, `js 0.7.2` es la latest en ese rango.
---
## Ajustes recomendados
### 🟠 1. Actualizar `just_audio` a `^0.10.0` (importante)
`just_audio 0.9.x` está en mantenimiento. La rama `0.10.x` (latest: 0.10.5) tiene:
- Soporte Flutter ≥3.27.0 (el runner macmini-flutter probablemente lo cumple)
- API compatible para streaming de radio (URLs HTTP/HTTPS directas)
- `audio_session` requiere `>=0.1.24 <0.3.0` con 0.10.x — compatible con la gama completa
**Acción**: cambiar `just_audio: ^0.9.42``just_audio: ^0.10.0` en pubspec.yaml.
Si el runner tiene Flutter <3.27.0, mantener 0.9.42.
### 🟡 2. Actualizar `audio_service` a `^0.18.18` (menor)
La 0.18.18 actualiza `audio_session` a `>=0.1.25 <0.3.0`, lo que permite usar versiones 0.2.x en el futuro sin romper nada.
### 🟡 3. `google_mobile_ads` — descomentarlo con cuidado
Actualmente comentado (correcto para Fase 1). Cuando se active:
- Usar `^5.3.0` (ya declarado) si el runner tiene Flutter ≥3.7.0 — ✅
- **Evitar `^7.0.0`** por ahora: requiere actualización de `compileSdk` en Android y puede romper el CI
- Necesitará `ad_unit_id` real en secrets de CI antes de activar en release builds
- Play Store requiere declarar uso de datos de anuncios en el Data Safety form
### 🔴 4. Signing config para release builds — BLOQUEANTE para CI
`android/app/build.gradle.kts` tiene:
```kotlin
signingConfig = signingConfigs.getByName("debug") // TODO: fix
```
Esto firma el APK/AAB release con la clave debug. **No es aceptable para Play Store**, pero sí funciona para artifacts internos de CI (distribución interna, testing).
Para CI de Fase 1: aceptable como está.
Para producción: añadir keystore como secret en Gitea CI y configurar signing real.
---
## Estructura de app — observación
`lib/main.dart` es el scaffold por defecto de Flutter (contador demo). Los devs deberán reemplazarlo con la arquitectura real de PluriWave antes de que los tests sean útiles.
Sugerencia de estructura para Fase 1:
```
lib/
├── main.dart
├── app.dart # MaterialApp + Provider setup
├── core/
│ ├── servicios/
│ │ ├── servicio_audio.dart # just_audio + audio_service wrapper
│ │ └── servicio_radio.dart # fetch streams/stations API
│ └── db/
│ └── db_helper.dart # sqflite setup
├── modelos/
│ ├── emisora.dart
│ └── favorito.dart
└── ui/
├── pantalla_inicio.dart
├── pantalla_reproductor.dart
└── widgets/
```
`Provider` (ya en pubspec) es correcto para este scope. No hace falta Riverpod ni Bloc para Fase 1.
---
## Licencias — veredicto
| Paquete | Licencia | Uso comercial | Distribución |
|---------|----------|--------------|-------------|
| `just_audio` | Apache-2.0 + MIT | ✅ libre | ✅ libre |
| `audio_service` | MIT | ✅ libre | ✅ libre |
| `sqflite` | BSD-2 | ✅ libre | ✅ libre |
| `flutter_animate` | BSD-3 | ✅ libre | ✅ libre |
| `google_mobile_ads` | Apache-2.0 | ✅ (con cuenta AdMob) | ✅ libre |
Sin restricciones de licencia para app comercial en Play Store. ✅
---
## Resumen ejecutivo
| Ítem | Estado |
|------|--------|
| Conflictos de dependencias | ✅ Ninguno |
| Licencias incompatibles | ✅ Ninguna |
| Stack adecuado para radio en streaming | ✅ Sí |
| Signing release para Play Store | ⚠️ Pendiente (keystore) |
| just_audio versión óptima | 🟠 Actualizar a ^0.10.0 si Flutter ≥3.27 |
| google_mobile_ads | 🟡 Descomentarlo solo cuando haya Ad Unit IDs reales |
| Estructura de código | 🟡 Scaffold vacío — devs deben estructurar lib/ |
**El stack puede profundizarse sin riesgo. Sin bloqueos.**
---
*Arq — revisión sin acceso al analisis.md de Obsidian (fichero no sincronizado localmente). Revisión realizada directamente desde pub.dev API + pubspec.yaml del repo.*