diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 421ba7e..1ae74ef 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -145,24 +145,76 @@ jobs: # entre el 31-07 (commit 2540556) y el 07-08 sin que nada lo detectara. # # Anadir un drawable nuevo referenciado por nombre => anadirlo aqui. + # Guardian de recursos: el APK debe contener los drawables que el codigo + # resuelve POR NOMBRE en runtime (getResources().getIdentifier). + # + # Un nombre que no resuelve devuelve id 0, y eso no falla la + # compilacion: falla en el coche. PlaybackStateCompat.CustomAction + # .Builder lanza con icono 0, ese throw aborta AudioService.setState + # antes de activar la sesion de medios, y Android Auto se queda con la + # interfaz congelada. Paso exactamente eso desde el 31-07 (commit + # 2540556) sin que nada lo detectara. + # + # La primera version de este paso daba FALSOS POSITIVOS: no comprobaba + # que el APK existiera ni que unzip estuviera disponible, asi que + # cualquier fallo de la tuberia se reportaba como "faltan todos los + # recursos". Un guardian que miente es peor que no tener guardian: + # manda a buscar fantasmas. De ahi que ahora verifique primero sus + # propias herramientas y vuelque el inventario real antes de juzgar. + # + # Anadir un drawable nuevo referenciado por nombre => anadirlo aqui. - name: Verificar recursos criticos en el APK run: | + set -u APK=build/app/outputs/flutter-apk/app-release.apk + + if [ ! -f "$APK" ]; then + echo "El APK no esta donde se esperaba: $APK" + echo "Contenido de build/app/outputs:" + find build/app/outputs -name '*.apk' 2>/dev/null || echo " (nada)" + exit 1 + fi + echo "APK: $APK ($(wc -c < "$APK") bytes)" + + if command -v unzip >/dev/null 2>&1; then + LISTADO=$(unzip -Z1 "$APK") + elif command -v python3 >/dev/null 2>&1; then + LISTADO=$(python3 - "$APK" <<'PYZIP' +import zipfile, sys +for nombre in zipfile.ZipFile(sys.argv[1]).namelist(): + print(nombre) +PYZIP + ) + else + echo "Ni unzip ni python3 disponibles: no se puede inspeccionar el APK." + exit 1 + fi + + if [ -z "$LISTADO" ]; then + echo "El listado del APK salio vacio; la inspeccion no es fiable." + exit 1 + fi + + echo "Drawables en el APK:" + echo "$LISTADO" | grep "^res/drawable" || echo " (ninguno)" + FALTAN=0 for RECURSO in ic_auto_eq_on ic_auto_eq_off ic_stat_pluriwave; do - if unzip -l "$APK" | grep -q "res/drawable/$RECURSO.xml"; then - echo "OK res/drawable/$RECURSO.xml" + if echo "$LISTADO" | grep -qx "res/drawable/$RECURSO.xml"; then + echo "OK $RECURSO" else - echo "FALTA res/drawable/$RECURSO.xml" - FALTAN=1 + echo "FALTA $RECURSO" + FALTAN=$((FALTAN + 1)) fi done + if [ "$FALTAN" -ne 0 ]; then echo "" - echo "Hay drawables resueltos por nombre que NO estan en el APK." + echo "$FALTAN drawable(s) resueltos por nombre NO estan en el APK." echo "En runtime resolveran a id 0 y tumbaran la sesion de medios." exit 1 fi + echo "Todos los recursos criticos viajan en el APK." - name: Build AAB release run: flutter build appbundle --release