From 7459644a73c53969de3bbad3639c45b9a92ff14f Mon Sep 17 00:00:00 2001 From: SITO Date: Tue, 18 Aug 2026 23:35:19 +0200 Subject: [PATCH] android: fijar HOME y reutilizar el node_modules podado del APK base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit main.js resuelve el directorio de datos con process.env.HOME || resolve(__dirname, '..','..'). En Android HOME suele llegar como "/", que no es escribible, asi que el servicio lo fija explicitamente con Os.setenv al almacenamiento privado de la app: ahi cuelga ~/.ssb. Tambien fija TMPDIR. prepare.sh deja de pedir un npm install: saca el node_modules del APK base, que viene podado —137 MB frente a los 1,4 GB de una instalacion de escritorio— y sustituye solo el codigo. Es seguro porque las 98 dependencias son identicas entre 0.9.1 y 0.9.5: ninguna nueva, ninguna quitada, ninguna con version distinta. El zip se comprime; sin comprimir el backend son 145 MB y la APK se iria por encima de 200. APK generada y verificada: 78 MB, net.laenre.oasis, versionName 0.9.5, targetSdk 35, con libnode.so y el backend de 32 MB dentro. --- .../main/java/net/laenre/oasis/NodeService.kt | 12 ++++- android/scripts/prepare.sh | 47 +++++++++++++------ 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/android/app/src/main/java/net/laenre/oasis/NodeService.kt b/android/app/src/main/java/net/laenre/oasis/NodeService.kt index bf803fe..3f9cc3d 100644 --- a/android/app/src/main/java/net/laenre/oasis/NodeService.kt +++ b/android/app/src/main/java/net/laenre/oasis/NodeService.kt @@ -8,6 +8,7 @@ import android.content.Context import android.content.Intent import android.os.Build import android.os.IBinder +import android.system.Os import android.util.Log import com.solarnethub.oasis.OasisActivity import com.solarnethub.oasis.R @@ -63,7 +64,16 @@ class NodeService : Service() { extractProjectIfNeeded(root) val main = File(root, "main.js") if (!main.exists()) { Log.e(TAG, "no encuentro main.js en ${root.absolutePath}"); return } - // HOME cuelga del almacenamiento privado de la app: ahi vive ~/.ssb + + // main.js hace process.env.HOME || resolve(__dirname,'..','..'). En Android HOME + // suele venir como "/" —no escribible—, asi que se fija explicitamente al + // almacenamiento privado de la app: ahi cuelga ~/.ssb. + val home = filesDir.parentFile ?: filesDir + val tmp = File(home, "tmp").apply { mkdirs() } + Os.setenv("HOME", home.absolutePath, true) + Os.setenv("TMPDIR", tmp.absolutePath, true) + Log.i(TAG, "HOME=${home.absolutePath}") + val rc = OasisActivity.startNodeWithArguments(arrayOf("node", main.absolutePath)) Log.w(TAG, "el runtime de node ha terminado con codigo $rc") } catch (e: Throwable) { diff --git a/android/scripts/prepare.sh b/android/scripts/prepare.sh index 7334053..d82370c 100755 --- a/android/scripts/prepare.sh +++ b/android/scripts/prepare.sh @@ -37,22 +37,41 @@ if [ "$missing" = "1" ]; then echo "librerias nativas copiadas:"; ls -la "$JNI" | tail -n +2 | awk '{print " "$NF" ("$5" bytes)"}' fi -# --- 2) dependencias del backend --------------------------------------------- -if [ ! -d "$REPO/src/server/node_modules" ]; then - echo "Faltan las dependencias del backend. Instalalas antes:" - echo " (cd $REPO/src/server && npm install)" +# --- 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 -# --- 3) empaquetar el backend ------------------------------------------------- -# Sin comprimir (-0): el zip se descomprime en el arranque y asi va mas rapido. -tmp="$(mktemp -d)" -mkdir -p "$tmp/nodejs-project" -cp "$REPO/main.js" "$tmp/nodejs-project/" 2>/dev/null || true -cp "$REPO/package.json" "$tmp/nodejs-project/" 2>/dev/null || true -cp -r "$REPO/src" "$tmp/nodejs-project/" -( cd "$tmp" && zip -0 -q -r "$ASSETS/nodejs-project.zip" nodejs-project ) -rm -rf "$tmp" +mkdir -p "$work/nodejs-project" +cp -r "$REPO/src" "$work/nodejs-project/" +cp "$REPO/main.js" "$REPO/package.json" "$work/nodejs-project/" 2>/dev/null || true +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 assembleRelease" +echo "Listo. Ahora: ./gradlew assembleDebug (o assembleRelease para firmar)"