Play Need for Speed: Underground 2 (2004) in Chrome and Firefox with WebGPU graphics, Web Audio, up to 120 fps widescreen, controller support, free roam and Online races with friends. Fan project, not
Android-only Nintendo Switch emulator for Adreno GPUs: new interface, Lemon Cheater memory editor, savestates and NSZ/XCZ support. Mirror of git.lemon-emu.org/lemon/Lemon-Project
저장소 README에서 가져옴
README
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
An Android-only Nintendo Switch emulator built for Adreno GPUs.
The main repository and the releases live at.
This GitHub repository is a mirror. For help or to report a problem, use the Discord.
Lemon is an Android-only Nintendo Switch emulator built for Adreno GPUs. It runs on the open-source emulation
core developed by the yuzu community and the projects that followed it, trimmed down to just what's needed to build
and run it on a single Adreno-equipped Android device: no Qt/desktop/CLI targets, no multi-platform CI, no
Mali/PowerVR-specific code paths.
Lemon is an Android-only Nintendo Switch emulator built for Adreno GPUs and, since 1.1, Mali GPUs too. It runs on
the open-source emulation core developed by the yuzu community and the projects that followed it, trimmed down to
just what's needed to build and run it on Android phones and handhelds: no Qt/desktop/CLI targets, no
multi-platform CI, no PowerVR-specific code paths. It ships in three builds: Lemon, Lemon Lite (lighter
defaults for Adreno 6xx/7xx and Mali) and Lemon Lite & Spoofed (Lite under a benchmark app's package name).
Started as a personal build for the maintainer's own device(s), Lemon is now made by Team Lemon: Ghael, Seak,
Sidgey and BitRanger. Builds are published on the Releases page of
Lemon's own server and the app checks for new ones on launch (with the GitHub mirror as a fallback). It's still a
small project — there's a Discord for feedback and support, but it isn't
actively looking for external contributions; the source and releases are public under the GPL.
Most of Lemon's additions are Android-side features layered on top of unchanged core emulation, plus changes to
what gets built, how, and the app's branding/UX. The one exception is savestate: making Quick Save/Quick Load work
on real games required real changes to the emulated kernel and services themselves (how a thread parked
mid-syscall is captured and restored, and undoing what the game changed outside its memory since the save) — see
Features below.
Features
Everything below is specific to Lemon, on top of the Switch emulation it inherits from Eden/yuzu:
Lemon FG — Lemon's own frame generation, built in: a 1/4-resolution motion search and a warp in Vulkan
compute that insert generated frames between the real ones, with HUD and the followed character kept in place.
No Lossless Scaling code; an Engine option can run Lossless Scaling instead from the user's own Lossless.dll.
Online play on Nextendo Network — sign in from Settings → Online (in the browser, Lemon never sees the
password) and supported games play online on Nextendo's servers; Mario Kart 8 Deluxe races work.
Mali GPUs — BCn textures, which Mali cannot sample, are recompressed to ASTC (BC4/BC5 to EAC) on the GPU instead of being
stored uncompressed (Funko Fusion: 958 MB → 179 MB). Lemon Lite's driver downloader offers experimental PanVK
builds for the Mali-G720 and Mali-G52, each only to its own GPU.
Three builds — Lemon, Lemon Lite (0.75x resolution and asynchronous shaders by default, no bundled driver)
and Lemon Lite & Spoofed. They install side by side; Lite can import keys, firmware, games and saves from Lemon.
Settings in ten categories with search — Lemon, Graphics, Performance, Controls, In-game display, Console,
Online, Content and data, Help, Advanced and debug, and a search on the settings home that finds any option at
any depth and scrolls to it.
Redesigned interface — a launcher-style library (carousel, grid or list), a quick in-game panel with a live
performance card, redesigned Settings, About and Statistics screens, and full controller navigation, including
gamepad shortcuts to open the in-game menu.
Lemon Cheater — a live memory search/edit tool built into the in-game menu, Cheat-Engine style: exact-value
and blind (unknown-value) searches over 32-bit integers and floats (a float matches within the precision you
typed), refine by increased/decreased/unchanged across passes, direct value editing,
and freezing a found address so it stays fixed (infinite HP/ammo/etc.) via a background rewrite thread, without
needing a premade cheat code.
Cheat codes — Atmosphère cheats from the game's page or the in-game menu: paste a list or import a .txt
(bare titles are read as [name]), see the game's build ID (read from its main NSO before it boots), and turn
each cheat on or off, applied live while the game runs. Switches are saved in the mod folder's
cheats/toggles.txt; pasted cheats start off, and turning on more than the cheat VM can run together (0x400
opcodes) is refused instead of running none. Cheats installed as mods show up too, and each folder can be deleted.
A Download button fetches the game's file from switch-cheats-db
(gameplay and 60 FPS/resolution/graphics codes for the build, into their own folders; only the title ID is sent).
Changelog
Full release notes (including Nightly/Experimental prereleases) are on the
Releases page. Highlights:
As of v0.3, Nightly and Experimental have been merged into main and retired as separate channels — one
consolidated build going forward instead of splitting fixes across three branches.
v1.3.0 — Gamepad hotkeys (BitRanger) and cheat downloads from switch-cheats-db (see above). Quick
Save/Load (BitRanger): a load drops what the GPU drew since the save and restores every channel's 3D, compute, 2D and
inline-memory engine registers (no black screen across scenes); the audio render loop is held while the game is
paused for a save or load (far fewer "Game is busy"); a load keeps the live IPC message buffer of a thread waiting
for a service's answer (2010-0212) and matches a thread back from a kernel call only if back from the same one
(2001-0117); messages replace each other. NCE: a thread whose first run is cut short keeps the core's TLS registers.
Friend service answers GetFriendListIds and DeclareOpenOnlinePlaySession (MHGU on Nextendo). Config arrays check an
index against the innermost array (critical log on every settings save with several add-ons disabled).
v1.2.2 — Cheat codes (Atmosphère format, see above). TOTK's 64x64 dark shadow squares on Adreno: Lemon's
1/512-texel gather nudge (already used for AMD and Intel) is now enabled for Qualcomm's driver and Turnip; cause
found by Ryujinx Neo. Quick Load (BitRanger): threads that ended or moved on since the save are put back after a
scene change (save format 10), the video decoder is reopened and freed video buffers are mapped again, and a save
from an earlier run says so at once. A gamepad's A button clicks once (BitRanger) and no longer stays pressed when
focus moves. VI vsync events are locked while signaled (a crash at the start of some games, BitRanger). A driver
change clears the game's real shader cache folder; setting descriptions are no longer clipped. MaxwellDMA 1D
pitch/block-linear copies whose length is not a multiple of 16 no longer over-copy (Kingdom Hearts HD 1.5+2.5
videos; not confirmed yet).
v1.2.1 — Fix release. Games no longer wait up to a minute for Nextendo Network when it does not answer
(the boot-time token request now gives up after a few seconds). Saves no longer get corrupted after a Quick Load:
SetSize flushes before truncating and the game's flushes reach the host file (BitRanger). Quick Save/Load
reliability (BitRanger): GPU remaps, physical memory map/unmap, SetMemoryAttribute and GPU address space are
undone, newest first across all journals; GPU-drawn images are copied into the save; syncpoints, audio renderer
state and display buffer slots are put back; threads started after the save are ended; saves happen at a moment
a load can find again. The undo journals are emptied when a game ends. NARUTO X BORUTO Ultimate Ninja STORM
CONNECTIONS online (GetNetworkServiceLicenseKind is command 100; RegisterInternalPki). Crash fixes: the
foreground service started from the background, emulation callbacks after the activity was gone, a Toast from
the save import worker thread, the add-folder dialog after dismissal, and a lost drawer drag in game.
Scope
Android only. Every desktop/CLI build target from upstream has been removed.
Adreno only. Mali and PowerVR GPUs are explicitly out of scope and untested; the app may start on them,
but they are not supported (see the FAQ).
No keys, no firmware.prod.keys and Switch firmware are not part of this repository and never will be —
sourcing them from your own legally owned console is entirely on you. Lemon does not touch key derivation,
decryption, or DRM in any way; it only builds the emulator app.
Building
Releases are built and published manually (see the Releases page
for prebuilt APKs). A GitHub Actions workflow exists to verify the build
still compiles, but it's manually triggered (workflow_dispatch) and only runs on the GitHub mirror. To build
locally:
Dependencies:Android Studio, NDK 27+ and CMake 3.22.1 (installable
from Android Studio's SDK Manager), and Git.
Then either open Lemon-Project/src/android in Android Studio and use Run > Run 'app', or from a terminal:
export ANDROID_SDK_ROOT=path/to/sdk
export ANDROID_NDK_ROOT=path/to/ndk
cd Lemon-Project/src/android
./gradlew assembleMainlineRelWithDebInfo
.ci/android/build.sh (used by CI) wraps the same Gradle build with a friendlier flavor/build-type flag interface —
run it with --help for details.
License
Lemon, like Eden, is licensed under the GPLv3 (or any later version). Refer to LICENSE.txt.
Special thanks
This project stands on the open-source work of the yuzu community and of the projects that came after it:
Yuzu
Eden
Ryujinx
Sudachi
Citron
Torzu
Suyu
Ryubing
And everyone who continues or has contributed to any of them. <3
Thanks to our patrons, Gi4nnelli, Xaphiron, Seak, Overlord, Lucky-Kris, Xefir, Pieguy744 and Wiz, for supporting Lemon. <3
Thanks to BitRanger for contributing code: the Quick Save/Load reliability work and the fix that keeps
game saves from being corrupted after a Quick Load, each carefully tested on a real device. <3
A very special thank you to Madeleine, who designed Lemon's logo for free and put up with endless
rounds of changes with a lot of patience. Thank you, Madeleine! <3
Si te ha gustado mi trabajo puedes invitarme a un café
Gamepad hotkeys — Settings → Controls → Hotkeys: a Hotkey Enable button plus a combination per action (Quick
Save, Quick Load, stats overlay, device overlay, pause, exit with a confirm press), RetroArch style: Hotkey Enable is
held back from the game while used, a tap or a lone hold still reaches it.
Input macros — record a sequence of on-screen controller presses with their timing and play it back, looped
or once, for repetitive farming/grinding or practicing a sequence.
Quick Save / Quick Load (experimental) — same-session savestate that also survives dying, respawning and
moving on in the game. A save waits for a settled moment; a load undoes what the game changed since the save
outside its own memory (GPU buffers and mappings, thread stacks, files and other objects services handed out,
threads destroyed and created again) and only then rewinds the memory and the threads. Threads parked
mid-syscall keep the host fiber they live in, and services cannot answer a request while a save or a load
runs. When something since the save cannot be undone yet, the load says so and changes nothing. Verified on
Super Mario 3D World and Garfield; other games may still find something it cannot undo.
Controller layout presets — the in-game menu's On-screen controls entry starts with Edit and one-tap layout
presets (default, big buttons, swapped D-pad/stick), ahead of the touch control options.
Controller layout per game — move and resize the on-screen controls for one game only, or for all of them.
Start in QLaunch — with the firmware installed, opening Lemon boots straight into the console's home menu
(once per launch: leaving it takes you to the library).
Reset all settings — a red card at the bottom of Settings that puts every setting back to a fresh install's
defaults, optionally also deleting every game's custom settings. Game folders, storage locations and each game's
add-on choices are kept (unless the games' settings are deleted too).
Website, settings guide and FAQ at lemon-emu.org, in English and Spanish, with a plain-language
explanation of every setting.
Game usage stats — automatic per-game playtime, last-played time and session count, surfaced as a
"Continue playing" shortcut on the games list and a sortable ranking on a dedicated Statistics screen.
Carousel/grid/list browsing with per-card usage badges, favorites, and search/filtering across your library;
a progress bar while the library is scanned and pull down to refresh.
In-app updates — checks Lemon's own server on launch (falling back to the GitHub mirror when it can't be
reached), on demand from the About screen too, and can download/install the new APK directly, with no path
(missing release, no connection) that crashes the app. A one-time "What's new" notice follows an update.
Adreno GPU driver manager — install alternate Adreno graphics drivers per game, plus per-game performance
presets, frame generation and post-processing options.
Save data import/export, Amiibo loading, and ad-hoc multiplayer, same as upstream Eden.
v1.2.0 — Lemon FG, Lemon's own frame generation, built in, with an Engine option (Lemon FG or Lossless
Scaling from the user's own DLL). Accurate GPU mode by default in Lemon (Fast in Lite). One GPU fence
behavior: wait for the host GPU, but never drain it for a value the guest already reached; the GPU Fence
Behavior setting is removed. CPU reads of images the GPU drew fault first, so TOTK grass stays without Use reactive
flushing (removed). Mali: BC4/BC5 recompressed to EAC; raw BCn block copies through uint aliases kept as raw-block
shadows and decoded on the GPU (Splatoon 2/3 Inklings and button text). Adreno: geometry shader side effects run
once per primitive (Marvel Ultimate Alliance 3 spikes and flickering lights). Dynarmic A32 SHA-1 instructions
(Mario Kart 8 Deluxe on Nextendo, error 2306-0502). An expensive fragment shader is translated once per session
(Splatoon 3 load ~100 s → ~70 s). Lemon-Ade v0.0.7 bundled (fixes a shader miscompile). Fixes: the in-game theme
stays yellow, the game list no longer rescans on leaving a game's page, pausing while a game loads no longer
crashes, and the settings screen no longer floods the log.
v1.1.0 — Three builds: Lemon, Lemon Lite and Lemon Lite & Spoofed. Online play on Nextendo
Network (Mario Kart 8 Deluxe races). Mali GPUs supported: BCn textures recompressed to ASTC on the GPU, and
experimental PanVK drivers in Lite. Settings in ten categories, with search.No more flickering in Fast GPU
mode: Default GPU fence behavior now waits for the GPU (Balanced), so Fast is the default GPU mode again
(Immediate gives the old speed back for games that do not flicker). A simpler in-game menu. Fixes: Crysis
Remastered no longer crashes and its minimap stays in its corner (DrawTexture blit read a released framebuffer and
left stale dynamic state); TOTK grass no longer vanishes (NCE page invalidation threw away GPU-written images);
memory block ids no longer wrap (Mario & Luigi: Brothership); the multiplayer nickname is remembered again;
sockaddr length in getsockname/getpeername/accept/recvfrom; input events without a device; asynchronous shaders
look at the current draw; fewer render-pass breaks for small uniform buffers; capped and rotated logs, the reason
the system ended the previous run, and "Lemon" instead of "Eden" in logs. From this release the APKs are signed
with Lemon's own key through APK Signature Scheme v3 key rotation, so installs update in place.
v1.0.1 — Quick Load survives dying (and moving on in the game): it now undoes what the game changed
since the save — GPU buffers and mappings, thread stacks, open files and other service objects, worker threads
destroyed and created again — instead of refusing or freezing; it also no longer fails now and then when a
service answered mid-load. Still experimental. Grid and list views for big libraries, a scan progress bar
(including the one-time decompression of a solid .nsz, which used to look like an empty library for minutes)
and pull down to refresh. Start in QLaunch option. A tap on the game closes the in-game menu. Enable Legacy
Rescale Pass is listed under Hacks: it fixes the colored lines in Luigi's Mansion 3 (thanks to Elegant Demise
for finding it). Updates: only a newer version is offered, and only a release with an APK for your build. Fixes:
stopping a macro mid-way left its buttons pressed; installing or removing firmware, or importing data, during a
library scan could crash; the CPU summary on chips this build does not know (Snapdragon 8 Elite Gen 5); fewer
repeated warnings in the log; a missing TAS folder is created instead of logging an error.
v1.0.0 — Lemon has its own home: the code, the releases and the updates now live at
git.lemon-emu.org (GitHub is a mirror) and there is a website,
lemon-emu.org, with a settings guide and an FAQ. A new interface: launcher-style library,
quick in-game panel with a performance card, redesigned Settings/About/Statistics and full controller navigation;
the new screens are translated to Spanish. Controller layout per game. Lemon Cheater searches, edits and freezes
floats as well as integers. Reset all settings on the Settings screen. GPU Mode is Accurate by default:
Fast made textures flicker in some games (confirmed on Garfield and Dragon Ball). Updates come from Lemon's own
server with GitHub as a fallback, a Check for updates button on the About screen and a "What's new" notice after
an update. Fixes: FIFA's missing player indicators, ball-direction lines, button prompts and text (a texture handle
that travels with the vertices could not be followed by the shader compiler, so those draws were silently
dropped; draws are now split by texture); FIFA 23 stuck at the splash screen (the network service lacked an
Ioctl call); updates and DLC bundled in .nsz files showing the wrong version and no DLC; motion controls on
every screen rotation, so they work on foldables and tablets held landscape. A card-based first-run setup, and
more Turnip sources in the driver downloader. Known issue: in FIFA 23 the faces of some players can show wrong
colors.
v0.3.5 — Coming from Eden, Citron or yuzu: Lemon imports your saves (plus keys and firmware if it has none)
without opening the other emulator, from the first-run setup or the top of Settings. Android 12 support. The
Lemon-Ade driver ships inside the app and is picked automatically on the Adreno 830, with an automatic fallback to
the system driver if a game fails to start with it; Lemon-Ade is also first in the driver downloader. Games built
for Switch firmware 22.0+ (ZBIC-compressed executables) load. New logo by Madeleine. Fixes: Add-ons toggles
flipping other entries while scrolling, GPU-written textures evicted under memory pressure, the update notice
never showing, plus several upstream Eden fixes (MK8D/SM3DW local wireless crash, controller-disconnect freeze,
SGSR black screen on system screens, UE5 buffer sync races, IPS/pchtxt mods).
v0.3.4 — Hotfix: the loading screen could stay up forever after a game had started. The check that hides it
once the first frame renders shared its message queue with the touch-overlay auto-hide, which clears that whole
queue on every screen touch; the check was cancelled and never restarted. The adaptive-performance watchdog had
the same problem and is fixed too.
v0.3.3 — Compressed dumps: .nsz and .xcz load directly. Block-compressed files (the .xcz default) are
read in place with nothing written to disk; solid ones are decompressed once on first use and cached for later
launches (least recently used entries evicted past 24 GiB). Rendering: added a missing barrier before indirect
compute dispatches, compute dispatches are no longer skipped, and fixed crashes on dead compute descriptor slots
and when rescaling texel buffer views. A corrupted or truncated pipeline cache is now rejected instead of crashing
on launch. The loading screen stays up until the first real frame. Older Adreno devices (Snapdragon 888/865): the
custom GPU driver is no longer loaded and unloaded repeatedly. Quick Load validates the whole savestate before
touching any memory. Fixed a Lemon Cheater freeze deadlock and an out-of-memory abort when taking a snapshot. The
game list scans faster (containers are no longer re-parsed on every query) and no longer races between threads,
which could crash or drop updates/DLC. Also includes everything from v0.3.2-nightly.1 below.
v0.3.2-nightly.1 — Prerelease. Quick Save/Quick Load no longer aborts a restore over a memory region that's
legitimately (not corruptly) become partially unmapped since the save; that region is now skipped instead, like an
excluded sleeping-thread stack. Fixed a crash on some older Adreno/KGSL devices (confirmed on Snapdragon 888 and
865) importing a custom GPU driver from your own file instead of the in-app downloader — two driver-manager UI
labels were each building a full throwaway Vulkan device just to read two strings, and that churn stacked with a
real driver reload into several rapid GPU-driver open/close cycles. New app icon and branding (launcher icon,
default profile picture), plus a Ko-fi link on the About screen.
v0.3.1 — Fixed the auto-updater: enable_update_checks defaulted to false, so the update check never ran for
anyone who hadn't manually found and flipped a Settings toggle they had no reason to know existed (now on by
default); a separate tag-comparison bug meant Nightly-flavored builds' check silently bailed out even once
enabled. Renamed remaining "Eden" leftovers to "Lemon" (device/system nickname in Settings > Advanced, plus a
few lower-visibility internal identifiers).
v0.3 — Channel consolidation: Nightly and Experimental are merged into main and retired; a single build
going forward. Quick Save/Quick Load now excludes threads asleep on a kernel wait from the restore instead of
corrupting their stack/context, making it reliable on real multi-threaded games (previously same-session only,
MVP-quality); savestate files shrunk ~3x via sparse-encoding zero-filled memory pages. Fixed a missing Vulkan
synchronization barrier between compute-shader dispatches and the draws/copies that consume their output,
causing intermittent black rendering artifacts (confirmed on Zelda: Tears of the Kingdom's procedural grass and
shadows). Retry custom GPU driver loading instead of falling back to the (on some devices, unstable) system
driver after a single attempt, fixing a repeated crash-on-launch pattern confirmed on Snapdragon 888/Adreno 660.
Fixed a native out-of-bounds memory-unmap during shutdown that could corrupt state carried over into the next
game session. Fixed a crash opening Settings after exiting emulation. Fixed Release builds silently sharing a
stale build configuration with the debug-adjacent RelWithDebInfo build type (wrong reported version, unoptimized
binary). Controller layout presets (Default/Big/Swapped D-pad↔stick) with one-tap apply from a new in-game menu.
Discord and Buy Me a Coffee links on the About screen.
v0.2.3 — "Continue playing" card and playtime/last-played/session sorting on the Statistics screen; Lemon
Cheater freeze/unfreeze with a dedicated "Frozen" view; input macro recorder/player; auto-updater pointed at
this repository instead of upstream Eden's.
v0.2.2 — Game usage statistics (playtime, last played, session count), a new Statistics screen, and per-card
usage badges on the games list.
v0.2.1 — Fixed the Lemon Cheater's context menu appearing behind game cards in Carousel view.
v0.2 — Added the Lemon Cheater live memory editor, plus assorted bug fixes.