arm64: flat guest mapping, audio, crash reporting, self-extracting data
The run of work that took the translated build from "boots" to "playable". Engine: - Flat guest mapping replaces the software MMU on aarch64 hosts. A 4 GiB PROT_NONE reservation lets a 32-bit guest address zero-extend safely, so tcg_out_qemu_ld/st short-circuit before tcg_out_tlb_read and the prologue materialises the base into X28. Measured 1.24x (51 vs 41 fps, interleaved A/B). Note the base must be set BEFORE UC_INIT - Unicorn inits lazily, and setting it after uc_open silently falls back to softmmu. - num_get<char> facet implemented, which was the real cause of the crash after the prologue race; a full race is now playable end to end. - Thread-stack free list + ReleaseThreadEngine, fixing the arena leak that showed up as a black screen when entering a race. kMaxGuestThreads 16 -> 64. - Real ARM32 FMOD now runs in-engine via the Java FMODAudioDevice bridge, with a per-thread JNIEnv. Two of the three blockers were our own single-image-era guards. Host/app: - Native crash handler: async-signal-safe, decodes the host fault back to a guest address, writes a report file and nothing else. CrashReportActivity picks it up on the NEXT launch, zips it, and offers to share. No backend, no automatic upload. - Game data ships inside the APK and self-extracts on first launch, so a tester installs one file and plays. Copy-to-.part-then-rename, with a free-space check up front. - EGL context preserved across pause, fixing black textures on resume. - Navigation bar hidden and re-hidden on focus gain; volume keys reported as system keys, checked before the loading-state gate. - x86_64 added to abiFilters: the ARM32 guest runs under tcg/i386 with no houdini in the path. The flat mapping is aarch64-only, so that host falls back to the software MMU - commented at the abiFilters line. Ignore rules added for app/translated/ (611 MB of signed release APK, which also carries the bundled OBB) and ostream_repro/build/. Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Executable
+45
@@ -0,0 +1,45 @@
|
||||
#!/usr/bin/env bash
|
||||
# Builds libostream_repro.so for armeabi-v7a via the NDK's CMake toolchain
|
||||
# file - standalone, deliberately outside the Gradle build, same pattern as
|
||||
# ../trace_agent/build.sh. Output: build/libostream_repro.so, ready to push
|
||||
# to a device for GuestEngine::LoadSecondaryImage to load (see
|
||||
# mpcore/src/main/cpp/emu/ostream_repro_test.cpp).
|
||||
set -euo pipefail
|
||||
cd "$(dirname "$0")"
|
||||
|
||||
NDK="${ANDROID_NDK_HOME:-/home/megboyzz/Android/Sdk/ndk/27.0.12077973}"
|
||||
TOOLCHAIN="$NDK/build/cmake/android.toolchain.cmake"
|
||||
|
||||
if [ ! -f "$TOOLCHAIN" ]; then
|
||||
echo "NDK toolchain file not found at $TOOLCHAIN - set ANDROID_NDK_HOME" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# ANDROID_STL=c++_static explicitly - see ostream_repro.cpp's own top
|
||||
# comment for the full reasoning (tried c++_shared FIRST, actually built
|
||||
# and inspected both outcomes with llvm-readelf before deciding, not
|
||||
# guessed): the modern NDK r27 toolchain's libc++ headers extern-template-
|
||||
# declare basic_stringbuf<char>/basic_ostream<char>/basic_ios<char>/
|
||||
# basic_ostringstream<char> (their vtables AND ctors/dtors become UNDEFINED
|
||||
# imports resolved against libc++_shared.so, confirmed via
|
||||
# `llvm-readelf --dyn-syms` on a real c++_shared build of this exact file),
|
||||
# which GuestEngine has zero shims for - that combination would make this
|
||||
# test fail for an uninteresting, unrelated reason (unimplemented vtable
|
||||
# stub returning 0) instead of actually exercising real, compiled
|
||||
# std::basic_stringbuf<char>::str()/write() logic. c++_static compiles that
|
||||
# logic directly into THIS .so's own .text - both a working build AND a
|
||||
# closer functional match to what libapp.so's own (much older) toolchain
|
||||
# evidently did for sub_79CD4/sub_27160C (confirmed real, compiled,
|
||||
# fixed-address code inside libapp.so itself, never external imports -
|
||||
# see ARM64_TRANSLATION_LAYER.md's 2026-09-16 entries).
|
||||
cmake -B build -G Ninja \
|
||||
-DCMAKE_TOOLCHAIN_FILE="$TOOLCHAIN" \
|
||||
-DANDROID_ABI=armeabi-v7a \
|
||||
-DANDROID_PLATFORM=android-27 \
|
||||
-DANDROID_STL=c++_static \
|
||||
-DCMAKE_BUILD_TYPE=Debug \
|
||||
.
|
||||
|
||||
cmake --build build
|
||||
|
||||
echo "Built: $(pwd)/build/libostream_repro.so"
|
||||
Reference in New Issue
Block a user