GammaOS Next Changelog - TheGammaSqueeze/GammaOSNext GitHub Wiki
A stability and compatibility release focused on lock screen reliability, Nano boot improvements, and input fixes.
- Lock screen unlock loop on software keymaster devices (e.g. AYANEO Pocket AIR Mini): entering the correct PIN/password/pattern crashed SystemUI in a loop instead of unlocking. Root cause was the HIDL Keymaster 4.0 compat layer rejecting auth tokens for SID-bound synthetic password keys. The SP protector key now skips auth-binding when the keymaster security level is SOFTWARE - the inner credential-derived encryption layer still protects the blob. Devices with hardware-backed keymaster/KeyMint are unaffected.
-
GammaPad grabbed the touchscreen when no controller was defined, leaving the user with only a mouse cursor and no touch input. When
persist.gammaos.gamepad.deviceswas empty,shouldGrabDevice()returned true for all devices, bypassing gamepad capability checks. Now returns false so only devices passing the standard stick-axes + gamepad-button checks are grabbed. -
locksettings verifycrashed in Nano minimal boot with a NullPointerException on TrustManager and DevicePolicyManager. Added null guards inLockPatternUtils.reportSuccessful/FailedPasswordAttempt(). - Libretro Quick Resume preview broken for zip ROMs, CE storage race on early boot, and RZIP save state format not recognised.
- SensorService crash-loop on Nano boot from residual boot timing log calls.
-
Nano CE auto-unlock: when a PIN/password/pattern is set in normal Android, the credential is cached in DE storage. On Nano boot, a new
nano-ce-unlockservice reads it and verifies against LockSettingsService, unlocking CE storage so game saves and ROM data are accessible without the Android lock screen. - Boot animation with 60 fps fade-in/out and XP-style loading bar.
-
Rockchip DP and HDMI audio output: auto-detects Rockchip boards via
ro.hardwareand registers external audio devices on hotplug. DP over USB-C registers as SPDIF (matching the vendor HAL's internal mapping of therockchipdp0card), HDMI registers as DEVICE_OUT_HDMI (for boards with therockchiphdmicard via DTBO). Preferred routing: HDMI > DP > speaker, with independent hotplug tracking and automatic fallback to speakers on disconnect.
-
WiFi unable to connect on Rockchip devices:
customization.shkilledtee-supplicanton every boot, breaking the OPTEE-backed KeyMint HAL. Allkeystore2key generation calls hung indefinitely, preventing WPA authentication. Removed thetee-supplicantkill so the TEE stays available for cryptographic operations. -
logcat permanently broken and app launches delayed on Pocket AIR Mini (GApps build only): logd's reader thread called
waitForService("logcat")when a privileged Google Play Services process connected to the log socket, deadlockinglogd_lockand blocking all future log reads plus any code path that writes to logd. Fixed by startingLogcatManagerServicein the Nano minimal boot path so the binder endpoint is available immediately.
This is a milestone release: a brand-new boot-to-game experience called GammaOS Nano, a full in-place OTA update system, a native gamepad daemon that replaces the older input plumbing, a Settings Toolbox that finally exposes GammaOS's hidden persist.gammaos.* knobs to end users, and a mountain of stability and boot-speed wins underneath.
First device release: Anbernic RG Vita Pro. This is the first handheld to ship with GammaOS Next v1.3.0 and the first device to get a factory overclock baked into the build: A72 big cluster raised from 2208 to 2304 MHz, Mali-G52 GPU from 900 to 1100 MHz, A53 voltage retuned for higher sustained clocks under thermal load, delivering up to +33.6% sustained throughput on hot runs. The Vita Pro has no active cooling, so a small aftermarket heatsink is recommended to hold those clocks for longer.
New: GammaOS Nano - instant boot to games
Big picture: handhelds spend tens of seconds booting a full Android stack you never interact with. Nano carves out a native, minimal boot path so you power on and see your game or XMB menu within a few seconds, then the rest of Android quietly comes up in the background.
-
Added - Minimal Android runtime (
sys.gammaos.minimal_boot=1): skips ~120 non-essential SystemServer services (print, NFC, TV, MIDI, WebView preload, dreams, wallpaper manager, secondary zygote preload, etc.) and parallelises zygote startup. On RG DS this cuts cold boot from ~168 s to ~27 s tosys.boot_completed, with SystemServer‑to‑RetroArch in about 1.6 s. -
Added - PS3/PSP-style XMB menu rendered natively (FreeType glyphs, mixed text/emoji batching, flowing-wave background, stick navigation, hold-to-repeat with 350 ms initial / 45 ms steady, black-outlined text). The whole engine is split across seven focused TUs (
NanoMenu*.cpp) instead of one 9 000-line file. -
Added - Columns you actually use: Recently Played parses RetroArch
content_history.lpl; a search column with a 5x10 OSK; Applications column backed by a SystemServer-generated label cache; a pinned Settings column (leftmost) with Wi-Fi and Bluetooth full-screen overlays. -
Added - Native libretro runner:
LibretroRunner.cppdlopens a core.sodirectly into the Nano EGL context before zygote even starts. You see a playable game preview around T+3 s, then hand off seamlessly to full RetroArch when the framework is ready. -
Added - Native Drastic runner (
drastic-nano): standalone init service that runs DraStic with real audio using its actual/data/user/0/com.dsemu.drasticdata directory. Drops first DS frame at T+1.5 s (down from 15 s) via in-memory patches that skip the blockingslCreateEngineaudio init and fix the BG-layer rendering bug. Includes touch/stylus input (realgt9xx-0node, DS 256x192 scaling), correct button slots after reverse-engineering DraStic's keymap, stick-as-DPad layering, overlay menu with runtime shader switching, and dual-DSI Frame Sync for phase-aligned panels. -
Added - Dedicated
drastic-android-modAPK (six smali patches) replaces stock r2.6.0.4a: ESC saves to slot 9 andfinishAffinity(), autosave on any exit, A/B remap, detail-panel ENTER bypass. Means closing the game never loses progress, Quick Resume always has a fresh state, and controller navigation works throughout the app. - Added - DRM direct-output path: while Nano owns DRM master, NEON-blitted AHB buffers with DRM PRIME zero-copy scan directly to the panel. Per-frame flip work drops from 3 ms to 150 us; triple-buffer AHB ring with per-slot EGL fences kills microhitches; per-CRTC page-flip pacing cuts secondary-display EBUSY noise from 76/min to 1/min. Result: a buttery 60 fps XMB and Quick Resume preview even on thermally-constrained handhelds.
-
Added - Quick Resume that survives reboots:
persist.gammaos.nano.qr_preparedis primed at launch (before any reboot), cleared on clean exit, and FUSE-mount-gated (isQrRomStorageReady) so external-SD ROMs never fail to resolve. Applies only to Drastic + RetroArch launches; Boot Android / Recovery / Safe Mode / XMB apps all clear it so you never auto-resume a stale game. - Added - Quick Resume preview controls: during the live Quick Resume preview, short-press BACK hides the "Quick Resuming..." overlay text so you can keep playing on the preview with no visual clutter, and long-press BACK (3 seconds) exits the game and returns to the Nano menu. All other buttons (including SELECT) are forwarded to the game as normal input.
-
Added - Quick Resume toggle (R1): pressing R1 inside the Nano menu toggles Quick Resume on/off, with a green/red dot indicator and "Quick Resume" label in the top-right corner of both menu layouts. State persists via
persist.gammaos.nano.quick_resume. -
Added - Menu-layout toggle (L1): inside Nano, pressing L1 toggles between the XMB layout (PlayStation-style cross-media bar with columns, settings overlays, and battery/time/WiFi/BT HUDs) and a simpler List layout. Choice is remembered across reboots via
persist.gammaos.nano.xmb_mode. - Added - Multi-path ROM scanner with case-insensitive folder matching across internal + SD storage, async threaded scans, SELECT manual refresh, 30 s background re-scan, and a 60 s post-boot grace + path-count guard so a late-mounting SD card cannot wipe your library.
-
Added - Per-display wallpaper split (nano renders wallpaper only on secondaries, XMB only on your chosen primary via
persist.gammaos.nano.primary_display) plusdrm_flip_h/_vprops to correct mirror-mounted panels. -
Added - Battery + time + Wi-Fi + Bluetooth HUD at 0.5 Hz, brightness/volume HUDs driven through real AudioService (so
volume_music_speakeractually persists), and a full Power menu (Sleep / Shutdown / Boot Android / Recovery / Safe Mode / Boot Nano) with inline brightness slider. -
Added - Wi-Fi and Bluetooth in minimal boot via opt-in
persist.gammaos.nano.wifi=1: agammaos-netroot helper bridges Wi-Fi/BT calls, auto-confirms SSP/PIN pairing, retries failed LE/BR-EDR on the opposite transport, and survives staleopPackageNamevia an AVRCP absolute-volume fallback. -
Added - SensorService started unconditionally in minimal boot so SDL emulators (PPSSPP, vita3k) no longer hang on
ASensorManager_getInstance. -
Added - DE cache quick-resume: ROMs, cores, configs and saves copied to
/data/system/nano_cache/and accessed directly (no bind-mounts), with delta-sync and ROM-mismatch guard so re-launches stay snappy. -
Added - Native libretro + Vulkan shader chains for RetroArch
.glslp/.slangppresets (26/116 CRT and 36/80 handheld LCD shaders compile natively), plus a custom Vulkan-GLSL-to-SkSL transpiler for multi-pass chains with#pragma parameter, LUTs, and loop conversion.
-
No more black screen in normal boot when Nano's DRM takeover races SurfaceFlinger:
StartPropertySetThreadnow waits for persist-props readiness and only startsgammaos-nanowhen the skip-nano flag is clear. -
No more SystemServer crash on game launch: added an
sNanoLaunchInProgressre-entry guard soforceStopPackagecannot recurse intostartHomeOnTaskDisplayAreaand blow the stack. -
No more 20 s hang on game launch: the synchronous
setclock_max.shCPU-pinning script now runs in the background. -
Lost controllers after hotplug fixed: tighter
IN_DELETEmatching plus a 1 Hz defensive sweep re-enumerates/dev/input/event*so a disconnected Xbox pad never stays gone. - No more orphan emulator processes hogging an RT CPU core after you exit a game.
-
Input bleed-through blocked via a timestamp fence on
InputDispatcherplus a boolean gate cleared only on true focus entry. -
Quick Resume reliability: survives power-menu reboots, no longer reads stale props, handles legacy XMB cache format, and clears
qr_preparedwhen you exit back to Nano. - Dozens of smaller Nano fixes: XMB icons clipped in HWC mode, QR text collapsed to origin in HWC, overlay VBO leak ("Quick Resuming..." missing on dual screens), loading screen upside down in DRM, half-speed libretro preview, drastic forced-tall desync after exit+re-entry,
LockSettingsServiceNPE loop, wallpaper persistence, FX shader stutter on low-precision GPUs, orphaned bootanim frames rendering over the Nano menu, and more.
New: GammaOS OTA - in-place updates, no recovery hop
Big picture: old-school OTAs reboot into recovery, sideload a zip, verify, then reboot. GammaOS OTA flashes the full system image in place, on the running device, with a full-screen progress UI and no trip through recovery. Optimised for small-RAM handhelds that cannot buffer a full system verification.
-
Added -
gammaos-otanative binary with EGL/GLES2 UI, FreeType text, gamepad/keyboard/touch input, and a file-picker for manual package selection. SurfaceFlinger is kept alive throughout the flash so you always see progress. -
Added - Direct block-device writes to RO-mounted partitions, with a tmpfs bind-mount over
/system/binand/system/lib64to avoid page-cache conflicts, and a decompress-to-/data-then-stream strategy for low-RAM safety. -
Added - Logical partition (super) flash end-to-end: authoritative extents via
liblp ReadMetadata, pre-resize cache before framework stop,dmctl replaceto reload the dm-linear table without the DM read-only flag, tmpfs staging at/data/gammaos-ota-stage. -
Added - Low-RAM-safe flashing: vendor bind-mount, triple
drop_cacheson framework stop, periodic flush every 256 MB during writes. Verified on 1 GB devices. -
Added -
O_DIRECTSHA-256 readback verification with a smart skip for mounted logical partitions so 3.7 GB system readbacks never trigger an OOM kernel panic. -
Added - Full/Lite variant routing:
ro.gammaos.variant(lowercasefull/lite) is slotted into the manifest URL (https://ota.gammaos.sh/api/v1/{device}/{variant}).tdgsi_arm64_abno longer leaks into URLs. -
Added - Dedicated compatibility check: OTAs now validate against
ro.gammaos.build.version(1.3.0) instead ofro.lineage.build.version(21.0), with>=comparison so point releases install cleanly. -
Added -
gen_ota_package.shpackaging script with parallel XZ compression, SHA-256 hashing, widened partition list (system_dlkm,vendor_dlkm,odm_dlkm,vendor_boot,vbmeta_system,vbmeta_vendor), and build-time minimum-battery gating. -
Added - Updater hand-off polish: the in-app progress dialog stays visible until
gammaos-ota's fullscreen overlay renders, so there is no perceptible blank window between the two. -
Added - Dedicated
gammaosotaSELinux domain (mirrored to 34.0 and 202404 prebuilts).
- Display-version truncation in build strings (
GammaOS Next Lite v1.3.0now survives Make's whitespace splitting). - A/B fallback tries both slots with
blockdev --setrwfor physical partitions. - Correct partition index passed through to UI so progress bars match the partition actually being written.
- Unreliable per-SoC battery sysfs removed from runtime - minimum battery is enforced at package-build time instead.
New: GammaPad - native gamepad daemon with full UI
Big picture: gamepads on Android have never been great - partial
.klmappings, missing per-app profiles, broken triggers, no combo keys, clunky mouse mode, no calibration. GammaPad replaces the whole stack with a native daemon that exclusively grabs physical pads, merges them into a single clean virtual device, and exposes everything in Settings with a live input tester.
-
Added - Native daemon (
frameworks/native/services/gammapad/) thatEVIOCGRABs physical pads, runs.klparsing with heuristic fallback, does per-axis calibration with circular deadzones and inversion, supports axis-to-button triggers with hysteresis, bidirectional analog/DPAD conversion, virtual/passthrough blacklists, and forwards force feedback. Config hot-reloads viaconfig_versionbump - you never need to re-plug. - Added - Full Settings UI with live input tester, multi-step calibration wizard, remap dialog with physical-input detection, activity picker for the Launch Activity action, and per-app profile management with an icon-based picker.
- Added - Button combo mapping (Select+Start etc.) and per-app profiles tracked via TaskStackListener on a 300 ms foreground re-check.
-
Added - Mouse mode you can actually use: virtual multi-touch (Protocol B, slot cap at 1 for reliable drag), 1:1 cursor-follow, framework acceleration skipped, cursor-fade prevented, coexisting hover + virtual touch, configurable scroll speed, Select+R1 hold toggle, per-display orientation via
primary_touch_orientation. -
Added - Hides physical device nodes while captured (default on). Your gamepad disappears from
/dev/input/entirely while the daemon has it, with state-file-based crash recovery and agammapad_restorebinary for clean shutdown. - Added - Circle-to-square stick expansion (so ±32767 is reachable at diagonals on square-gate sticks) and per-device preset normalisation (so Xbox BT PID 0x0b13 and other PIDs both land on the layout SDL/GameMaker expects).
-
Added - Direct force-feedback output mode that writes
FF_RUMBLEstraight to the kernel device (e.g.sc27xx:vibrator), bypassing the 25 ms binder IPC. - Added - "Launch Activity" button action (ordinal 12) - bind any hardware key to any app/activity, selected via an activity picker with search.
- Added - Screen Mapping: on-screen overlay editor that maps gamepad buttons, sticks, and DPAD to multi-touch, per-app, with radial selector, per-button colours, bounding-box resize, pinch-zoom, tap-to-delete, smart non-overlap placement, opacity slider, QS tile toggle + long-press editor, and 25-language translations.
- Added - Controller calibration moved into SetupWizard as a 5-step inline flow with right-stick auto-detection on every motion event, so you are not fighting controls before the device is even set up.
- Added - 65 locales of translations covering GammaPad, JoystickLedPicker effect labels, combo/per-app strings, and every new UI string.
- Right-stick axes now always use full signed 16-bit normalisation regardless of
.klremapping (stopping half-range right-stick output). - Bipolar stick normalisation correctly applied when GAS/BRAKE triggers are present but RX/RY sticks are not.
- KEY_UP/DOWN/LEFT/RIGHT correctly converted to
ABS_HAT0X/Yon devices that expose DPAD as keys but no hat axes. - Vibration double-scaling eliminated; calibration deadzone slider now 0-50 % instead of raw 0-8192 with correct display alignment.
- Remap dialog no longer dismisses on BACK (captures both down + up events for non-touchscreen keys); HOME capture works via
sys.gammaos.gamepad.capture_mode. - Mouse-mode cursor lands correctly on rotated displays (pre-applies inverse rotation before InputFlinger's ROT_270).
- Short + long HOME press in RetroArch now sends ESC, mirroring BACK behaviour.
New: Settings, UX & platform features
-
Added - GammaOS Toolbox in Settings: surfaces 147
persist.gammaos.*knobs grouped by Display, BFI, CRT Shader, Dual-Stack, External Display, Multi-Display, IME, Audio, Gamepad, RGB LED, Launch Guard, System, Power, RetroArch, and USB/Docking. Type-appropriate Switch / List / EditText controls, a clear "advanced users" banner, and 58-locale translations. Why it matters: hundreds of hidden tuning knobs are finally visible withoutsetprop. -
Added - Lite / Full variant tag baked into
PRODUCT_MODELand the display version string (GammaOS Next Full v1.3.0/GammaOS Next Lite v1.3.0), so it's obvious at a glance which build you are running and OTAs route to the right variant. -
Added - Display settings gained Reading Mode (via LineageHardwareManager
FEATURE_READING_ENHANCEMENT), Color Calibration (RGB+saturation seekbars through LiveDisplayManager), and Custom Resolution (viaIWindowManager.setForcedDisplaySize). - Added - DPAD / gamepad navigation across Settings homepage (focus-stealing removed, auto-collapse of the toolbar on DPAD input) and Quick Settings (full navigability with auto-expand from QQS, focus initiation, page-boundary navigation, dark-orange focus indicators, no escape to footer actions). Why it matters: handhelds without touchscreens can now fully operate Settings and QS.
-
Added - Phone-taskbar gating via
persist.gammaos.taskbar.phonewith a real-time toggle, so form factors that need the taskbar off can kill it without a reboot. -
Added - QS tile blacklist (
persist.gammaos.qs.blacklist, comma-separated with_0.._4fragments) filters both the legacy QSTileHost and newUserTileSpecRepository` pipelines. Per-device QS layouts without forking SystemUI. - Added - Lockscreen disabled by default for a console-like power-on experience; users still opt-in via Settings → Security.
-
Added -
adbdalways root from boot with no Developer Options toggle required. - Changed - PRODUCT_MODEL rebranded from "TrebleDroid with GApps" / "TrebleDroid vanilla" to "GammaOS Next Full" / "GammaOS Next Lite".
-
Changed - Daijisho bumped to 1.8.1 (426 split APKs) so Play signature and future updates persist; PPSSPP to 1.20.3 (official signed); DraStic config refreshed (DefaultLayout=1, RotationMode=0, ExtDisplayBorder=5, LC_2.dat, per-game Pokemon DP layout);
setup.shauto-grants RECORD_AUDIO + BLUETOOTH_CONNECT to DraStic on first boot. - Changed - Translations expanded across LineageParts, Settings, frameworks/base, SetupWizard and all custom GammaOS apps (25-65 locales).
-
7-second SurfaceFlinger boot stall rooted out:
getBootDisplayModeSupport()(a synchronous binder on the SF main thread) is deferred to lazy init, andEventThreadreplays hotplug events for late-registering clients. DisplayManagerServiceonBootPhasedrops from 6636 ms to 111 ms; PackageManagerService starts 6.2 s earlier. -
MediaTek HWC BliterNode crash on boot mitigated via a time-limited
debug.sf.disable_hwc_overlaysworkaround scoped to affected SoCs (mt6761-mt6785, mt8766-mt8768). Starts as a 10 s window, extends untilpersist.gammaos.setupwizard_run=0and provisioned, then another 10 s grace. Earlier permanent-latch version replaced. -
Bluetooth LE pairing fix for MediaTek controllers with a broken Supported Commands bitmask (byte 37=0x00 falsely reporting no LE extended support). Uses LE-features bit 12 as fallback detection; synthesises
CommandStatusfromCommandComplete; legacyLE_CREATE_CONNECTIONfallback with scan-disable + direct peer addressing. -
Bluetooth crash loop on malformed HCI responses (MT6785 especially) fixed by dropping a redundant ASSERT that fired before the existing
IsValid()guard. -
hwcomposerrotation crashes tamed withpersist.gammaos.rotation_cooldown(opt-in), SF skipping 5 HWC frames on orientation change, a 2 s GPU-only window, and a 1.5 s WMS rotation cooldown. -
STREAM_MUSIC volume now persists across reboots: the multi-display volume controller seeds FROM the authoritative global stream on boot instead of overwriting it;
FLAG_FROM_KEY/SHOW_UIgates removed socmd audioand programmatic sets stay in sync with UI. -
Timezone selection now applies when Settings is launched from a third-party launcher (Daijisho etc.) - picker fragments call
TimeZoneDetectorbeforefinish(). -
APEX signing details cached across boots at
/data/system/apex_sig_cache.bin. PMS scan 1.8 s → 1.6 s, PMS ready ~300 ms earlier. - KPOC (offline charging) backlight now controlled via the AIDL/HIDL Light HAL on MediaTek SoCs, with a prime-to-nonzero hack so the subsequent set-to-0 is honoured. Power-press re-enables BLED.
-
Tablet/taskbar mode no longer leaks into gesture and 2-button nav (
shouldCreateNavBarAndTaskBargated on 3-button mode; TrebuchetisTaskBarEnabledgated onisTablet; live recheck on mode change). -
SetupWizard recovery page removed; right-stick preview runs on every motion event so it works before calibration; button clipping fixed in immersive mode;
FLAG_KEEP_SCREEN_ONadded throughout. -
GammaEQ stopped hammering property_service from the audio mix loop: atomic cache collapses redundant writes; self-heal throttled to 100 ms via a
thread_localtimestamp. Audioserver CPU drops from ~25 % to near-zero per mix buffer. -
Build fingerprint shortened to fit
PROP_VALUE_MAX(91 chars) so apps reading__system_property_get(e.g. Prince of Persia) stop crashing. -
SideFpsEventHandlernull-checksFingerprintManagerbefore use (stops system_server crashing on devices that reportFEATURE_FINGERPRINTwithout a HAL/service). -
RenderEngineretries EGL init when GPU drivers aren't ready at boot. -
Non-blocking
rw-system.shviarw_system_earlyservice (saves ~2 s); duplicatevndk-detectexec removed. Total boot on AYANEO Pocket AIR Mini (MT6785) cut from ~31.5 s to ~24.6 s. -
3 GB low-RAM optimisation: build-time removal of DeskClock, PrintSpooler, PrintRecommendationService, ManagedProvisioning, DeviceAsWebcam, StatementService, CalendarProvider, AudioFX. Cached-process kill grace 600 s → 0 s.
phh-on-boot.shdisables APEX bloat on first boot. 60 s compaction loop pushes cold pages to ZRAM. Vendor build.prop tuned (heapgrowthlimit=96m,heapsize=192m, PSI-based LMK). Idle RAM drops from 1200 MB to 800 MB. - SELinux: property contexts added for
sys.gammaos.*,ro.gammaos.*,sys.gamma_tweak_update; broadappdomaingrants to GammaEQ/speaker-route props; 34.0 and 202404 prebuilts synced; newgammaosotadomain;gammaossetupwizard.teadded;gammaoscustomization.teupdated.
A DualStack-centric release. DualStack goes from a foundational feature to a real dual-screen gaming UX with per-screen controls, plus new Launch Guard and Secondary Display Launch tiles for the handhelds with two panels.
New features
Why this matters: dual-screen handhelds (RG DS, DS-style devices) need per-screen volume, per-screen brightness, and IME routing to feel like real two-screen consoles instead of one stretched Android display.
-
Added - Per-screen volume control (#140). New
GammaMultiDisplayVolumeDialog,GammaMultiVolumeStore, AudioService + PlaybackActivityMonitor hooks, WindowManager APIs - each display holds its own media volume while DualStack is active. -
Added - Per-screen brightness adjustment (#141). New
GammaSplitBrightnessTile, per-physical-displayLocalDisplayAdapter, brightness strategy selector honours the split. - Added - Force IME to a specific screen (#189). InputMethodManagerService, DisplayContent, and WindowManagerService route IME windows to the configured display.
- Added - Hide SystemUI during DualStack (#216). Toggle in the DualStackControl app for clean in-game blanking.
- Added - Full clean kill of background processes on DualStack launch (#170 / #194). Tears down every non-whitelisted process at DualStack app start, with an expanded sweep covering both displays.
- Added - RetroArch clean-exit handshake on DualStack launch (#172). Prevents orphan emulator instances.
- Added - DualStack apps run at top priority (#173). Per-process priority/scheduling boost on the active DualStack app.
-
Added - Multi-prop whitelist (#214).
persist.gammaos.dualstack.pkgsnow supports numbered continuation (_1,_2, ...), so the allowlist can exceed a single property's length limit.
Why this matters: handhelds accidentally launching Google apps or vendor junk on a secondary display was a recurring annoyance. Launch Guard blocks unwanted launches; Secondary Display Routing pins specific apps to the secondary panel on purpose.
-
Added - Launch Guard app + Secondary Display Control app (#212) - two new standalone platform-signed apps (
com.gammaos.launchguardcontrol,com.gammaos.secondarydisplaycontrol) with full layouts, shared per-app row UI, and companion SystemUI QS tiles (LaunchGuardTile,SecondaryDisplayAppsTile). - Added - Secondary Display state QS tile (#209) to toggle the secondary display on/off directly from Quick Settings.
-
Added - Secondary-display default app picker in Settings → Apps (#206) with
SecondaryHomePicker/SecondaryHomePreferenceControllerand auto-launch on the secondary display. -
Added - Multi-prop whitelist for Launch Guard and Secondary Display Routing (#215) using the same
_1/_2/... continuation scheme.
-
Added - Android TV build target (
AndroidProducts.mkentries + per-variantlineage_tv_a64_*makefiles + rewrittengenerate.sh) so every existing flavour has a TV counterpart. - Added - GCore+ (Core+) initial A14 patches for older-SoC devices: device/google/atv product definitions, TV framework overlay tweaks, SDK excluded-core-hardware permission list, phh Treble TV overrides for A14.
-
Added -
sys.gammaos.usb.connectedprop derived from the stickyACTION_USB_STATEintent (OR of device and host) for cleaner USB-aware behaviour. - Added - Background-process limit prop for RG DS (#169).
-
Added -
/storagetraversable for any app (#149) -init.rc+ vold patched so any app can list/storagewithout hitting the zygote mount-namespace restriction. -
Added - New CRT/LCD shader pipeline: new
GammaLcdShaderSkia filter, rewrittenGammaCrtSimpleandGammaLcd3x, ShaderControl UI vastly expanded. - Added - Apache License 2.0 at the repository root.
Changes
- GammaShader performance optimisations across the system-wide pipeline.
- DualStack stability + scheduling pass (#177): DisplayManagerService, DualStackController, RootWindowContainer and WindowManagerService reworked so stale processes are reaped consistently and the DualStack transition is idempotent. Net −700 lines of code in DualStackController.
-
"Display over apps" restriction disabled (#182) - Settings
Utils.javareturns the relaxed result for the gate.
Bug fixes
- SystemUI aspect-ratio in DualStack (#139) - no more stretched/squashed UI when the stack layout changes.
-
GammaEQ audio-preview delay (#210) - MainActivity reworked,
preview.mp3replaced with a largerpreview_fast.wav, follow-up stability pass on the preview-playback race. - Recents previews + Recents-not-showing-on-trigger fixes across NavigationBarControllerImpl, TaskbarActivityContext, AbsSwipeUpHandler, OverviewCommandHelper, TaskViewSimulator, RecentsView.
- Trebuchet taskbar alignment/sizing (#207).
- Disabling the secondary display no longer blanks the primary (#208).
-
SyncThing access to restricted directories (#142) - StorageManagerService + vold
Utils.cpp/EmulatedVolume.cpp/PublicVolume.cppwhitelist it against the restricted-dir check. -
GCore+ stability + unwanted lockscreen fix -
StatusBarStateControllerImpl/KeyguardStateControllerImplsuppress the lockscreen path when the NoKeyguard TV overlay is active. - 120 Hz / 60 Hz work-in-progress commit plus MediaTek offline-charging groundwork lays the foundation for the stability wins in v1.3.
A short release focused on the D8300 display pipeline plus a Magisk refresh.
New features
- Added - Half-4K external display flag. DisplayManagerService can mark an external display as forced half-4K and reapply the forced size with retries on hotplug, with a generation counter so a late retry never stomps a freshly re-attached display. Source modes at or above 3840x2160 are halved; non-4K sources are untouched.
-
Added - D8300 120 Hz vsync / BFI enforcement. On refresh-lock toggle, SurfaceFlinger resyncs to real hardware VSYNC, reapplies phase config, disables synthetic VSYNC, clears layer history, requests a full-damage repaint, and forces the pipeline hot so Black Frame Insertion stays stable.
ro.surface_flinger.primary_display_orientationis now always honoured over vendor-reported orientation.
Changes
-
persist.gammaos.refresh.lockhardening: scheduler-side refresh-rate heuristics suppressed while locked, RefreshRatePolicy holds the locked rate across windowing changes, VsyncModulator cannot silently drop cadence to ~60 Hz on a 120 Hz panel. -
Magisk updated (both
magisk.tar.gzandmagisk2.tar.gz). - Trebuchet all-apps drawer column/row math fixed for 1:1 aspect-ratio panels.
Bug fixes
- D8300 hotplug races on both Audio and Display: DisplayManagerService, ActivityTaskManagerService, DisplayAreaPolicy, DisplayContent, RootWindowContainer, and the Performance QS tile hardened so same-cycle plug/unplug no longer leaves the window hierarchy bound to a stale display.
-
GammaEQ speaker-route flag stuck at 0 after hotplug -
sys.gammaeq.route.spkcan now only be cleared by mixer-style output threads (MIXER / DUPLICATING / SPATIALIZER / BIT_PERFECT); any output thread may assert "1" whenever speaker is in the output device set. Stops GammaEQ going silent on speaker until reboot when a transient DIRECT/OFFLOAD thread lost a race with the mixer thread during headphone unplug.
A major feature-expansion release: the first cut of DualStack for multi-display handhelds, a system-wide shader pipeline (GammaShader), a Black Frame Insertion (GammaBFI) engine for motion clarity, GammaRGB rewritten as an in-process framework sampler, an audio EQ (GammaEQ), and a long list of UI, orientation, HDMI, and taskbar improvements from the v1.0→v1.2 development cycle.
New: DualStack - initial multi-display emulation framework
Why this matters: dual-screen handhelds are powerful but painful on stock Android - everything assumes one display. DualStack gives apps a real second SystemUI, per-app resolution targeting, and lifecycle management for the second screen.
-
Added -
DualStackController(~640 LoC) plus hooks in DisplayManagerService, DisplayContent, DisplayRotation, ActivityTaskManagerService, RootWindowContainer, WindowManagerService and StorageManager - the foundation for running two independent app stacks, one per display. - Added - DualStackControl user-facing app and a DualStack Quick Settings configuration tile.
- Added - Per-app resolution enhancement path for DualStack via ActivityRecord override.
-
Added - RetroArch secondary-display override (
GammaDualFocusTile, ActivityStarter + RootWindowContainer mods). - Added - Secondary-screen application lifecycle management (start options, pause/resume, finish semantics).
- Added - Secondary-screen live wallpaper support (WallpaperManagerService + SecondaryDisplayLauncher).
-
Added - Secondary-display launcher override prop (
persist.gammaos.secondary_home). -
Added - Per-display rotation + per-device touch→display mapping via runtime props (
persist.gsf.rot.<displayId>,persist.gsf.sec_rot,persist.gif.map.<device>,persist.gif.map.uid.<device>,persist.gif.map.port.<device>,persist.gif.rot.<device>). - Added - Unique display names so ES-DE and similar apps can target "the other" display by name.
New: GammaShader - system-wide post-processing
Why this matters: retro and emulator fans want CRT masks, LCD grids, and scanline effects across the whole UI, not just inside RetroArch. GammaShader hooks Skia's
SkRuntimeEffectinto SurfaceFlinger's RenderEngine so everything on screen gets the same look.
- Added - CRT-Simple Skia filter (with optional blur and a WIP border-blur effect).
- Added - LCD3x pixel-grid shader.
- Added - Dedicated ShaderControl app and GammaShader QS tile for picking and tuning effects.
- Changed - Multiple passes of GPU-cost optimisations; CRT-Simple decoupled from the old BFI+CTM coupling so shaders and BFI can be enabled independently.
New: GammaBFI - Black Frame Insertion for motion clarity
Why this matters: LCD sample-and-hold blur is brutal on fast-scrolling retro games. BFI inserts black frames between rendered frames so moving pixels look sharp, at the cost of some brightness. GammaBFI implements it two ways so it works everywhere, and pairs with a hard 120 Hz lock so the display never drops to 60 Hz and breaks the effect.
- Added - Present-aligned BFI (CTM mode, default) via per-frame HWC Color Transform blackout.
- Added - RenderEngine fallback (RE mode) via Skia black-replace for HWCs that dislike CTM.
-
Added - Global 120 Hz refresh lock (
persist.gammaos.refresh.lock=1) that ignores per-layersetFrameRate()votes, pins min=max=highest Hz in the DisplayModeDirector, and no-ops the idle/kernel refresh-rate timers. Apps and animations can no longer drag the panel down to 60. -
Added - Cadence presets (
persist.gammaos.bfi.preset = 120:60 | 180:60 | 240:120 | 240:60) and arbitrary insertion patterns viapersist.gammaos.bfi.pattern, withpersist.gammaos.bfi.debugfor diagnostics. -
Added - Polarity-change scheduling to avoid long-term panel burn-in;
persist.gammaos.bfi.black_floor 0.01for vendors that can't drive literal-zero blacks. - Added - Global BFI QS tile and Global Refresh Rate QS tile.
- BFI no longer flickers when a background blur is active (dialogs, wallpaper picker).
- Screen no longer goes permanently black on disable - clean fallback to the last content frame.
- Hardened BFI behaviour across SystemUI dialogs and overlays, including polarity-change flutter reduction.
- VSync enforcement regressions across non-BFI builds guarded behind additional
persist.gammaos.*props so default behaviour is unchanged.
New: GammaRGB - in-process LED colour sync
Why this matters: devices with RGB LEDs (analog sticks, case accents) look way better when the LEDs sample on-screen colour live. The old version was an out-of-tree C binary that drifted from Android's brightness slider and raced the GPU. The rewrite runs inside SurfaceFlinger and just works.
-
Added -
GammaRgbSamplerported into frameworks under SurfaceFlinger, replacing the standalone C sampler with an in-process implementation hooked directly into composition. - Added - Manual colour mode + split left/right colour support.
- Added - Fade transitions between sampled RGB values (smooths stepping at lower sample rates).
- Added - Brightness sync via the user brightness prop instead of sysfs, so LED intensity tracks the Android brightness slider precisely.
- Added - Persistent primary hex colour so your last manual colour survives reboot.
-
Added - Dedicated JoystickLedPicker app (
com.gammaos.joystickled) with a colour-wheel UI and custom-effects support. - Added - GammaRGB QS tile alongside Immersive Mode, External Docking, External Mirror, and External Resize tiles.
- Changed - Sampler pauses while the device is asleep or otherwise off, saving power and avoiding spurious LED flashes. PowerManagerService gained additional screen-state checks.
New: GammaEQ - system-wide audio EQ
Why this matters: built-in Android audio is flat and no emulator ships its own EQ. GammaEQ hooks in near the fast mixer so every output - games, emulators, music, even UI - gets the same curve.
- Added - In-process audio EQ near the fast mixer (FastMixer + Threads + AudioPolicyManager). Applied to all audio output, not just media.
-
Added - Runtime gate via
persist.sys.gammaeq.enable. -
Added - GammaEQ settings app (
com.gammaos.gammaeq) with 10-band UI and a bundled preview track, plus a QS tile.
New: Taskbar & Trebuchet overhaul for handheld navigation
Why this matters: Android's stock 3-button nav bar is tiny, hard to hit, and wastes screen space on handhelds. Repurposing the Taskbar as the nav surface gives you bigger targets, an app-drawer icon, and consistent UX on secondary displays.
- Added - Taskbar drives 3-button navigation system-wide (NavigationBarControllerImpl + TaskbarActivityContext wired together). Taskbar also runs on secondary displays.
- Added - Reworked taskbar layout for handhelds: hotseat icons removed, all-apps icon moved to the left, nav buttons centred, taskbar height reduced, transient/auto-hide disabled.
- Changed - Touch above the taskbar captured correctly (no more dead-zone touches leaking past it); Trebuchet logging trimmed.
- App launches from the taskbar no longer fail.
- Quickstep overview no longer overlaps the nav bar.
- Split-screen transitions from Quickstep no longer hang.
- Crash when switching between gesture and 3-button nav on dual-taskbar devices.
- Tablet-UI detection regression on wide panels.
New: Immersive Mode, Forced Landscape, Orientation & Platform
-
Added - Immersive Mode (
persist.gammaos.immersive) with full-screen UX across SystemUI (DisplayPolicy + InsetsPolicy + NotificationPanelViewController + QuickSettingsController + ShadeControllerImpl) plus a dedicated QS tile. - Added - DC Dimming emulation via DisplayPowerController's modulated brightness curve, with Settings + QS tile entry.
- Added - Ultra Powersave mode in PowerManagerService.
- Added - Forced landscape when auto-rotate is off, with square-panel handling: natural orientation preserved and immediate 90°/270° flips blocked via a short grace window while sensor autorotation still works.
- Added - Sensor + touch orientation decoupled from device tree via runtime props.
- Added - ANR disabled (AppNotRespondingDialog / AnrController / AnrHelper / StackTracesDumpHelper / ActivityManagerService) so the system never interrupts gaming with "app not responding" prompts.
- Added - "Stop random wakes" guard in PowerManagerService.
- Added - Delay before entering deep sleep (audio-aware entry via FastMixer).
-
Added - A14 port of GammaOS button behaviour into
PhoneWindowManager: BACK + VOLUME UP/DOWN for stepped screen brightness, RetroArch override (persist.gammaos.retroarchoverride.backbutton) turning short BACK into F1, long BACK into ESC, and BACK + any physical key intoBTN_SELECTviasendevent. - Changed - RetroArch updated; hotkey combos no longer stick with the back-button override enabled.
New: HDMI, external display & audio routing
- Added - AudioDeviceBroker priority order: SCO / LE / HearingAid (comm paths) → BT A2DP → wired headset/headphones/line → USB headset/device, with HDMI slotting correctly instead of stealing the speaker path.
- Added - Allwinner HDMI audio workaround; HDMI-specific logic gated to non-Unisoc chipsets after an Allwinner-vs-Unisoc regression.
- Added - Optionally forced GPU composition while an external physical display is connected (two rounds keyed off vendor behaviour).
- Added - External monitor options to resize the external display and turn off the primary built-in display.
- Display mirroring no longer fails to show on external displays.
- Mirror aspect ratio now correct.
- HDMI audio switching lag on disconnect reduced.
- AudioDeviceInventory consistency fix so HDMI detection no longer overrides the speaker path.
New: Storage, Telephony, SetupWizard, SystemUI assets
- Added - Stable UUID for external storage (PublicVolume/PrivateVolume/VolumeBase + init.rc bootstrap), so app data tied to an SD card survives remount.
- Changed - Scoped storage further relaxed; input-device wake disabled in the same pass; a narrower file-access relaxation after reverting the earlier, more aggressive patch.
- Changed - Telephony support removed (generic_system.mk / handheld_system.mk / telephony_*.mk / no_telephony.xml SystemConfig + PHH Treble + framework/SystemUI resource tweaks). Handhelds don't need a dialer or SMS.
- Changed - SetupWizard fully rebranded for GammaOS (new logo, reworked welcome/settings layouts, rewritten Lineage + user-mode scripts, updated TV layout, substantial changes to BaseSetupWizardActivity and LineageSettingsActivity).
- Added - Ported A13 QS tiles: ABXY, AnalogAxis/Calibration/Deadzone/Sensitivity, DC Dimming, Deep Sleep, Dpad/Analog Toggle, Fan, GammaRGB, Mapping Editor, Performance.
-
Added - USB QS tile for AYANEO; removed XBOX controller
.klin favour of the new remapping stack. - Added - GammaOS Global Actions / Power menu: live memory/CPU/battery header, forced white tint for legacy global-actions icons, kill-foreground/kill-background/kill-all and Home shortcuts, Home key action added alongside Kill App in LineageParts.
- Added - SurfaceFlinger background-blur enabled by default; Berry Black theme on by default; reduced dialog/button corner radii; letterbox blur/dark scrim adjusted.
- Added - LineageParts saturation slider with live SurfaceFlinger integration and a rainbow preview bar; TwoStatePreference migration; recycler padding for DPAD focus; Trust onboarding removed.
-
Fixed - LegacyGlobalActions CPU usage calculation now aggregates
/proc/stat'scpuline (iowait treated as idle), delta-based with priming, EMA smoothing α=0.3, 500 ms poll. - Added - Defaults changed: dark/night mode on, freeform/multi-window on, seamless rotation on, accelerated colour transforms on; strong-auth-on-boot, safe media volume, AOD, pickup gestures, QR lockscreen shortcut, and Safety Center all off.
- Immersive mode + QS shade closing early.
- Presentation on secondary displays.
- Secondary-panel sleep.
- Crash when switching nav modes with dual taskbar.
- VSync enforcement regressions (guarded behind props for per-device compatibility).
- Random wakes stopped.
- Storage access regression on some MTK devices.
-
LegacyGlobalActionsUI fixes, QS updates, WM rotation updates.
Point releases for Anbernic T618 (RG405M / RG405V / RG505), a GameMT E6 MAX re-release, the Anbernic RG DS preview, and Mangmi Air X. These builds brought the A14 / LineageOS 21 port online on a wider device set while the v1.2 feature rollout was in progress.
Highlights
-
A14 port of GammaOS key customisations (
PhoneWindowManager, SetupWizard, Settings, custom system props, SELinux domains) from the A13 codebase. - Port of button remap / analog calibration / layout persistence stack from A13.
- Early Taskbar-driven 3-button navigation migration.
- Initial immersive-mode and forced-landscape experimentation.
- Vendor quirk fixes for Allwinner, MediaTek and Unisoc targets (HDMI audio, storage, rotation).
- GNext branding added (boot logo, default wallpapers, GammaOS assets).
- GammaEQ initial integration (refined and gated in v1.2).
- Relaxed scoped storage + stable external-storage UUID.
Core System
- Android 13 / LineageOS 20 Base: A clean, debloated build for snappy performance and minimal bloat.
- Google Services & Lite Option: Full Google Play Store support in standard builds, or choose "Lite" to forgo Google apps and maximize performance.
- Aurora Store: Seamlessly sideload apps without needing a Google account.
User Interface & Navigation
- Daijisho Launcher: Pre-configured for RetroArch (GB, GBC, GBA, NES, SNES, Genesis, PSX). (BIOS files must be supplied by the user.)
- App Drawer in Navigation Bar: Instantly access any installed app from the nav bar, no more returning to home to switch apps.
- Screen Rotation Controls: Enforce landscape mode when rotation is disabled, ensuring your games and apps stay in the correct orientation.
Input & Controls
- Universal Button Remapping: Remap any physical button to any other key or button input, giving you total flexibility over your gamepad layout.
- Analog Stick Calibration: Fine-tune stick behavior by adjusting range and deadzone settings for tighter, more precise controls.
- L2/R2 Fixes: Corrected L2 and R2 button behavior to ensure compatibility in games and apps.
- Layout Persistence: Once you choose a button layout (XBOX, NS, etc.), it remains across reboots, no reconfiguration required.
Display & Lighting
- DC Dimming Emulation: Reduce PWM flicker on devices that exhibit it, making long play sessions easier on the eyes.
- GammaRGB LED Sync: For supported devices, mirror on-screen colors to RGB LEDs on the analog sticks and synchronize LED brightness with screen brightness.
- 60 Hz Refresh Rate & Oversharpening Fixes: Smooth display performance with corrected refresh and oversharpening issues.
Performance & Power
- Performance Governors: CPU, GPU, and memory tuned to performance profiles for extra speed when you need it.
- Quick Settings Tiles: One-tap toggles for performance modes, analog sensitivity adjustments, ABXY remapping, axis inversion, and D-pad/analog swaps, and much more.
- Deep Sleep Mode: Force-freeze background apps via cgroup modifications to prevent emulators or other apps from running unnecessarily (use with caution, some apps may break).
Root & Modding
- Magisk Root: Pre-installed root access with Magisk, ready for modules, custom ROM tweaks, or system modifications.
Storage & Security
- Relaxed Scoped Storage: Loosened security requirements so apps can freely access files without being blocked, making file management and emulator setups simpler.