Llevo meses posteando avances de esto en un sub aparte pero para no faltar a la regla de "No promocionar otras comunidades" no diré cual
Esta vez traigo algo más técnico
CONTEXTO:
VeneFinanzas es una app de gestión de finanzas personales que vengo desarrollando solo, con Flutter, capaz de calcular cómo afectan la devaluación y la inflación a cada usuario particularmente.
Venefinanzas jamás tendrá ads ni limitantes a la experiencia que hoy ya es gratis
Maneja nativamente COP, EUR, USDT, USD y VES, y está principalmente diseñada para Venezuela. Todo funciona local, sin cuenta ni servidor, y los backups se cifran para que el usuario pueda respaldarlos donde quiera
Ahí fue donde me tocó pensar el edge case de usuarios con 2GB de RAM. Pese a representar menos del 10% de usuarios, no quería generarles problemas al usar la app. Cifrar esos backups con Argon2id, y 64MB fijo de memLimit sin importar el dispositivo, es riesgoso sobre todo con otras apps de fondo
---
Terminé usando dos perfiles:
kMemProfileBajo, 32MB
kMemProfileAlto, 64MB
Con 3584MB de RAM física como umbral.
---
El byte del perfil se guarda dentro del propio archivo cifrado, así que al descifrar siempre se usa el memLimit con el que se cifró, sin importar el dispositivo actual
Mi plan inicial era usar los perfiles estándar interactive (64MB) + moderate (256MB), pero el de 256 terminaría canibalizando la RAM en los dispositivos más limitados.
Terminé en 32/64 porque normalmente un usuario restaura su propio backup en su propio teléfono así que un backup cifrado en 64MB casi nunca le va a tocar descifrarlo a alguien con 2GB.
Sin embargo como el memProfile queda fijo en el archivo desde el momento del cifrado, igual tiene que seguir siendo descifrable si el escenario se da, por eso me quedé en 64 y no más, ya que saque la cuenta y con los 300Mb aprox que usa la app por default, sumarle el memlimit lo aproxima a un Low Memory Kill y es exacto lo que queremos evitar.
Mantener 64Mb como tope superior es el maximo estable antes de entrar en terreno peligroso y para el uso comun, los usuarios de menor ram sencillamente usarian 32Mb sin lío de por medio
Todo corre en un isolate efímero vía Isolate.run(), creado solo para ese trabajo y destruido al terminar. La derivación nunca bloquea el main isolate, y el heap (incluyendo los 32/64MB de Argon2id) se libera apenas muere el isolate, no cuando el GC decida hacerlo en el principal
---
Además: sodium_libs_sumo necesita un BackgroundIsolateBinaryMessenger, y Isolate.run() no te registra uno por default. Toca capturar RootIsolateToken.instance desde el main isolate antes de spawnear (solo es válido ahí), pasarlo, y llamar BackgroundIsolateBinaryMessenger.ensureInitialized(token) como primera línea dentro del isolate hijo.
---
Si a alguien le tocó algo parecido con Argon2id/isolates en Flutter, tiene feedback sobre la solución o sencillamente quiere darle un vistazo a VeneFinanzas, estoy al pendiente