Repository navigation
Pack the FUComplete build as its own Android app, PokeeFUC - #2
Closed
Oddity-git wants to merge 15 commits into
Closed
Oddity-git wants to merge 15 commits into
Oddity-git wants to merge 15 commits into
Conversation
An Android build directory configured with MHFU_TITLE=FUC now packs PokeeFUC: application id io.github.teamgdb.pokeefuc, PokeeFUC on the launcher, pokeefuc-<version>-android-arm64.apk. It installs beside Pokee with its own storage. The Java code keeps one package; build_apk.sh renames the manifest package with aapt2 and packs a copy of the resources with the title's name, and the manifest names the activity in full so it is found under either id. An unknown title is refused. From Yakumo's packer: sources and classes are passed as arrays, the keystore password reaches apksigner through the environment, the APK carries Pokee's, Dear ImGui's, tiny-AES-c's and xxHash's licences, zip leaves out directory records, aapt2 does not crunch the icons again, and ANDROID_BUILD_TOOLS_VERSION / ANDROID_COMPILE_SDK_VERSION pick SDK versions. android_packaging_tests.py runs build_apk.sh against stand-in SDK tools. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Hyrco8tLuU7Jb5hpCUJdH3
On Android 11 and later the app asks for the surface frame rate the Frame rate setting presents at (Match display: the display's own), so a phone that switches between 60, 90 and 120 Hz can show 90 or 120. ANativeWindow_setFrameRate is looked up at run time, so the APK still loads on Android 10, where nothing is asked. MHFU_NO_DISPLAY_RATE_REQUEST leaves the display as it was. The rate comes from pacing::requested_rate, which wanted_rate now uses before its Vsync cap. Ported from Yakumo with its loader tests. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Hyrco8tLuU7Jb5hpCUJdH3
Owner
Author
|
The four red checks on
The first two fixes belong on the FUComplete branch (#1), and I've passed them on to whoever is working on it. This PR picks them up once that branch has them. I haven't re-run the checks, because the failures are deterministic. Generated by Claude Code |
They run a shell script, so coverage.py measures nothing in them, and the coverage pipeline test's fixture repository has no copy to run. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Hyrco8tLuU7Jb5hpCUJdH3
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Hyrco8tLuU7Jb5hpCUJdH3
Owner
Author
|
Update for
Generated by Claude Code |
The NDK links shared libraries with --no-undefined, so the two fixture modules failed to link in the Android test build. They leave the framework's symbols to the loader, as the overlay libraries already do with -z undefs. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Hyrco8tLuU7Jb5hpCUJdH3
ld64 refuses a bundle with undefined symbols; the fixtures take the framework's from the test executable when loaded, so they link with -undefined dynamic_lookup. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Hyrco8tLuU7Jb5hpCUJdH3
macOS's bash 3.2 takes an empty array for an unset variable under set -u, so build_apk.sh stopped with 'class_files[@]: unbound variable' when javac made no classes (the packaging tests' stand-in made none). The script now counts the sources and classes and says which is missing; the stand-in javac writes a class. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Hyrco8tLuU7Jb5hpCUJdH3
The HUD scale replay and overlay swap tests read fixtures from host paths compiled into them, which do not exist on the emulator. CTest now names both directories through the environment, the tests prefer that value, and the Android runner copies any directory a test's environment names inside the checkout or the build to the device and rewrites the value. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Hyrco8tLuU7Jb5hpCUJdH3
Both branches taught the overlay test fixtures to leave host symbols to the loader on Android and macOS; the FUComplete branch's wording is kept. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Hyrco8tLuU7Jb5hpCUJdH3
macOS temporary directories sit behind a symlink, and the runner pushes the resolved directory. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Hyrco8tLuU7Jb5hpCUJdH3
The coverage build sets only the C++ compiler to Clang, so the KTX2 decoder's zstd C source went to the system cc with Clang-only flags and the build stopped. The flags now apply per language when that language's compiler is Clang. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Hyrco8tLuU7Jb5hpCUJdH3
The FUComplete branch fixed the same two things this branch had: the Android runner now copies the overlay and HUD fixtures itself, and the coverage flags apply to C++ only. Its versions are kept, and this branch's environment-based fixture copying is dropped. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Hyrco8tLuU7Jb5hpCUJdH3
Owner
Author
|
The cppcheck job (
No fix for these exists yet to port. Once the base carries one, a merge of the base will pick it up here. Generated by Claude Code |
…to claude/project-thread-yl4vev
Under Fill the 2D interface is pulled into a PSP-shaped box in the middle of the screen, which on a phone leaves wide empty bands beside the clock, the bars, the map and the item bar. "Interface at the edges" (video.hud_edges, MHFU_HUD_EDGES) moves each quest HUD quad out by the gap the fit left: the clock, the bars and the party list to the left, the map and the item bar to the right. The side is judged from the game's own rectangle of each quad, so a bar's end cap stays with its bar, and what sits in the middle stays. Only draws filed by game_task's quest HUD move; menus and names over hunters keep their place. A draw's scissor moves with it, or takes in where its quads landed when they went different ways. It is on by default on Android and off on the desktop. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Hyrco8tLuU7Jb5hpCUJdH3
cppcheck followed place_at_edges into quad_bounds with an empty copy and reported an out-of-bounds read the size guard already prevents. A one-vertex copy keeps the mismatch case. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Hyrco8tLuU7Jb5hpCUJdH3
2 tasks done
Owner
Author
|
Moved to the Generated by Claude Code |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Requested by Mathieu · project thread
Changes
Before: Pokee already had an Android app (SDL activity,
build_apk.sh,release_android.sh), but it only ever packedio.github.teamgdb.pokee. An Android build of the FUComplete title (MHFU_TITLE=FUC) would have produced an APK with Pokee's id and name, replacing a Pokee install and its data.After: an Android build directory configured with
-DMHFU_TITLE=FUCpacks PokeeFUC: application idio.github.teamgdb.pokeefuc, PokeeFUC on the launcher,pokeefuc-<version>-android-arm64.apk. It installs beside Pokee with its own storage and saves. On Android 11+ the app also asks the system for the display rate the Frame rate setting presents at, as Yakumo's Android app does.How:
build_apk.shreadsMHFU_TITLEfrom the build'sCMakeCache.txt, renames the manifest package withaapt2 link --rename-manifest-package, and packs a copy ofres/with the title'sapp_name. The Java code keeps its single package; the manifest names the activity in full so it is found under either id. An unknown title is refused.release_android.shnames the APK after the title.build_apk.sh(same MIT licence and contributors): Java sources and classes passed as arrays, keystore password passed toapksignerthrough the environment instead of argv, Pokee/Dear ImGui/tiny-AES-c/xxHash licences in the APK, no directory records in the zip,--no-crunch, andANDROID_BUILD_TOOLS_VERSION/ANDROID_COMPILE_SDK_VERSION.platform/android_display.*callsANativeWindow_setFrameRate, looked up at run time so the APK still loads on Android 10. The renderer requests the rate on each new surface and when Frame rate changes.pacing::requested_ratenow provides the rate, andwanted_rateuses it before its Vsync cap.MHFU_NO_DISPLAY_RATE_REQUEST=1turns the request off.### PokeeFUCwith the configure commands), packaging README, TESTING.md, SOURCE_PROVENANCE.md.This PR is stacked on #1 (the FUComplete build), so its base is that branch.
Related issues
None.
Validation
Linux x86-64 cloud container, commit
931d801:python3 profiles/mhfu/tests/android_packaging_tests.py: 7 tests pass. They runbuild_apk.shagainst stand-in SDK tools and check the package id and label for FU, FUC and a build with no title, that an unknown title is refused, the packed licences, SDK version selection, and that the password stays out of argv. Against the previousbuild_apk.sh, all 7 fail.-DMHFU_RENDERER=OFF -DMHFU_FFMPEG=OFF) andctest: 59/59 pass, including the five newmhfu_android_display_*loader scenarios and the newrequested_ratechecks inmhfu_interpolation_tests.vulkan_renderer.cppcompiled with-fsyntax-only -DMHFU_ANDROID_APP=1against SDL 3.4.16 and Vulkan headers. The only errors came from the generated shader include, which was stubbed out.python3 -m unittest discover -s scripts/ci: one failure,test_cppcheck_driver ... exact_source_context. It fails the same way without this change.Not verified
dl.google.com, so it has no Android SDK or NDK, and no native Android cross-compile was run.Checklist
Generated by Claude Code