Android 构建 / 模拟器验证 Runbook(2026-10-18)¶
历史记录 / Historical record:本文保留当时的计划、研究或验收证据,不代表 0.11 当前能力全集。现行说明见 文档入口;英文入口见 English overview。
环境¶
- Android SDK/NDK:
/Volumes/OneTHUBuild/oh-android-sdk(NDK 27.1.12297006) - JDK:17(
/usr/libexec/java_home -v 17) - AVD:
onethu-demo(android-35 google_apis arm64-v8a) - Gradle 工程:
apps/desktop/src-tauri/gen/android(软链到/Volumes/OneTHUBuild/onethu-android;Android 工程/构建缓存必须在 SSD,禁止再放内盘)
关键:
tauri android build默认不注入 NDK 的 linker/CC,Rust 会误用宿主cc链接 Android 目标。必须显式导出以下环境变量(本 runbook 已实测):
NDK=/Volumes/OneTHUBuild/oh-android-sdk/ndk/27.1.12297006
BIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64/bin
export PATH=$BIN:$PATH NDK_HOME=$NDK
export CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER=$BIN/aarch64-linux-android34-clang
export CC_aarch64_linux_android=$BIN/aarch64-linux-android34-clang
export CXX_aarch64_linux_android=$BIN/aarch64-linux-android34-clang++
export AR_aarch64_linux_android=$BIN/llvm-ar
只编译 Kotlin(最快抓 native 语法错误)¶
cd apps/desktop/src-tauri/gen/android
JAVA_HOME=$(/usr/libexec/java_home -v 17) ./gradlew \
:tauri-plugin-onethu-mobile:compileDebugKotlin :app:compileArmDebugKotlin --offline
打 debug APK¶
cd apps/desktop
# 先导出上面的 NDK 环境变量
pnpm tauri android build --debug
# 产物:src-tauri/gen/android/app/build/outputs/apk/universal/debug/app-universal-debug.apk
模拟器安装/启动¶
EMU=/Volumes/OneTHUBuild/oh-android-sdk/emulator/emulator
ADB=/Volumes/OneTHUBuild/oh-android-sdk/platform-tools/adb
$EMU -avd onethu-demo -no-window -no-audio -no-boot-anim -gpu swiftshader_indirect -no-snapshot &
$ADB wait-for-device
$ADB install -r apps/desktop/src-tauri/gen/android/app/build/outputs/apk/universal/debug/app-universal-debug.apk
$ADB shell am start -W -n app.onethu.desktop/.MainActivity
$ADB exec-out screencap -p > /tmp/onethu-emulator.png
2026-10-18 实测结果¶
- Kotlin 编译:
BUILD SUCCESSFUL(插件 + app)。 - debug APK:
BUILD SUCCESSFUL,universal APK 277MB。 - 模拟器安装成功,
MainActivity冷启动成功,进入登录页(截图docs/assets/android-emulator-login-2026-10-18.png)。 - 登录页按系统返回键 → App 进程退出、回桌面;无
FATAL EXCEPTION。 - 模拟器没有 NFC 硬件,无法验证 ReaderMode/HCE;也未登录,无法验证暂存箱/云端 UI。
内盘空间纪律(2026-10-18 教训)¶
- Tauri/Gradle 构建曾把 Android 工程放在
/Users/st/onethu-android(内盘),加上模拟器 AVD, 一度把内盘写到只剩几百 MB;已删除并改软链到/Volumes/OneTHUBuild/onethu-android。 - 以后构建前确认
apps/desktop/src-tauri/gen/android软链指向外置 SSD;模拟器 AVD 也应在 SSD。 - 不要在
~/下新建 Android/Gradle 工程目录。
已知限制¶
tauri android build未自动设置 NDK linker,需按上面 env 导出;可考虑后续加脚本封装。- 生成的
gen/schemas/*-schema.json会随权限/命令变化更新,需随提交。
电脑上预览手机端¶
- 开发模式入口:
http://127.0.0.1:5180/?phone-frame=1 - 可选参数:
device=15pro|15pm|se|pixel8|mini、land=1、fit=0、scene=page-vault|namecard|settings|page-cloud|... - 示例:
- 暂存箱:
/?phone-frame=1&scene=page-vault - 名片/组织:
/?phone-frame=1&scene=namecard - 注意:DPR 用宿主屏幕、安全区不模拟;免登录预览场景会出现引导浮层,点「不再提示」即可。