Los casos de este listado son los que más se repiten. Empieza por leer el mensaje completo: la mayoría dice exactamente qué falta.
Antes de lanzar nada, el estudio llama a POST /api/build-readiness y, si canBuild es false, muestra los warnings en rojo y no compila. Los avisos más habituales:
Audio nativo activo pero sin URL del stream: pon tu servidor en Audio nativo— la plantilla de radio o streaming traenativeAudioactivado y el campo del stream vacío. Rellénalo en el paso de Ajustes, tarjeta de audio nativo.streamUrl debe empezar con http:// o https://— te falta el esquema en la URL del stream.Falta URL o HTML— no hay fuente en el paso 1.X requiere Android N+— un permiso pide untargetSdkmás alto. Sube el SDK o quita el permiso.
Si el chequeo de readiness no responde, el estudio intenta compilar igual y te muestra el error real del servidor.
En el paso de QA también hay una lista de puntos que se pone en rojo. Con uno fallado, o sin aceptar los términos, el botón de avance queda deshabilitado: es intencional, pero el mensaje de arriba te dice qué corregir.
503 "GitHub no configurado..."— faltanGITHUB_TOKENoINTEE_BUILDS_REPO. Mira/api/diag.429conLimite de builds alcanzado (10 por hora)— el contador es por IP y lo comparten/api/build,/api/v1/buildy/api/decompile/cloud. Espera a que venza la hora.400con mensaje de validación — el texto lo explica: nombre de app, package ID, versión, URL bloqueada, HTML de más de 500.000 caracteres o icono de más de 7 MB.401en/api/v1/build— ya existe al menos una API key y no estás enviando ninguna. Crea una conPOST /api/keys.
Abre el enlace del run desde el resultado del build o desde /api/build/:id. Errores frecuentes:
422 No workflow found with any ref— el workflow todavía no está registrado en la rama base. El servidor reintenta solo, hasta seis veces con espera creciente; si sigue fallando, espera unos segundos y vuelve a lanzar.- Fallo de Gradle — casi siempre SDK o dependencia. Prueba
compileSdkytargetSdk35, que son los valores con los que está probado el generador. Los pasos del run se llamanCompile APK,Compile Release APK,Compile AAByCompile Release AAB. package org.mozilla.geckoview does not exist— el pasoApply GeckoView dependenciesno corrió o su patch falló: en el log debe salirgeckoviewtrasgrep -c geckoview android/app/build.gradle. Si el ZIP es de una versión anterior del generador, regenera el proyecto; si sigue sin estar, cambia acapacitoronative.- El workflow termina sin artefacto — la salida pedida (
apk,aaboboth) no coincide con lo que se compiló, o Gradle no llegó a empaquetar. Mira los pasosCompile APKyCompile AABdel run.
- Comprueba que la build llegó a
success. /api/download/:idnecesita que la build siga en memoria del servidor: si el proceso se reinició, responde404aunque el artefacto exista en GitHub.- Las ramas se borran alrededor de un minuto tras completar, y el barrido automático de cada 30 minutos elimina runs y artefactos con más de 30 minutos. Si caducó, vuelve a compilar.
404 "AAB no encontrado"significa que pediste APK;IPA no encontrado (firma iOS requerida)significa que no hubo certificados de Apple.
- Si desactivaste la opción de tráfico HTTP (cleartext), el manifiesto sale con
android:usesCleartextTraffic="false"y una URLhttp://no carga: verás blanco. Actívala de nuevo o usa HTTPS. Por defecto el manifiesto sí permite cleartext. - Comprueba que tu sitio permita ser embebido: cabeceras
X-Frame-OptionsoContent-Security-Policy: frame-ancestorsen tu servidor bloquean el WebView y ves una pantalla vacía. - Revisa la consola de tu sitio con la app abierta: los errores de JavaScript son los mismos que en el navegador.
- Con provider
flutterel APK viene del jobflutter-build(mira sus pasosBuild APK/Build App Bundle), no deCompile APK. Con providercordovaviene del jobcordova-build(pasosCompile Cordova APK). Con providertauriel APK sigue siendo el de Capacitor y además hay un.exedel jobtauri-build. El providergeckosí compila un APK distinto: laMainActivityes GeckoView.
- Descarga el proyecto con
POST /api/projecty comprueba quemain-manifest.xmlincluye el permiso. - Concede el permiso manualmente desde Ajustes de Android la primera vez.
- Si tu web pide cámara y no marcaste
cameraMic, elWebChromeClientgenerado no incluye ese recurso en la lista permitida y respondedeny(). Marca el permiso y vuelve a compilar. - Los permisos con
minSdkalto dan unwarnen el Audit si tutargetSdkes inferior; sube el SDK.
gpsBackground sin gps— activa también la ubicación precisa.SPEC ONLY, NOT GENERATEDen una fila — el permiso está en el spec pero no llegó al manifiesto generado; suele ser un caso que necesita otro permiso base.NO GENERADO— no hay implementación para ese elemento (es lo que pasa conads). El Audit lo trata como fallo y bloquea la build.- Fila con
REQUIRES ANDROID N+— subetargetSdko quita el permiso. - Si el botón de avance está deshabilitado, hay un
failen el Audit: corrígelo en lugar de forzarlo.
- Sin HTTPS: el analizador resta 10 puntos y el módulo de seguridad descuenta 25 sobre su propia puntuación. Lo primero que hay que arreglar.
- Sin
viewport: resta 10 (con él suma 20); añade<meta name="viewport" content="width=device-width, initial-scale=1">. - Sin service worker ni manifest: no llegan los 15 y 10 puntos que sumarían, y
checks.pwaqueda enfalse. - Recursos con
http://: resta 2 por recurso, con un tope de 20. El módulo de seguridad los cuenta aparte. - Si el score es bajo, aplica el Auto-Fix y revisa el diff: el arreglo es heurístico y puede dejar
alt=""vacío o forzarhttps://en un recurso que no exista.
ERR_BLOCKED_BY_CLIENTcontra un dominio de anuncios — era un adblocker. Los anuncios ya se sirven desde tu propio dominio con/api/ads/:slot; si aún aparece, recarga con caché dura o despliega de nuevo.cdn.tailwindcss.com should not be used in production— aviso de Tailwind, no rompe nada.No label associated with a form field— aviso de accesibilidad, no bloquea nada.Uncaught SyntaxErroral cargar el editor — recarga con caché dura.
- Nombre: letras, números, espacios, guiones y puntos, de 2 a 40 caracteres.
- Package ID: minúsculas, números y guion bajo, con al menos un punto (
com.miempresa.miapp). - Versión: números con puntos (
1.0.0). - SDK: si el valor no está en la lista de válidos, el servidor lo sustituye por uno válido en lugar de rechazarlo.
- HTML vacío con origen HTML: se rechaza; pega tu código o usa la cara de una plantilla.
413o "APK demasiado grande" en la nube: 60 MB es el tope; el local llega a 100 MB.Rate limit: 10/h por IP: es el mismo contador que los builds.409 Workflow todavía corriendo: espera y reintenta la descarga.404 El workflow terminó sin artefacto: mira los logs del run; los APK ofuscados suelen fallar aquí.500 Configura GITHUB_TOKEN...: falta la misma configuración que para compilar.
/api/diag recorre token, repo, rama y workflow y se detiene en el primero que falla, con un hint que dice qué cambiar. Si devuelve ok: true y el build sigue fallando, el problema está en el run de GitHub: abre sus logs. El detalle de cada campo está en production.md.
Si el problema es de permisos, la referencia está en permissions.md; si es de audio en segundo plano, en foreground.md.