LSFG-Android v0.1.0 — Initial Release
First public release of LSFG-Android, an Android port of the lsfg-vk Vulkan frame-generation pipeline. Because Android 12+ blocks loading external code into non-debuggable processes, the layer can't hook another app's swapchain like the Linux implicit layer does. Instead, the app runs frame interpolation on a MediaProjection capture and composites the generated frames in a system overlay over the target game.
Sideload-only. This APK is signed with a debug keystore for the initial release. End-to-end frame generation works on Adreno 7xx-class GPUs and newer (Snapdragon 8 Gen 2 / Gen 3 / Gen 4 verified). Older Adreno and most Mali devices fall back to capture-only mirror mode.
Highlights
Frame generation
- LSFG_3_1 / LSFG_3_1P running on framegen's internal Vulkan device, fed AHardwareBuffers shared from the app's session.
- Multiplier 2× → 8×, flow scale 0.25 → 1.0.
- Performance mode, HDR mode, anti-artifacts, bypass.
- Live re-init on parameter change, serialized so concurrent slider releases don't drop the session. Hot-apply paths for bypass / pacing / Shizuku timing avoid full Vulkan rebuilds.
Capture & overlay
- MediaProjection capture via
VirtualDisplay+ImageReader, delivering AHardwareBuffer-backed frames straight into the native render loop. - Two overlay hosts:
SYSTEM_ALERT_WINDOW(default) orTYPE_ACCESSIBILITY_OVERLAYvia the optionalLsfgAccessibilityService— the recommended path for OEMs with strict untrusted-touch filters. - Touch passthrough at full opacity through an empty
TOUCHABLE_INSETS_REGION(avoids AOSP's 0.8-alpha clamp onFLAG_NOT_TOUCHABLE). - TextureView output with a Vulkan swapchain composition path on top of a CPU-blit fallback.
- Rotation- and immersive-mode-aware overlay placement and re-layout.
Pacing
- Vsync alignment with configurable slack and per-slot budget.
- Pacing presets, manual target FPS cap, queue depth, EMA jitter smoothing, outlier rejection.
- Frame graph HUD with
real X fps / total Y fpscounter and frame-time graph.
UX
- First-launch tutorial — multi-step walkthrough covering Accessibility setup (LSFG Touch Passthrough service, Restricted-Settings unblock for sideloaded apps on Android 13+) and the in-game overlay menu.
- In-game settings drawer with two entry modes (icon-button or edge-swipe) and four selectable edges.
- Automatic per-app overlay — pick target apps and the overlay arms when one comes to the foreground.
- Draggable launcher dot with edge snapping.
- Crash reporter capturing both Java/Kotlin uncaught exceptions and native signals (SIGSEGV, SIGABRT, …) with stack-walking and a one-tap share intent.
Capture sources
- MediaProjection — default visible video path, consent prompt every session.
- Shizuku metrics mode — privileged target-UID-filtered timing-only side channel for pacing diagnostics. Shizuku buffers are never made visible.
Requirements
- Android 10+ (
minSdk=29, tested up to Android 15 /targetSdk=35). - arm64-v8a device (x86_64 build is emulator-only).
- Vulkan 1.2+ with
VK_ANDROID_external_memory_android_hardware_buffer,VK_KHR_external_memory,VK_KHR_sampler_ycbcr_conversion. VK_EXT_robustness2required for full frame generation (Adreno 7xx-class and newer). Without it the app falls back to capture-only mirror mode.VK_EXT_queue_family_foreignrecommended; falls back toVK_QUEUE_FAMILY_EXTERNALwhen absent.
Setup
- Sideload the APK (
adb install app-release.apkor open the file on-device). - On first launch, follow the in-app tutorial to grant Display over other apps, Notifications, optionally enable the LSFG Touch Passthrough accessibility service, and unblock Restricted Settings if Android 13+ asks.
- Provide your own legitimately purchased
Lossless.dllvia the Storage Access Framework — the app extracts the SPIR-V shaders on-device and deletes the DLL copy.Lossless.dllis not bundled, downloaded, or distributed by this project. - Pick the target app, start the session, accept the MediaProjection consent prompt.
Known limitations
- ~50–80 ms added latency vs. the Linux Vulkan layer — a platform constraint of MediaProjection, not a bug.
- MediaProjection consent every session and a persistent system indicator are mandated by the OS.
- Not Play Store distributable — the
SYSTEM_ALERT_WINDOW+ screen capture +AccessibilityServicecombination violates Play policy by design. - Capture-only fallback on devices missing
VK_EXT_robustness2(older Adreno, most Mali).
Work in progress (scaffolding only in this release)
The following pipelines have native scaffolding in the tree but their UI is hidden and they are not yet wired up end-to-end:
- NPU post-processing presets via NNAPI (sharpen, detail boost, chroma clean, game crisp).
- GPU post-processing / upscaling stage.
- CPU enhancement kernels (LUT, vibrance, saturation, vignette).
- Zero-copy AHB-to-AHB output path replacing the CPU-blit fallback.
Credits
- PancakeTAS and the lsfg-vk contributors — original Vulkan frame-generation layer, the entire backbone of this port.
- THS / Lossless Scaling — original authors of the Lossless Scaling shaders.
- FrankBarretta — Android port.
Third-party libraries: volk, pe-parse, DXVK's dxbc translator, Shizuku.
License
The app is released under a Custom License — No Play Store, No Commercial Use (see LSFG-Android-Application/LICENSE). Personal non-commercial use, modification, and non-commercial sideload redistribution permitted with attribution. The bundled lsfg-vk-android submodule is MIT.