The A/B/C harness series: sltest (Slint) / egtest (egui) / tttest (Tauri 2 → wry → Android WebView/Chromium). Identical scene to sltest: 8580 full-width rows, 150 px + 2 px divider, alternating colors, virtualized (26-element DOM pool), custom touch drag + exponential-decay fling (sltest decay constant 7.42), rAF-driven frame loop. FR logging: the rAF callback records gap/cost exactly like the Rust harnesses; lines batch (~120) and cross the Tauri event bridge once per second (JNI round trip kept off the per-frame path). Rust side drains to a dedicated writer thread → /sdcard/Android/data/wow.gmp.tttest/files/Documents/fr.log (Tauri document_dir = getExternalFilesDir(DOCUMENTS) — the framework CREATES it; a raw std::fs mkdir of the app's external tree is SELinux-denied on Android 11+). Same FR-line format → fr_capture.py is the referee (its launch check now falls back to the package's LAUNCHER activity via monkey for non-NativeActivity apps). Gotchas learned (see frontend/dist/index.html comments): - touch-action is NOT inherited: touches land on .row, so each row must declare touch-action:none or the WebView claims the pan and cancels the page's drag (only a few px register). - Fling velocity must be a per-EVENT EMA; frame-based tracking dies when touch events sample slower than rAF (adb swipe ≈ 17 Hz). - Drag sign: finger up → offset grows (offset -= finger dy). - Tauri v2 'brownfield' is the NORMAL direct-IPC mode (not an app-provides-content mode); the mobile schema rejects security.pattern entirely. - Custom #[tauri::command]s hit the two-pass app-command ACL chicken-and-egg; the core:default event bridge avoids it. - Rust log output needs a logcat backend (log/std + __android_log_write) or it is invisible. Emulator (60 Hz, scripted swipes): 1319 frames, median 16.70 ms, 5 isolated drops (0.38%), all at swipe-injection moments, render cost med 2 ms. aarch64 phone build compiles (11 MB APK); phone testing pending (personal-device policy). Build: harnesses/tttest/scripts/build.sh [x86_64|aarch64] — cargo-tauri CLI (v2.12.4, prebuilt) drives the gradle build; signed with the debug keystore.
42 lines
1.4 KiB
Bash
Executable File
42 lines
1.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# tttest build: Tauri v2 scroll-jank testbed (sltest port).
|
|
#
|
|
# ./scripts/build.sh # aarch64 (phone)
|
|
# ./scripts/build.sh x86_64 # emulator
|
|
# ADB_SERIAL=<s> ./scripts/build.sh # install target
|
|
#
|
|
# Output: /tmp/tttest/<abi>-release.apk (signed with the debug keystore).
|
|
set -euo pipefail
|
|
cd "$(dirname "$0")/.."
|
|
|
|
ABI="${1:-aarch64}"
|
|
case "$ABI" in
|
|
aarch64|x86_64|armv7|i686) ;;
|
|
*) echo "unknown ABI: $ABI" >&2; exit 2 ;;
|
|
esac
|
|
|
|
export ANDROID_HOME="${ANDROID_HOME:-$HOME/android-sdk}"
|
|
export ANDROID_SDK_ROOT="$ANDROID_HOME"
|
|
|
|
cargo tauri android build --target "$ABI"
|
|
|
|
SRC=gen/android/app/build/outputs/apk/universal/release/app-universal-release-unsigned.apk
|
|
[ -f "$SRC" ] || { echo "APK not found at $SRC" >&2; exit 1; }
|
|
|
|
OUT=/tmp/tttest
|
|
mkdir -p "$OUT"
|
|
cp "$SRC" "$OUT/tttest-$ABI-unsigned.apk"
|
|
|
|
KEYSTORE="${KEYSTORE:-$HOME/.android/debug.keystore}"
|
|
APKSIGNER="$ANDROID_HOME/build-tools/35.0.0/apksigner"
|
|
"$APKSIGNER" sign --ks "$KEYSTORE" --ks-key-alias androiddebugkey \
|
|
--ks-pass pass:android --key-pass pass:android \
|
|
--out "$OUT/tttest-$ABI-release.apk" "$OUT/tttest-$ABI-unsigned.apk"
|
|
echo "APK: $OUT/tttest-$ABI-release.apk ($(du -h "$OUT/tttest-$ABI-release.apk" | cut -f1))"
|
|
|
|
if [ -n "${ADB_SERIAL:-}" ]; then
|
|
adb -s "$ADB_SERIAL" install -r "$OUT/tttest-$ABI-release.apk"
|
|
adb -s "$ADB_SERIAL" shell am force-stop wow.gmp.tttest
|
|
adb -s "$ADB_SERIAL" shell am start -n wow.gmp.tttest/.MainActivity
|
|
fi
|