Fix missing-assets detection race, 16 KB page alignment, and Android audio backend
build / build (push) Successful in 2m11s
build / build (push) Successful in 2m11s
- QuestShockActivity now actually blocks the native engine from starting when game data is missing, closing three gaps found via on-device testing: super.onCreate() must run unconditionally first (Android throws SuperNotCalledException otherwise); SDLActivity.mBrokenLibraries is now set provisionally before the storage-permission check, since onWindowFocusChanged() closing the permission dialog could otherwise start the engine before the async onRequestPermissionsResult() callback ran; and a new GameSurface (SDLSurface subclass) closes the actual gap that let the init_popups NULL-deref crash through even with mBrokenLibraries set - SDLSurface.surfaceChanged() starts the native thread directly without ever checking that flag. - Force Android to use SDL2's openslES audio backend instead of AAudio (android/engine-patches/05-android-audio-driver.patch): AAudio only allows one open playback device at a time, but the engine opens two (cutscene audio via SDL_OpenAudioDevice, SFX/MIDI via Mix_OpenAudio), hitting an assertion failure on real hardware. - Add 16 KB ELF page-size alignment (-Wl,-z,max-page-size=16384) to every Android shared library - the four prebuilts (SDL2, SDL2_mixer, fluidsynth-lite, gl4es, in build-image/Dockerfile) and the engine's own libmain.so (build.gradle) - matching Google's Play Store requirement for Android 15+ and clearing Android Studio's compatibility warning. - Add a stageEngine Gradle task that automatically re-stages the patched engine/ copy and prebuilt libraries before any Android Studio build (hooked into preBuild, with proper up-to-date checking), so source/ patch changes can't silently go stale in the build/android-engine scratch copy - previously a manual, easy-to-forget step. Skips automatically inside the build-image container so make apk/CI are unaffected.
This commit is contained in:
@@ -0,0 +1,20 @@
|
||||
--- a/src/MacSrc/Shock.c
|
||||
+++ b/src/MacSrc/Shock.c
|
||||
@@ -162,6 +162,17 @@
|
||||
void InitSDL() {
|
||||
SDL_SetHint(SDL_HINT_NO_SIGNAL_HANDLERS, "1");
|
||||
SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengl");
|
||||
+#ifdef __ANDROID__
|
||||
+ // SDL2 2.28.5's AAudio backend (Android's default since API 26) only
|
||||
+ // ever allows one open non-capture (playback) device at a time - it
|
||||
+ // keeps a single static handle and asserts on a second open
|
||||
+ // ('SDL_assert((audioDevice == NULL) || iscapture)' in
|
||||
+ // src/audio/aaudio/SDL_aaudio.c). SDLSound.c opens two: one directly via
|
||||
+ // SDL_OpenAudioDevice() for cutscene audio, one via Mix_OpenAudio() for
|
||||
+ // SFX/MIDI. The older OpenSL ES backend has no such limitation, so force
|
||||
+ // it instead of AAudio.
|
||||
+ SDL_SetHint(SDL_HINT_AUDIODRIVER, "openslES");
|
||||
+#endif
|
||||
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_AUDIO) < 0) {
|
||||
DEBUG("%s: Init failed", __FUNCTION__);
|
||||
}
|
||||
Reference in New Issue
Block a user