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>
52 lines
1.6 KiB
Plaintext
52 lines
1.6 KiB
Plaintext
*.iml
|
|
.gradle
|
|
/local.properties
|
|
/.idea/caches
|
|
/.idea/libraries
|
|
/.idea/modules.xml
|
|
/.idea/workspace.xml
|
|
/.idea/navEditor.xml
|
|
/.idea/assetWizardSettings.xml
|
|
.DS_Store
|
|
/build
|
|
/captures
|
|
.externalNativeBuild
|
|
.cxx
|
|
local.properties
|
|
|
|
# IDA databases - 148MB for libapp.so.i64 alone, and regenerable from the .so
|
|
*.i64
|
|
*.id0
|
|
*.id1
|
|
*.nam
|
|
*.til
|
|
# trace_agent is built by its own build.sh, outside Gradle
|
|
trace_agent/build/
|
|
# ostream_repro likewise - CMake/ninja output, the sources next to it are kept
|
|
ostream_repro/build/
|
|
# ad-hoc device capture logs
|
|
device_run_*.log
|
|
|
|
# Where `gradlew assembleTranslatedRelease` output was collected by hand for
|
|
# signing. 611 MB of signed APK - a build product, and one that carries the
|
|
# bundled OBB with it, so it must never reach history.
|
|
app/translated/
|
|
|
|
# Release signing material never belongs in the repo - see app/build.gradle.kts
|
|
*.jks
|
|
*.keystore
|
|
keystore.properties
|
|
*-release.properties
|
|
|
|
# Bundled game data (~595 MB). A build INPUT, not source: it is the game's own
|
|
# OBB, copied into assets so the APK self-extracts it on first launch (see
|
|
# GameDataInstaller.kt). Keeping it out of history on purpose - a 595 MB blob
|
|
# is rejected outright by most hosts, and once committed it can only be removed
|
|
# by rewriting history.
|
|
#
|
|
# To build: copy the OBB here yourself, under exactly this name.
|
|
# cp main.<versionCode>.<package>.obb app/src/main/assets/game_data.obb
|
|
# Without it the app still builds and runs; it just expects the OBB to already
|
|
# be on the device at getObbDir(), the way it was before this was bundled.
|
|
app/src/main/assets/game_data.obb
|