Hoy el APK release de balchat está construido solo para aarch64 (ARM64, cubre ~99% de los devices Android post-2018). Este documento describe cómo agregar soporte multi-ABI para distribuir un APK universal o splitear por ABI:
arm64-v8a(aarch64) — ya soportadoarmeabi-v7a(armv7) — phones pre-2018, smart TVs viejasx86_64— emuladores Android, Chromebooks, BlueStacksx86— muy raro hoy en hardware real, pero requerido por Play Store
cargo tauri android build --target aarch64 --apk funciona end-to-end. Los
otros targets fallan en el cross-compile de OpenSSL (vendored vía
bundled-sqlcipher-vendored-openssl).
El error específico observado:
make: aarch64-linux-android-ranlib: No such file or directory
(o el equivalente para x86_64, i686, armv7a). El NDK provee
llvm-ranlib y llvm-ar, pero el script de build de OpenSSL invoca
binarios con el nombre tradicional (<arch>-linux-android-ranlib). Esto se
puede arreglar con symlinks pero hay que hacerlo para cada arch.
Para cada ABI que querés soportar, crear symlinks en ~/.cargo/bin/ que
apunten a los binarios llvm-* del NDK:
NDK_BIN="$NDK_HOME/toolchains/llvm/prebuilt/darwin-x86_64/bin"
# Para aarch64 (ya existe en setups que funcionan):
ln -sf "$NDK_BIN/llvm-ranlib" ~/.cargo/bin/aarch64-linux-android-ranlib
ln -sf "$NDK_BIN/llvm-ar" ~/.cargo/bin/aarch64-linux-android-ar
# Repetir para armv7, x86_64, i686:
for abi in armv7a-linux-androideabi x86_64-linux-android i686-linux-android; do
ln -sf "$NDK_BIN/llvm-ranlib" "$HOME/.cargo/bin/${abi}-ranlib"
ln -sf "$NDK_BIN/llvm-ar" "$HOME/.cargo/bin/${abi}-ar"
done(En Linux: cambiar darwin-x86_64 por linux-x86_64.)
rustup target add aarch64-linux-android
rustup target add armv7-linux-androideabi
rustup target add x86_64-linux-android
rustup target add i686-linux-androidcargo tauri android build \
--target aarch64 \
--target armv7 \
--target x86_64 \
--target i686 \
--apktauri-cli 2.10+ produce un APK universal con todas las ABIs incluidas, o
bien un APK por ABI (controlable con --split-per-abi).
| ABI | tamaño debug | tamaño release stripped |
|---|---|---|
| aarch64 (arm64-v8a) | 871 MB | 40 MB |
| armv7 (armeabi-v7a) | TODO | TODO |
| x86_64 | TODO | TODO |
| i686 | TODO | TODO |
(Los TODOs se completan cuando se valide el build multi-ABI en una máquina con NDK.)
- APK universal (~150 MB): un solo
.apkcon las 4 ABIs. Más simple para sideload, pero un usuario aarch64 baja 4× lo que necesita. - APK split per-ABI (~40 MB c/u): el bot de FDroid / Play Store sirve el correcto según el device. Recomendado para distribución masiva.
- OpenSSL cross-compile: además de los symlinks, requiere
--target=armv7a-linux-androideabi-clang(versión NDK), noarmv7-linux-androideabi-clang. Verificar el path exacto en$NDK_BIN.
- Si el device target tiene Android < API 24, los símbolos de ARM no funcionan en x86 → no es solo recompilar, hay que verificar runtime.
- Algunos crates en el dependency tree (
tor-*) usancfg(target_os = "android")pero asumen ARM en algunos paths; revisar build logs.
Una vez el APK multi-ABI está construido:
# Inspeccionar las ABIs presentes:
unzip -l balchat-multi.apk | grep "lib/.*\.so"
# Debe mostrar lib/arm64-v8a/, lib/armeabi-v7a/, lib/x86_64/, lib/x86/
# Test en emulador x86_64:
emulator -avd Pixel_API_34 -no-window &
adb install balchat-multi.apk
adb shell am start -n com.balchat.desktop/.MainActivityfdroid/build.sh— script de build reproducible que hoy hace solo aarch64; cambiarBALCHAT_TARGETS=aarch64,armv7,x86_64,i686cuando se complete el setup.- README.md sección "APK Android" — instrucciones single-ABI.