android: wrapper propio, con los permisos que faltaban para las videollamadas
Hasta ahora la APK salia re-firmando la de epsylon, y su classes.dex no implementa WebChromeClient.onPermissionRequest. Sin ese metodo el WebView deniega por defecto todo getUserMedia, asi que las videollamadas de Karvan no podian funcionar por mucho que se parchease el manifest: la lista de permisos es estatica y se fija al compilar. El wrapper cierra las dos puertas. Declara CAMERA, RECORD_AUDIO y MODIFY_AUDIO_SETTINGS, pero no se conceden al instalar: son permisos peligrosos y se piden en tiempo de ejecucion la primera vez que se pulsa Llamar. Si nadie llama, no se pide nada. uses-feature required=false evita excluir dispositivos sin camara. Reutiliza las tres librerias nativas tal cual: libnode.so es nodejs-mobile v18.20.4 oficial y libnative-lib.so son 6,8 KB con un unico simbolo JNI. De ahi que el namespace sea com.solarnethub.oasis —JNI resuelve por nombre— mientras el applicationId es net.laenre.oasis, que permite instalarla junto a la oficial. No hace falta NDK ni compilar Node. De paso corrige cosas del APK actual: targetSdk 35, trafico en claro permitido solo hacia loopback en vez de usesCleartextTraffic global, allowBackup a false para que adb backup no saque el .ssb, y el backend en un servicio en primer plano en el proceso :node, que ademas es lo que permitira reiniciarlo limpio para el cambio de identidad. El APK actual declara FOREGROUND_SERVICE pero no registra ningun servicio, de modo que el backend muere al pasar a segundo plano. Los binarios no se versionan: scripts/prepare.sh extrae las librerias y empaqueta el backend. La keystore se pasa por entorno. Verificado: ./gradlew assembleDebug construye una APK de 52 MB con las tres librerias, targetSdk 35 y los permisos declarados; su DEX contiene onPermissionRequest, PermissionRequest, CAMERA y RECORD_AUDIO, donde el APK actual tiene cero de los cuatro. Falta probarla en un dispositivo real.
This commit is contained in:
parent
ace175cca3
commit
32f6d2269c
22 changed files with 944 additions and 0 deletions
58
android/scripts/prepare.sh
Executable file
58
android/scripts/prepare.sh
Executable file
|
|
@ -0,0 +1,58 @@
|
|||
#!/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) 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)"
|
||||
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"
|
||||
echo "backend empaquetado: $(du -h "$ASSETS/nodejs-project.zip" | cut -f1) en assets/nodejs-project.zip"
|
||||
echo
|
||||
echo "Listo. Ahora: ./gradlew assembleRelease"
|
||||
Loading…
Add table
Add a link
Reference in a new issue