5.1 KiB
MobileGL embedded in FCL (Android, monolith)
Some FCL (Fold Craft Launcher) builds carry MobileGL as a Gradle module and ship libMobileGL.so
inside the launcher APK. This page covers that embedded copy. For the separately installed renderer
plugin, see android-plugin.md.
When to use it
- You play Minecraft on Android through an FCL build that already lists MobileGL renderers.
- You want the simplest setup with the least overhead: everything runs inside the game process.
When not to use it:
- You want
inproc,spawnor TCP. The embedded copy is built without the split layer (MOBILEGL_BUILD_DISAGGREGATED=OFF), soMOBILEGL_TRANSPORTis ignored and it always runs monolith. Use the plugin APK instead. - Your launcher does not embed MobileGL. Use the plugin.
Requirements
- Android 8.0 (API 26) or newer, arm64-v8a. The embedded build packages arm64-v8a only.
- Espryt needs an OpenGL ES 3.x driver. Magma needs a Vulkan driver.
How it is built and integrated
The FCL source tree has MobileGL as a git submodule and Gradle module:
| Where | What |
|---|---|
.gitmodules |
submodule MobileGL -> https://github.com/MobileGL-Dev/MobileGL.git |
settings.gradle.kts |
include(":MobileGL") |
FCLauncher/build.gradle.kts |
implementation(project(":MobileGL")) |
MobileGL's build.gradle detects that it is not the standalone plugin build (the root project is
not MobileGLPlugin) and then:
- builds arm64-v8a only;
- builds without the split layer (
MOBILEGL_BUILD_DISAGGREGATED=OFF), so there is nolibMobileGLServer.so; - builds with ThinLTO and
-O3(MOBILEGL_ENABLE_LTO=ON) unless you pass-Pmobilegl.enableLto=OFF; - uses NDK
27.3.13750724and the Android SDK's CMake3.22.1.
Before the first build, initialize MobileGL's submodules and glslang's external sources. Run these inside the FCL checkout:
git submodule update --init --recursive
cd MobileGL/3rdparty/glslang && python3 update_glslang_sources.py
Then build FCL as its own documentation describes. The mobilegl.* Gradle properties from
building.md apply when passed to FCL's Gradle invocation (for
example -Pmobilegl.logLevel=MOBILEGL_LOG_LEVEL_DEBUG).
Choosing the renderer and backend
In FCL, open the game settings and pick the renderer under OpenGL Implementation (Renderer). The embedded copy appears as two entries. FCL sets the backend from the entry you pick:
| FCL entry | Sets |
|---|---|
MobileGL (Dev, Espryt) |
MOBILEGL_BACKEND_TYPE=DirectGLES |
MobileGL (Dev, Magma) |
MOBILEGL_BACKEND_TYPE=DirectVulkan |
The entry names above are from the FCL build that this guide was checked against; other FCL builds may label them differently.
Which backend to pick: try Espryt first (the default). Use Magma if your device's Vulkan driver is better than its GLES driver. Compare with the in-game frame rate; there is no universal answer.
Other settings
FCL's Environment Variables editor (game settings, advanced section) takes one KEY=VALUE per
line. FCL applies it after the renderer's own variables, so it can also override
MOBILEGL_BACKEND_TYPE. Example:
MOBILEGL_FRAMES_IN_FLIGHT=2
MOBILEGL_RELAXED_SEMANTICS=1
Useful keys are listed in configuration.md. The FCL build checked for this guide stores this editor's contents launcher-wide, not per instance.
Without access to the launcher's settings (for example while testing a launcher you cannot
rebuild), Android system properties work from adb, with no root needed:
| Property | Effect |
|---|---|
debug.mobilegl.backend |
Overrides MOBILEGL_BACKEND_TYPE, even when the launcher set it. |
debug.mobilegl.env |
KEY=VALUE;KEY=VALUE list of settings. It ranks below the process environment: it fills in only keys the launcher did not set. It holds at most 91 characters (Android's property length limit). |
debug.mobilegl.fps_log |
1 logs the frame rate about every two seconds (same as MOBILEGL_FPS_LOG=1). |
adb shell setprop debug.mobilegl.backend DirectVulkan
adb shell setprop debug.mobilegl.env "MOBILEGL_FRAMES_IN_FLIGHT=2;MOBILEGL_RELAXED_SEMANTICS=1"
These properties apply to every app on the device that loads MobileGL, and they last until reboot. Clear one by setting it to an empty string:
adb shell setprop debug.mobilegl.env ""
debug.mobilegl.env covers most settings in configuration.md. The ones marked
env only there are read straight from the process environment and ignore it, notably
MOBILEGL_LOG_FILE_PATH and MOBILEGL_IPC_TOKEN. MOBILEGL_FPS_LOG and
MOBILEGL_GPU_HANG_BUDGET_MS have their own properties (debug.mobilegl.fps_log,
debug.mobilegl.gpu_hang_budget_ms).
How to tell it works
- Minecraft's F3 screen shows
Espryt (MobileGL Core)orMagma (MobileGL Core)as the renderer. - logcat shows MobileGL's lines:
adb logcat -s MobileGL
Look for Config: Active backend type set to DirectGLES (or DirectVulkan).
- MobileGL also writes
/sdcard/MG/latest.log, if the process may write there.