Files
llimphi/android/scripts/build-android.sh
T
sergio e65e9cc623 feat: llimphi standalone — framework UI soberano extraído del monorepo
Motor gráfico Llimphi como workspace independiente: bucle Elm
(input→update→view→layout→raster→present) sobre wgpu+vello+taffy+parley.
Núcleo (hal/raster/layout/text/ui/theme/surface/motion/icons) + ~40 widgets
+ módulos, sin dependencias al resto del monorepo. cargo check --workspace
pasa (64 crates). Puerta de entrada: cargo run -p llimphi-ui --example counter.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 04:23:42 +00:00

90 lines
3.5 KiB
Bash
Executable File

#!/usr/bin/env bash
# ============================================================================
# build-android.sh — empaca un crate Llimphi-Android como APK firmado.
#
# Uso:
# ./build-android.sh <crate-dir> [arch] [profile]
#
# crate-dir : path al Cargo.toml del crate Android (cdylib + android_main)
# arch : arm64 | x64 (default arm64)
# profile : release | debug (default release)
#
# Requisitos:
# - rustup target add aarch64-linux-android x86_64-linux-android
# - cargo install xbuild (binario `x`)
# - cargo install cargo-ndk (opcional, sólo si querés build sin APK)
# - NDK r27+ en $ANDROID_NDK_HOME
# - Android SDK en $ANDROID_HOME (cmdline-tools + build-tools)
# - PEM dev en $LLIMPHI_PEM (se crea automáticamente la primera vez)
#
# Resultado:
# target/x/<profile>/android/<crate>.apk — APK firmado v2, instalable con
# `adb install -r <apk>`.
# ============================================================================
set -euo pipefail
CRATE_DIR="${1:?se requiere crate-dir como primer argumento}"
ARCH="${2:-arm64}"
PROFILE="${3:-release}"
# --- toolchain -------------------------------------------------------------
: "${ANDROID_NDK_HOME:=/home/sergio/android-ndk-r27c}"
: "${ANDROID_NDK_ROOT:=$ANDROID_NDK_HOME}"
: "${ANDROID_HOME:=/opt/android-sdk}"
: "${LLIMPHI_PEM:=$HOME/.local/share/llimphi-android/debug.pem}"
export ANDROID_NDK_HOME ANDROID_NDK_ROOT ANDROID_HOME
X_BIN="${X_BIN:-$HOME/.cargo/bin/x}"
test -x "$X_BIN" || { echo "❌ xbuild (cargo install xbuild)"; exit 1; }
test -d "$ANDROID_NDK_HOME" || { echo "❌ NDK no encontrado en $ANDROID_NDK_HOME"; exit 1; }
test -d "$ANDROID_HOME" || { echo "❌ SDK no encontrado en $ANDROID_HOME"; exit 1; }
# --- PEM de firma dev (RSA 2048 + cert auto-firmado) -----------------------
if [ ! -f "$LLIMPHI_PEM" ]; then
echo "→ generando PEM de firma dev en $LLIMPHI_PEM"
mkdir -p "$(dirname "$LLIMPHI_PEM")"
openssl req -x509 -newkey rsa:2048 \
-keyout "${LLIMPHI_PEM}.key" \
-out "${LLIMPHI_PEM}.cert" \
-days 36500 -nodes \
-subj "/CN=llimphi-dev/O=gioser/C=AR" 2>/dev/null
cat "${LLIMPHI_PEM}.key" "${LLIMPHI_PEM}.cert" > "$LLIMPHI_PEM"
fi
# --- flags -----------------------------------------------------------------
PROFILE_FLAG="--release"
[ "$PROFILE" = "debug" ] && PROFILE_FLAG="--debug"
# --- build ----------------------------------------------------------------
cd "$CRATE_DIR"
CRATE_NAME=$(grep '^name *=' Cargo.toml | head -1 | sed -E 's/.*"([^"]+)".*/\1/')
echo "→ building $CRATE_NAME · $ARCH · $PROFILE"
"$X_BIN" build \
--platform android \
--arch "$ARCH" \
--format apk \
$PROFILE_FLAG \
--pem "$LLIMPHI_PEM"
# --- locate + verify -------------------------------------------------------
APK=$(find ../../../../target/x/$PROFILE/android -name "${CRATE_NAME}.apk" 2>/dev/null | head -1)
[ -z "$APK" ] && APK=$(find . -name "${CRATE_NAME}.apk" 2>/dev/null | head -1)
[ -z "$APK" ] && { echo "❌ APK no encontrado"; exit 1; }
APK=$(readlink -f "$APK")
SIZE=$(du -h "$APK" | cut -f1)
APKSIGNER="$ANDROID_HOME/build-tools/37.0.0/apksigner"
if [ -x "$APKSIGNER" ]; then
if "$APKSIGNER" verify --min-sdk-version 24 "$APK" 2>/dev/null; then
echo "✓ firma verificada (APK Signature Scheme v2)"
else
echo "⚠ firma no verifica"
fi
fi
echo "$APK ($SIZE)"
echo
echo "Instalar en device:"
echo " adb install -r $APK"