#!/usr/bin/env bash # Prepara lo que el proyecto Android no lleva en git: # - las librerias nativas (libnode.so son 49 MB; no tiene sentido versionarlas) # - assets/nodejs-project.zip con el backend Node y sus dependencias # # Uso: ./scripts/prepare.sh [ruta-a-un-apk-o-directorio-con-lib/arm64-v8a] set -euo pipefail HERE="$(cd "$(dirname "$0")/.." && pwd)" REPO="$(cd "$HERE/.." && pwd)" JNI="$HERE/app/src/main/jniLibs/arm64-v8a" ASSETS="$HERE/app/src/main/assets" SRC="${1:-}" mkdir -p "$JNI" "$ASSETS" # --- 1) librerias nativas ----------------------------------------------------- need_libs=(libnode.so libnative-lib.so libc++_shared.so) missing=0 for l in "${need_libs[@]}"; do [ -f "$JNI/$l" ] || missing=1; done if [ "$missing" = "1" ]; then if [ -z "$SRC" ]; then echo "Faltan las librerias nativas en $JNI" echo "Pasa un APK o un directorio que tenga lib/arm64-v8a/, por ejemplo:" echo " ./scripts/prepare.sh ../../oasis_mobile" exit 1 fi if [ -d "$SRC/lib/arm64-v8a" ]; then cp "$SRC/lib/arm64-v8a"/*.so "$JNI/" elif [ -f "$SRC" ]; then tmp="$(mktemp -d)"; unzip -qo "$SRC" 'lib/arm64-v8a/*' -d "$tmp" cp "$tmp/lib/arm64-v8a"/*.so "$JNI/"; rm -rf "$tmp" else echo "No encuentro librerias en $SRC"; exit 1 fi echo "librerias nativas copiadas:"; ls -la "$JNI" | tail -n +2 | awk '{print " "$NF" ("$5" bytes)"}' fi # --- 2) backend + dependencias --------------------------------------------- # El node_modules del movil esta podado: son ~137 MB frente a los 1,4 GB de una # instalacion de escritorio. En vez de reinstalarlo, se reutiliza el del APK base: # comprobado que las 98 dependencias son identicas entre 0.9.1 y 0.9.5. BASE_ZIP="" if [ -n "$SRC" ] && [ -f "$SRC" ]; then tmpz="$(mktemp -d)"; unzip -qo "$SRC" 'assets/nodejs-project.zip' -d "$tmpz" 2>/dev/null || true [ -f "$tmpz/assets/nodejs-project.zip" ] && BASE_ZIP="$tmpz/assets/nodejs-project.zip" fi work="$(mktemp -d)" if [ -n "$BASE_ZIP" ]; then ( cd "$work" && unzip -q "$BASE_ZIP" ) mv "$work/nodejs-project/src/server/node_modules" "$work/_nm" rm -rf "$work/nodejs-project/src" elif [ -d "$REPO/src/server/node_modules" ]; then mkdir -p "$work/nodejs-project" cp -r "$REPO/src/server/node_modules" "$work/_nm" else echo "No hay node_modules. Pasa un APK base del que sacarlo, o instalalas:" echo " (cd $REPO/src/server && npm install --omit=dev)" exit 1 fi mkdir -p "$work/nodejs-project" cp -r "$REPO/src" "$work/nodejs-project/" # backend.js lee README.md con readFileSync SIN try/catch (linea ~1690): # si falta, el backend muere con ENOENT al arrancar. cp "$REPO/main.js" "$REPO/package.json" "$REPO/README.md" "$work/nodejs-project/" 2>/dev/null || true test -f "$work/nodejs-project/README.md" || { echo "FALTA README.md: el backend no arrancaria"; exit 1; } rm -rf "$work/nodejs-project/src/server/node_modules" mv "$work/_nm" "$work/nodejs-project/src/server/node_modules" # --- 3) empaquetar ------------------------------------------------------------ # Con compresion: sin ella el backend son ~145 MB y la APK se iria por encima de 200. rm -f "$ASSETS/nodejs-project.zip" ( cd "$work" && zip -q -r "$ASSETS/nodejs-project.zip" nodejs-project ) rm -rf "$work" "${tmpz:-/nonexistent}" echo "backend empaquetado: $(du -h "$ASSETS/nodejs-project.zip" | cut -f1) en assets/nodejs-project.zip" echo echo "Listo. Ahora: ./gradlew assembleDebug (o assembleRelease para firmar)"