Files

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, spawn or TCP. The embedded copy is built without the split layer (MOBILEGL_BUILD_DISAGGREGATED=OFF), so MOBILEGL_TRANSPORT is 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 no libMobileGLServer.so;
  • builds with ThinLTO and -O3 (MOBILEGL_ENABLE_LTO=ON) unless you pass -Pmobilegl.enableLto=OFF;
  • uses NDK 27.3.13750724 and the Android SDK's CMake 3.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) or Magma (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.