android: fijar HOME y reutilizar el node_modules podado del APK base
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.
This commit is contained in:
parent
32f6d2269c
commit
7459644a73
2 changed files with 44 additions and 15 deletions
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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)"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue