Repository navigation
Releases
v0.3.0-alpha12: The Android line's twelfth alpha
The Android line's twelfth alpha. The phone app is the whole tool: it ports a game on the device itself and plays the data pack it makes.
This one is a pre-release: it does not become the repository's "Latest" release, so the players on the current version are not pushed onto an alpha.
Changelog
Before you update
- "Update runtime" is more forgiving. The upstream sync changed the profile fingerprints, so an older data pack met a refusal where the player was pushed back to a full re-port. The app asks now instead of ending the road: "continue with the current profile" rebuilds the runtime in place, so the game does not have to be ported again and your saves are kept.
- The external display needs the new runtime. The row in the drawer shows up after "update runtime" rebuilt the pack's host. Nothing else changes.
- This release carries the upstream line's work: the engine's own fixes and three more games that play on Android.
New games
- Xenoblade Chronicles: Definitive Edition (30 fps; it rarely crashes on boot - about 1 in 35 - and saving and the later maps are not tested yet)
- Ultra Kaiju Monster Rancher
- OCTOPATH TRAVELER 0 (Chinese release) - for the Simplified Chinese text, port with Game language: Chinese (Simplified)
- Pokémon Sword and Pokémon Shield install under their own names now (org.nx2a.pokemonsword, org.nx2a.pokemonshield); the Wild Area and the battles are checked
New
- The game goes to a wired display. Plug an HDMI monitor into the phone's USB-C and the game fills the screen while the phone keeps the gamepad. The switch is in the drawer (Controls, Picture, External display), off by default.
- The saves travel through the system file manager. Exporting asks where the package goes; importing takes a zip from anywhere the file manager sees and unpacks it in the cache first, so a broken package never touches the save.
- The in-game drawer fills the screen, and its tabs follow WinNative's: an icon above the label, a sliding bar under the chosen one, and a sideways scroll when the six tabs do not fit.
- The gamepad center is new: a physical controller is a controller. See it, test its buttons, rebind a key, calibrate the dead zone and the trigger threshold, and choose whether the face buttons follow their position or their label. The settings belong to the controller, not to the game.
- The gamepad center says which player a controller plays, and the rumble goes to the player it belongs to. The library page can be driven with a gamepad.
- OCTOPATH TRAVELER 0 has a gamepad theme of its own.
- The runtime update's dialog offers continue and retry only.
Fixed
- The player's language choice stands for the Chinese releases: OCTOPATH TRAVELER 0 (Chinese release) and FINAL FANTASY RESONANCE (Asian release) no longer force Simplified Chinese on a Korean or Traditional Chinese player.
- A pack made before a profile key that was added (and is off) still runs on the new host: no porting again.
- The on-screen controls keep their spacing when they are grown, and stay on the screen.
- A controller that goes away leaves nothing pressed, a key's scan code always reaches the host, and the host logs what every controller key became.
Engine (the upstream sync, 38 commits)
- A batch of Vulkan and NVN fixes: the occlusion addresses, the descriptor readiness the GPU produces, the sampler limits that now match Android, the vertex attribute divisor, the defaults of a disabled vertex attribute, the descriptor cache keys, a pool remap that fails partway, the command segments the guest owns, and the games wound against the front-face rule (DM_VK_FRONT).
- The pipeline cache is saved after a burst of new pipelines, and the pools the GPU never uses stay in cached memory where the hardware buffers can read them.
Community ports
- @rospec14 - Xenoblade Chronicles: Definitive Edition and Ultra Kaiju Monster Rancher, and Pokémon Shield's package name (through the upstream #386, #391, #384).
- @intermission88 - the fix that lets an older pack run on the new host (through the upstream #387).
- @DeathKhan, @hjcoggan, @lianghx123 - engine fixes from upstream (#263, #275, #350).
- No pull request was merged into this repository itself; all of it came in with the upstream sync. Everyone in this release's history is named in the README's contributors table.
Before you start
- Your own files only. The app never ships or downloads game files, keys or firmware; it works on the files you dump from your own Switch.
- GPU: Adreno (Snapdragon) or Xclipse (Exynos 2200 and later). Mali and PowerVR cannot run these games.
- The APK is signed with the project's key, so it installs over
v0.3.0-alpha11and keeps your saves. - It is an alpha: expect rough edges.
Get started: download the APK below, install it on an Android phone, and let it set the phone up (it downloads nothing but the tools it needs).
更新日志
Android 线的第十二个 alpha。手机 App 就是全部的工具:它在设备上自己移植游戏,也运行自己生成的数据包。
这一版是预发布:它不会成为仓库的 "Latest",所以当前版本上的玩家不会被推去装 alpha。
更新前必读
- 「更新运行时」更宽容了。 上游同步改变了 profile 指纹,旧数据包点「更新运行时」原本会撞上拒绝,玩家被推回整包重移植。现在 App 会问,而不是把路堵死:「用当前 profile 继续」就地重建运行时,不用重新移植游戏,存档也留着。
- 外接显示需要新运行时。 抽屉里的那一行,会在「更新运行时」重建完宿主之后出现。别的不用动。
- 这一版带着上游线的成果:引擎自己的修复,还有三款新游戏能在 Android 上玩。
新游戏
- 异度神剑:决定版(Xenoblade Chronicles: Definitive Edition)—— 30 fps;开机偶尔崩溃(约 35 次里 1 次),存档与后期地图未测试
- 奥特怪兽:怪兽农场(Ultra Kaiju Monster Rancher)
- 歧路旅人 0(OCTOPATH TRAVELER 0)中文版 —— 想要简体中文文本,移植时在「游戏语言」里选简体中文
- 《宝可梦 剑 / 盾》现在用自己的名字安装(org.nx2a.pokemonsword、org.nx2a.pokemonshield),野外区域与战斗已检查
新增
- 游戏输出到有线显示器。 手机用 USB-C 接上 HDMI 显示器,游戏占满屏幕,手机留下当手柄。开关在抽屉的「操控 → 画面 → 外接显示」,默认关。
- 存档走系统文件管理器。 导出时由你选保存位置;导入接受文件管理器能看到的任意位置的 zip,先在缓存里解开再安装,所以坏包不会碰存档。
- 游戏内抽屉全屏化,页签行也跟着 WinNative 走:图标加文字,选中的下面一根滑条,六个页签放不下时横滑。
- 手柄中心是新的:实体手柄直接当手柄用。可以看它、试它的按键、改键、校准摇杆死区和扳机阈值,也可以选面按键按位置还是按标签跟随。这些设置跟着手柄走,不跟游戏走。
- 手柄中心说得出哪个手柄在玩哪个玩家,震动也发给对应的玩家。库页可以整个用手柄操作。
- 《歧路旅人 0》有专属的手柄主题。
- 运行时更新的对话框只留「继续 / 重试」两个明确的选择。
修复
- 中文版 / 亚洲版游戏不再覆盖玩家选的语言:歧路旅人 0 中文版、FF RESONANCE 亚洲版之前会把韩语或繁体中文玩家切成简体,现在以玩家的选择为准。
- 在 profile 后来才新增(默认关闭)开关之前做的移植,新宿主照常接受,不用重新移植。
- 放大后的屏幕按键保持间距,不再跑出屏幕。
- 手柄断开时不再残留「按住」的按键状态;按键扫描码总能到达宿主;宿主会记录每个按键的转换日志(排障用)。
引擎(上游同步,38 个提交)
- 一批 Vulkan / NVN 修复:遮挡地址、GPU 生成的描述符就绪、采样器上限对齐 Android、顶点属性 divisor、禁用顶点属性的默认值、描述符缓存键、内存池重映射失败、宿主自己拥有的命令段,以及绕反 front-face 规则的游戏(DM_VK_FRONT)。
- 管道缓存批量保存;GPU 用不到的内存池放进硬件缓冲读得到的缓存内存。
Community ports
- @rospec14 —— 《异度神剑:决定版》《奥特怪兽:怪兽农场》两款移植,以及《宝可梦 盾》的包名修正(经上游 #386、#391、#384)。
- @intermission88 —— 让旧数据包在新宿主上照样能跑的兼容修复(经上游 #387)。
- @DeathKhan、@hjcoggan、@lianghx123 —— 上游引擎修复(#263、#275、#350)。
- 本仓库本身没有合入 PR,上面这些都随上游同步进入本线。这一版历史里的每一位作者,都在 README 的贡献者表里。
开始之前
- 只用自己的文件。 App 不带、不下载任何游戏文件、keys 或固件;它用的是你自己从 Switch 导出的文件。
- 显卡: Adreno(骁龙)或 Xclipse(三星 Exynos 2200 及以后)。Mali 和 PowerVR 跑不了这些游戏。
- APK 用项目的密钥签名,所以能盖在
v0.3.0-alpha11上,存档也留着。 - 这是 alpha,可能还有毛刺。
开始:下载下面的 APK,装到安卓手机上,让它自己把手机配好(除了需要的工具,它什么都不下载)。
v0.3.0-alpha13: The Android line's thirteenth alpha
The Android line's thirteenth alpha. The phone app is the whole tool: it ports a game on the device itself and plays the data pack it makes.
This one is a pre-release: it does not become the repository's "Latest" release, so the players on the current version are not pushed onto an alpha.
Changelog
Before you update
- The player API moved to revision 6 (the game's mode). A data pack made with an older one is marked as needing a runtime update. "Update runtime" in the library rebuilds it in place: the game does not have to be ported again, and your saves are kept.
- The host changed with this release. The upstream line's work is in the host, so the update brings the new engine fixes and the new tools with it. A pack that is not updated keeps running on the host it was built with.
New
- The file managers see the app's own folders. The runtime rootfs, the tools, the hosts, the saves, the drivers and the logs show up as one root: the player can read, create, rename, move and delete there without a computer. The switch is in Settings, About ("File manager access"), on by default, and it takes effect at once, without a restart.
- The system's game mode reaches the host. With the performance game mode on, the game keeps its own period and the device maker's interventions step aside. The app asks the system on every resume, so a mode changed while the game sits in the background is picked up. The games the host draws itself (the NVN and the Vulkan ones) are the ones it applies to.
- A profile can compress its RomFS on the device (
romfs zstd). The files that shrink are stored packed and read back on the device. Cardfight!! Vanguard Dear Days 2 uses it: 30.6 GB of extracted RomFS against 21 GB of XCI and update, 19.7 GB on the device. - The Legend of Zelda: Breath of the Wild turns the GPU's turbo on by default. The frame rate holds 60 where the GPU's governor would have lowered the clock. The cost is heat;
DM_GPU_TURBO=0in env.txt turns it off.
Fixed
- The GPU's clock control goes back to the phone when the game is paused or ends. It stayed at the highest clock after the game was backgrounded, which is hot and draws power.
- The shader split does not read Unreal's modern paks whole. A modern Unreal game keeps its shaders in the shader code archives, which the split was reading whole to look for shader records and finding nothing. FINAL FANTASY RESONANCE's split took the process tree to 15.7 GB of memory on a 24 GB phone, and a phone with 11 GB was killed by the system mid-scan with no error line in the log. The same split now peaks at 810 MB and takes 8 s instead of 40 s, and the package is the same.
- The shader split works on the desktop: it died with a pickling error as soon as the RomFS had a file to scan.
- Pokémon Mystery Dungeon Rescue Team DX runs at 30 fps, as on the Switch; 60 fps with the porter's
--fps60. - Mega Man Battle Network Legacy Collection Vol. 2 is playable: Battle Network 4, 5 and 6, with saving, loading, battles and the gallery.
- Xenoblade Chronicles: Definitive Edition is tested to Colony 9, with the pause menu and saving; the later maps are not checked yet.
Engine (the upstream sync, 19 commits)
- A batch of Vulkan and NVN fixes: the 32 separate sampler bindings a stage answers with, the shared linear and sRGB texture families, a compressed image drawn into through a block-size view keeps the view's format, the alpha coverage across the perspective variants, and an opt-in scratch target for an empty colour slot 0 (
DM_VK_SLOT0_FILL, off by default). - The AVC video's frame layout and its crop, and the fatal allocation errors are kept in the log instead of being swallowed.
- The performance work: the deferred uniform updates read from ordinary memory, the pool lookup cache is wider, and the game keeps its own period in the performance game mode.
- The build fix: the NVN dirty message compiles under gcc's
-Werror.
Community ports
- @rospec14 - the RomFS compression on the device, the 30 fps fix for Pokémon Mystery Dungeon Rescue Team DX, and the Xenoblade test with the Mega Man's status (through the upstream #371, #396, #395).
- @DeathKhan - the 32 sampler bindings, the scratch target for the empty colour slot 0 and the compressed image's view format (through the upstream #256, #257, #393).
- @StepwiseCord804 - the deferred uniform updates with the wider pool lookup cache, Breath of the Wild's GPU turbo and the build fix (through the upstream #267, #382, #398).
- @thehobbit85 - the performance game mode for the NVN ports, the AVC frame layout and the shared texture families (through the upstream #300, #358, #363).
- @lianghx123 - the alpha coverage across the perspective variants (through the upstream #316).
- No pull request was merged into this repository itself; all of it came in with the upstream sync. Everyone in this release's history is in the repository's contributor list.
Before you start
- Your own files only. The app never ships or downloads game files, keys or firmware; it works on the files you dump from your own Switch.
- GPU: Adreno (Snapdragon) or Xclipse (Exynos 2200 and later). Mali and PowerVR cannot run these games.
- The APK is signed with the project's key, so it installs over
v0.3.0-alpha12and keeps your saves. - It is an alpha: expect rough edges.
Get started: download the APK below, install it on an Android phone, and let it set the phone up (it downloads nothing but the tools it needs).
更新日志
Android 线的第十三个 alpha。手机 App 就是全部的工具:它在设备上自己移植游戏,也运行自己生成的数据包。
这一版是预发布:它不会成为仓库的 "Latest",所以当前版本上的玩家不会被推去装 alpha。
更新前必读
- 玩家 API 到了修订 6(游戏模式)。 用更早的修订做的数据包会被标记为需要更新运行时。库里的「更新运行时」是就地重建:不用重新移植游戏,存档也留着。
- 宿主随这一版换了。 上游线的成果在宿主里,所以更新会把新的引擎修复与新工具一起带进来;没有更新的数据包,继续跑它当初那个宿主。
新增
- 文件管理器能看到 App 自己的目录。 运行时 rootfs、工具、宿主、存档、驱动与日志合成一个根目录:不用电脑也能查看、新建、改名、移动与删除。开关在「设置 → 关于」(文件管理器访问),默认开,改完立刻生效,不用重启。
- 系统的游戏模式传到宿主了。 性能档打开时,游戏保持自己的周期,手机厂商的干预退场。App 每次 resume 都问一遍系统,所以游戏在后台时改的模式也会被认出来。宿主自己画的那些游戏(NVN 与 Vulkan)才适用。
- profile 可以在设备上压缩 RomFS(
romfs zstd)。 能压小的文件被打包存放,在设备上按需读回。《Cardfight!! Vanguard Dear Days 2》用上了:解包 30.6 GB,对应 21 GB 的 XCI 与更新,设备上占 19.7 GB。 - 《塞尔达传说:旷野之息》默认打开 GPU 提频。 本来 GPU 的调速器会压低频率的地方,帧率能守住 60。代价是发热;在 env.txt 里写
DM_GPU_TURBO=0可以关掉。
修复
- 游戏暂停或结束时,GPU 的时钟控制还给手机。 之前游戏退到后台之后,GPU 一直跑在最高频率,又热又费电。
- shader split 不再整个读取 Unreal 的新式 pak。 现代 Unreal 游戏的着色器放在 shader code 归档里,而 split 之前为了找着色器记录,把这些文件整个读进来,结果什么也没找到。《FF RESONANCE》的 split 曾把进程树推到 24 GB 手机上的 15.7 GB 常驻内存;11 GB 的手机则被系统在扫描到一半时杀掉,日志里连一行报错都没有。现在同一趟 split 峰值 810 MB,8 秒跑完(原来 40 秒),产出的包一模一样。
- shader split 在桌面上也跑得了:RomFS 里一有文件要扫,它就死在 pickle 错误上。
- 《宝可梦 密室救援队 DX》按 30 fps 跑(与 Switch 一样);移植时加
--fps60可以到 60。 - 《洛克人 网络大作战 合集 Vol. 2》可玩:网络大作战 4、5、6 都过了,存档、读档、战斗与画廊都查过。
- 《异度神剑:决定版》测试到 Colony 9(暂停菜单与存档也过了),后期地图未测。
引擎(上游同步,19 个提交)
- 一批 Vulkan / NVN 修复:一个 stage 回答 32 个独立的采样器绑定、linear 与 sRGB 两族纹理共用、压缩图像通过 block-size view 画入时保住 view 的格式、透视变体之间保住 alpha 覆盖率,以及空 colour slot 0 的可选 scratch target(
DM_VK_SLOT0_FILL,默认关)。 - AVC 视频的帧布局与裁剪;致命的分配错误不再被吞掉,日志里留得下来。
- 性能方面:deferred uniform 更新改读普通内存、pool lookup 缓存更大、性能档下游戏保持自己的周期。
- 构建修复:NVN 的 dirty 消息在 gcc 的
-Werror下也能编译。
Community ports
- @rospec14 —— 设备上的 RomFS 压缩、《宝可梦 密室救援队 DX》的 30 fps 修复,以及《异度神剑:决定版》的测试与《洛克人 Vol. 2》的状态(经上游 #371、#396、#395)。
- @DeathKhan —— 32 个采样器绑定、空 colour slot 0 的 scratch target、压缩图像的 view 格式(经上游 #256、#257、#393)。
- @StepwiseCord804 —— deferred uniform 更新与更大的 pool lookup 缓存、《旷野之息》的 GPU 提频、构建修复(经上游 #267、#382、#398)。
- @thehobbit85 —— NVN 移植的性能档支持、AVC 帧布局、共用的纹理族(经上游 #300、#358、#363)。
- @lianghx123 —— 透视变体之间的 alpha 覆盖率(经上游 #316)。
- 本仓库本身没有合入 PR,上面这些都随上游同步进入本线。这一版历史里的每一位作者,都在仓库的贡献者名单里。
开始之前
- 只用自己的文件。 App 不带、不下载任何游戏文件、keys 或固件;它用的是你自己从 Switch 导出的文件。
- 显卡: Adreno(骁龙)或 Xclipse(三星 Exynos 2200 及以后)。Mali 和 PowerVR 跑不了这些游戏。
- APK 用项目的密钥签名,所以能盖在
v0.3.0-alpha12上,存档也留着。 - 这是 alpha,可能还有毛刺。
开始:下载下面的 APK,装到安卓手机上,让它自己把手机配好(除了需要的工具,它什么都不下载)。
v0.3.0-alpha11: The Android line's eleventh alpha
The Android line's eleventh alpha. The phone app is the whole tool: it ports a game on the device itself and plays the data pack it makes.
This one is a pre-release: it does not become the repository's "Latest" release, so the players on the current version are not pushed onto an alpha.
Changelog
Before you update
- The player API moved to revision 4 (the motion switches, the audio output and the GPU clock), so a data pack made with an older one is marked as needing a runtime update. "Update runtime" in the library rebuilds it in place: the game does not have to be ported again, and your saves are kept.
- This release carries the upstream line's work: the engine's own fixes and nineteen more games that play on Android.
New games
- The Legend of Zelda: Breath of the Wild (experimental, 60 fps with 1.9.0)
- Pokémon Sword, Pokémon Shield, Pokémon Brilliant Diamond, Pokémon Scarlet
- Fire Emblem Engage (60 fps with 2.0.0)
- Super Mario 3D World + Bowser's Fury
- The World Ends with You -Final Remix-
- Pokémon Mystery Dungeon Rescue Team DX
- Rhythm Heaven Groove
- Kirby's Return to Dream Land Deluxe (it reads the console's fonts, so it needs the firmware)
- Mega Man Battle Network Legacy Collection Vol. 1 and Vol. 2
- Cardfight!! Vanguard Dear Days 2
- Disco Elysium - The Final Cut
- Tomodachi Life: Living the Dream
- Untitled Goose Game
- FM24 Touch, Football Manager 26 Touch
New
- The drawer gives the audio a tab of its own: the output follows the system, or one of the devices the system has (a Bluetooth headset, a USB dongle).
- The GPU's clock is a switch in the drawer: off, always at its highest, or only while the frames miss the display.
- The motion switches move to the game's drawer, and the device's turn moves the game's six-axis sensor.
- The build page takes the player's own font, the console's firmware and the multithreaded replay.
- The library says what a game needs before the port: the API it draws with, whether it plays over the local network, and how far its profile got.
- The firmware is one for the machine: import it from a zip, in the environment checklist, the settings, the guided setup or the build page. The chip says when the machine has none.
- The gamepad's style is the player's pick: the bundled theme or the default pack, remembered per game and in effect at once.
- The log bundle carries how the port ended (the exit code, or the signal that killed it) and the device's memory at that moment.
Fixed
- The shader split spills its payloads to the disk: a phone's memory does not hold a game's shaders (FINAL FANTASY RESONANCE has 73,512 of them), so the package is written from the disk, one shader at a time. The split has a budget now, and stops with a clear error when the device has no room for it.
- A change to the shader split no longer makes the port translate every shader again: the translation is reused, and the port takes 40 seconds instead of 40 minutes.
- The frame generation no longer comes and goes: it holds itself back in one piece, its label follows the host's own state, and the optical flow works on half the picture.
- The game's own decoder runs only for the games that need it: a dump of another version stops with a message that says which version the profile registers, instead of crashing.
- A port the system killed (out of memory) leaves a log now, and the app says how the run ended.
- The library page no longer asks for a driver: the app ships the Turnip driver and picks it by default.
Changed
- The app and the repository are GPL-3.0-or-later. The tree used to be MIT, with the frame generation as the one GPL component in it. The MIT terms let anyone take the code and ship a closed app from it; the GPL terms require a derivative to be distributed under the same license, with its source and the notices kept. The license follows the code that was taken, not what the build linked: the frame generation can be left out of a build (
-PnxLsfg=false), and the result is still GPL. The third-party components keep their own licenses, the upstream engine's copyright notice is kept, and the full license text travels with the app and the desktop bundle. - The license files are laid out so that a machine reads them.
LICENSEis the GPL-3.0 text alone, so GitHub shows the repository as GPL-3.0 instead of "Other";NOTICE.mdsays what those terms cover, who holds the copyright on what (the upstream engine and the upstream desktop tool are named, with their MIT text quoted), and which parts keep a license of their own. The app's own notice no longer says that selling it is not allowed: the GPL lets a distributor charge for a copy, so the notice says what the license actually says.
Community ports
- No community pull request has been merged since the last version.
- Everyone in this release's history is named in the README's contributors table.
Before you start
- Your own files only. The app never ships or downloads game files, keys or firmware; it works on the files you dump from your own Switch.
- GPU: Adreno (Snapdragon) or Xclipse (Exynos 2200 and later). Mali and PowerVR cannot run these games.
- The APK is signed with the project's key, so it installs over
v0.3.0-alpha10and keeps your saves. - It is an alpha: expect rough edges.
Get started: download the APK below, install it on an Android phone, and let it set the phone up (it downloads nothing but the tools it needs).
更新日志
Android 线的第十一个 alpha。手机 App 就是全部的工具:它在设备上自己移植游戏,也运行自己生成的数据包。
这一版是预发布:它不会成为仓库的 "Latest",所以当前版本上的玩家不会被推去装 alpha。
更新前必读
- 玩家 API 到了第 4 版(体感开关、声音输出、GPU 时钟),旧版本做的数据包会被标成「需要更新运行时」。库里的「更新运行时」就地重建它:不用重新移植游戏,存档也留着。
- 这一版带着上游线的成果:引擎自己的修复,还有十九款新游戏能在 Android 上玩。
新增游戏
- 《塞尔达传说:旷野之息》(实验性,1.9.0 下 60 fps)
- 《宝可梦 剑》《宝可梦 盾》《宝可梦 璀璨钻石》《宝可梦 朱紫》
- 《火焰纹章 Engage》(2.0.0 下 60 fps)
- 《超级马力欧 3D 世界 + 库巴怒气》
- 《最终幻想 人生 -Final Remix-》
- 《宝可梦 密室探险 救援队 DX》
- 《节奏天国 Groove》
- 《星之卡比 Wii 豪华版》(它读主机的字体,需要固件)
- 《洛克人 战斗网络 合集 Vol. 1 与 Vol. 2》
- 《卡片战斗!先行者 社团篇 2》
- 《Disco Elysium 完全版》
- 《Tomodachi Life: Living the Dream》
- 《捣蛋鹅》
- 《Football Manager 24 / 26 触屏版》
新增
- 抽屉里给声音单独一个页签:输出跟着系统走,或选系统有的设备(蓝牙耳机、USB 小尾巴)。
- GPU 时钟是抽屉里的一个开关:关、一直拉最高、或只在掉帧时拉。
- 体感开关搬进游戏的抽屉了,手机的转动直接带动游戏的六轴传感器。
- 构建页现在收你自己的字体、主机的固件和多线程回放。
- 库页在移植前就说清游戏要什么:它画的 API、能不能局域网联机、档案做到哪一步。
- 固件是整机一份:从 zip 导入,环境清单、设置、引导流程和构建页都能导。机器没有固件时,顶部的小条会说明它是干什么用的。
- 手柄样式由你挑:打包的样式或默认包,按游戏记住,立刻生效。
- 日志包里带上移植是怎么结束的(退出码,或者哪个信号杀了它)和那一刻设备的内存。
修复
- 着色器切分改成把产物落到磁盘:手机的内存装不下一个游戏的着色器(最终幻想:无限共鸣有 73,512 个),现在从磁盘一个一个写进包。切分还有了预算,设备放不下时会明确报错。
- 切分工具一改,不再让移植把所有着色器重译一遍:译文复用,移植从 40 分钟变成 40 秒。
- 帧生成不再一阵一阵:它整体地压住自己,标签跟着宿主自己的状态走,光流跑在半张画面上。
- 游戏自己的解码器只给需要的游戏跑:版本对不上的文件现在会停在一句「档案登记的是哪个版本」的提示上,而不是崩掉。
- 被系统杀掉的移植(内存不够)现在也留下日志,App 会说这次是怎么结束的。
- 库页不再问你要驱动:App 自带 Turnip,默认就用它。
变化
- App 与整个仓库是 GPL-3.0-or-later。 仓库以前是 MIT,帧生成是里面唯一一处 GPL。MIT 允许任何人拿走代码、闭源再发布;GPL 要求衍生作品按同样的许可发布,并带上源码与声明。许可跟的是「拿进来的代码」,不是「这次构建链接了什么」:帧生成可以不编进构建(
-PnxLsfg=false),结果仍然是 GPL。第三方组件保留各自的许可,上游引擎的版权声明保留,完整的许可文本跟 App 和桌面包一起走。 - 许可文件的摆法让机器读得懂。
LICENSE只有 GPL-3.0 正文,GitHub 因此把仓库认成 GPL-3.0 而不是「Other」;NOTICE.md说明这些条款管到哪、什么部分的著作权归谁(上游引擎和上游桌面工具都点名了,附了它们的 MIT 原文),哪些部分另有自己的许可。App 自己的声明不再说「不许出售」:GPL 允许分销者收费,所以声明改成写许可实际允许什么。
Community ports
- 上个版本之后还没有合并的社区 PR。
- 这一版历史里的每一位作者,都在 README 的贡献者表里。
开始之前
- 只用自己的文件。 App 不带、不下载任何游戏文件、keys 或固件;它用的是你自己从 Switch 导出的文件。
- 显卡: Adreno(骁龙)或 Xclipse(三星 Exynos 2200 及以后)。Mali 和 PowerVR 跑不了这些游戏。
- APK 用项目的密钥签名,所以能盖在
v0.3.0-alpha10上,存档也留着。 - 这是 alpha,可能还有毛刺。
开始:下载下面的 APK,装到安卓手机上,让它自己把手机配好(除了需要的工具,它什么都不下载)。
v0.3.0-alpha10: The Android line's tenth alpha
The Android line's tenth alpha. The phone app is the whole tool: it ports a game on the device itself and plays the data pack it makes.
This one is a pre-release: it does not become the repository's "Latest" release, so the players on the current version are not pushed onto an alpha.
Changelog
Before you update
- Nothing to redo: the player API did not move, so the data packs of alpha09 keep working.
New
- FINAL FANTASY RESONANCE (Asian release) plays on Android now: its own profile, its own host rows, its own gamepad theme. Unreal Engine 5.6.1, 73,512 shaders, all translated. The international release is untouched.
- The older pack of the same game goes when the new one lands: its saves move into the new pack first, and two packs that both hold saves are left alone.
- The cover is read again when it failed (the card showed a letter instead of the game's own picture until the app was restarted), and a pack that is only a manifest never wins the card.
Community ports
- No community pull request has been merged since the last version.
- Everyone in this release's history is named in the README's contributors table.
Before you start
- Your own files only. The app never ships or downloads game files, keys or firmware; it works on the files you dump from your own Switch.
- GPU: Adreno (Snapdragon) or Xclipse (Exynos 2200 and later). Mali and PowerVR cannot run these games.
- The APK is signed with the project's key, so it installs over
v0.3.0-alpha09and keeps your saves. - It is an alpha: expect rough edges.
Get started: download the APK below, install it on an Android phone, and let it set the phone up (it downloads nothing but the tools it needs).
更新日志
Android 线的第十个 alpha。手机 App 就是全部的工具:它在设备上自己移植游戏,也运行自己生成的数据包。
这一版是预发布:它不会成为仓库的 "Latest",所以当前版本上的玩家不会被推去装 alpha。
更新前必读
- 不用做什么:玩家 API 没有动,alpha09 的数据包照常能用。
新增
- 《最终幻想:无限共鸣》亚洲版现在能在 Android 上玩了:它有自己的档案、自己的宿主表项、自己的手柄主题。Unreal Engine 5.6.1,73,512 个着色器,全部转译。国际版没有动。
- 同一个游戏的新数据包落地时,旧的那个让位:存档先搬进新包,两个都存着存档的包会留着不动。
- 封面读失败后会重读(之前卡片要等到 App 重启才显示游戏自己的图),只有清单的空包永远不占卡片。
Community ports
- 上个版本之后还没有合并的社区 PR。
- 这一版历史里的每一位作者,都在 README 的贡献者表里。
开始之前
- 只用自己的文件。 App 不带、不下载任何游戏文件、keys 或固件;它用的是你自己从 Switch 导出的文件。
- 显卡: Adreno(骁龙)或 Xclipse(三星 Exynos 2200 及以后)。Mali 和 PowerVR 跑不了这些游戏。
- APK 用项目的密钥签名,所以能盖在
v0.3.0-alpha09上,存档也留着。 - 这是 alpha,可能还有毛刺。
开始:下载下面的 APK,装到安卓手机上,让它自己把手机配好(除了需要的工具,它什么都不下载)。
v0.3.0-alpha09: The Android line's ninth alpha
The Android line's ninth alpha. The phone app is the whole tool: it ports a game on the device itself and plays the data pack it makes.
This one is a pre-release: it does not become the repository's "Latest" release, so the players on the current version are not pushed onto an alpha.
Changelog
Before you update
- The player API moved to revision 2 (the frame rate step), so a pack made with an older one is marked as needing a runtime update. "Update runtime" in the library rebuilds it in place: the game does not have to be ported again, and your saves are kept.
New
- The shared runtime log is a bundle now: the device's and the app's own facts, the game's own facts (its name, title ID, version, profile status) and the host's logs of the last run and the one before it. The host renames its log at every start, so a crash's backtrace was in the log the share never took.
- A frame rate step in the drawer: follow the game, 60, 40 or 30. The pick takes effect at once and is remembered per game. A game capped at 30 fps stays at 30.
- The drawer has a performance page now - the first one, and the one it opens on: the frame rate step and the docked mode, each with a line saying when it helps.
Community ports
- No community pull request has been merged since the last version.
- Everyone in this release's history is named in the README's contributors table.
Before you start
- Your own files only. The app never ships or downloads game files, keys or firmware; it works on the files you dump from your own Switch.
- GPU: Adreno (Snapdragon) or Xclipse (Exynos 2200 and later). Mali and PowerVR cannot run these games.
- The APK is signed with the project's key, so it installs over
v0.3.0-alpha08and keeps your saves. - It is an alpha: expect rough edges.
Get started: download the APK below, install it on an Android phone, and let it set the phone up (it downloads nothing but the tools it needs).
更新日志
Android 线的第九个 alpha。手机 App 就是全部的工具:它在设备上自己移植游戏,也运行自己生成的数据包。
这一版是预发布:它不会成为仓库的 "Latest",所以当前版本上的玩家不会被推去装 alpha。
更新前必读
- 玩家 API 到了第 2 版(帧率档位),所以用旧版做出来的数据包会被标成「需要更新运行时」。在库里点「更新运行时」就能原地重建:不用重新移植整个游戏,存档也保留。
新增
- 分享运行日志现在是一个包:设备与 App 的事实、游戏自己的事实(名字、title ID、版本、档案状态),以及宿主最近两次运行的日志。宿主每次启动都会把日志改名,所以崩溃的回溯一直躺在从没被分享过的那份日志里。
- 抽屉里的帧率档位:跟随游戏、60、40 或 30。选了就立刻生效,并且按游戏记住。本身锁 30 fps 的游戏就还是 30。
- 抽屉有了「性能」页——第一页,也是打开时默认停的那页:帧率档位和 docked 模式,各带一句什么时候该用它。
Community ports
- 上个版本之后还没有合并的社区 PR。
- 这一版历史里的每一位作者,都在 README 的贡献者表里。
开始之前
- 只用自己的文件。 App 不带、不下载任何游戏文件、keys 或固件;它用的是你自己从 Switch 导出的文件。
- 显卡: Adreno(骁龙)或 Xclipse(三星 Exynos 2200 及以后)。Mali 和 PowerVR 跑不了这些游戏。
- APK 用项目的密钥签名,所以能盖在
v0.3.0-alpha08上,存档也留着。 - 这是 alpha,可能还有毛刺。
开始:下载下面的 APK,装到安卓手机上,让它自己把手机配好(除了需要的工具,它什么都不下载)。
v0.3.0-alpha08: The Android line's eighth alpha
The Android line's eighth alpha. The phone app is the whole tool: it ports a game on the device itself and plays the data pack it makes.
This one is a pre-release: it does not become the repository's "Latest" release, so the players on the current version are not pushed onto an alpha.
Changelog
Before you update
- Nothing to redo: the data packs of alpha07 keep working, and a game that needs a new runtime is still updated on its own from the library.
New
- "Share the log" packs a zip now: the device's and the app's own facts, the app's log, the stage logs of every game in the work folder (the host's build, the Oodle decoder's run, the extractor's, the shaders', the porter's traceback) and the build history's logs. Each log says how much of it was cut.
- A game's updates and its DLC are found in a first-level subfolder next to the base game, so the usual layout of a download now ports with its DLC. Only the picked game's files are taken from there, and the report says which subfolder each update and DLC came from.
- The builds page says what it found and how long it runs: the target (which game, which file, is it adapted), the files the porter found (the base game, its updates and its DLC, each with its version and the subfolder it came from) and the build options.
Community ports
- No community pull request has been merged since the last version.
- Everyone in this release's history is named in the README's contributors table.
Before you start
- Your own files only. The app never ships or downloads game files, keys or firmware; it works on the files you dump from your own Switch.
- GPU: Adreno (Snapdragon) or Xclipse (Exynos 2200 and later). Mali and PowerVR cannot run these games.
- The APK is signed with the project's key, so it installs over
v0.3.0-alpha07and keeps your saves. - It is an alpha: expect rough edges.
Get started: download the APK below, install it on an Android phone, and let it set the phone up (it downloads nothing but the tools it needs).
更新日志
Android 线的第八个 alpha。手机 App 就是全部的工具:它在设备上自己移植游戏,也运行自己生成的数据包。
这一版是预发布:它不会成为仓库的 "Latest",所以当前版本上的玩家不会被推去装 alpha。
更新前必读
- 不用做什么:alpha07 的数据包照常能用,需要新运行时的游戏依然能在库里单独更新。
新增
- 「分享日志」现在打成一个 zip:设备与 App 的事实、App 的日志、工作目录里每个游戏的阶段日志(宿主的构建、Oodle 解码、提取器、着色器、porter 的 traceback)以及构建历史的日志。每份日志都写明截掉了多少。
- 游戏的更新和 DLC 会在本体旁边的一层子文件夹里被找到,所以下载的常见布局现在能带着 DLC 一起移植。只取选中那个游戏的文件,报告里写明每个更新和 DLC 来自哪个子文件夹。
- 构建页说清它找到了什么、要跑多久:目标(哪个游戏、哪个文件、是不是改编版)、移植器找到的文件(本体、它的更新和 DLC,各自带版本号和来源子文件夹)和构建选项。
Community ports
- 上个版本之后还没有合并的社区 PR。
- 这一版历史里的每一位作者,都在 README 的贡献者表里。
开始之前
- 只用自己的文件。 App 不带、不下载任何游戏文件、keys 或固件;它用的是你自己从 Switch 导出的文件。
- 显卡: Adreno(骁龙)或 Xclipse(三星 Exynos 2200 及以后)。Mali 和 PowerVR 跑不了这些游戏。
- APK 用项目的密钥签名,所以能盖在
v0.3.0-alpha07上,存档也留着。 - 这是 alpha,可能还有毛刺。
开始:下载下面的 APK,装到安卓手机上,让它自己把手机配好(除了需要的工具,它什么都不下载)。
v0.3.0-alpha07: The Android line's seventh alpha
The Android line's seventh alpha. The phone app is the whole tool: it ports a game on the device itself and plays the data pack it makes.
This one is a pre-release: it does not become the repository's "Latest" release, so the players on the current version are not pushed onto an alpha.
Changelog
Before you update
- Your data packs do not have to be ported again. If a game's runtime is not the current one, the library says so, and "Update runtime" rebuilds it from the profile that made the pack. Your saves are kept.
- This release carries the upstream line's work: the engine's own fixes and nine more games that play on Android.
New games
- Animal Crossing: New Horizons (local play over the LAN)
- DARK SOULS: REMASTERED
- FINAL FANTASY RESONANCE
- Kirby and the Forgotten Land
- Lonely Mountains: Downhill
- Octopath Traveler 0, and its Chinese release with a gamepad of its own
- Picross S+
- South Park: The Stick of Truth
- The Legend of Zelda: Echoes of Wisdom
New
- A data pack's runtime can be updated on its own. The app rebuilds it from the profile that made the pack, so a game whose runtime is out of date does not have to be ported again.
- Local play over the LAN: the console's own local play, without the console.
- Games that use OpenGL ES run on the device's own GL driver.
- Unreal's shader archives are decoded on the device, with the game's own Oodle decoder.
- The app's code is split into layers now, and follows the repository's own layout.
- The builds page says what the selected game holds.
Fixed
- The memory pools are redone: they are allocated outside the pool lock and the small ones live in slabs, so the frame time does not jump when a pool appears or goes.
- The Vulkan pipeline caches are checked against a copy on the CPU before they are used, and they are saved atomically: a cache that went wrong is rebuilt instead of drawing the wrong thing.
- A 32-bit game stops with a clear message instead of failing later.
- The Unreal shader decode continues with the streams it has.
- The pak's AES works without commoncrypto, and with pycryptodome's other name.
- The top bar's chip is coloured by the child-process limit.
- A save package that holds no file is refused.
- The setup checks the battery setting.
Community ports
- No community pull request has been merged since the last version.
- Everyone in this release's history is named in the README's contributors table.
Before you start
- Your own files only. The app never ships or downloads game files, keys or firmware; it works on the files you dump from your own Switch.
- GPU: Adreno (Snapdragon) or Xclipse (Exynos 2200 and later). Mali and PowerVR cannot run these games.
- The APK is signed with the project's key, so it installs over
v0.3.0-alpha06and keeps your saves. - It is an alpha: expect rough edges.
Get started: download the APK below, install it on an Android phone, and let it set the phone up (it downloads nothing but the tools it needs).
更新日志
Android 线的第七个 alpha。手机 App 就是全部的工具:它在设备上自己移植游戏,也运行自己生成的数据包。
这一版是预发布:它不会成为仓库的 "Latest",所以当前版本上的玩家不会被推去装 alpha。
更新前必读
- 你的数据包不用重新移植。如果某个游戏的运行时不是当前版本,库里会标出来,点「更新运行时」就按当初做这个包的 profile 重建它。你的存档保留。
- 这一版带进了上游那条线的工作:引擎自己的修复,还有九个能在安卓上玩的游戏。
新游戏
- 动物森友会(支持 LAN 联机)
- 黑暗之魂:重制版
- 最终幻想战略版
- 星之卡比 遗忘的大冒险
- Lonely Mountains: Downhill
- 八方旅人 0,以及它带专属手柄的中文版
- 画谜 S+
- 南方公园:Stick of Truth
- 塞尔达传说:智慧的再现
新增
- 数据包的运行时可以单独更新:App 按当初做这个包的 profile 重建它,运行时过时的游戏不用整个重新移植。
- LAN 联机:主机自己的联机,不用主机。
- 用 OpenGL ES 的游戏走设备自带的 GL 驱动。
- Unreal 的着色器压缩包在设备上用游戏自己的 Oodle 解码。
- App 的代码分成了几层,跟仓库自己的分层一致。
- 构建页会说明选中的那个游戏占多少。
修复
- 内存池重做:池在锁外分配,小的池放在 slab 里,创建或销毁池时帧时间不再跳。
- Vulkan 的管线缓存用之前会拿 CPU 上的副本对一遍,保存也是原子的:坏掉的缓存会重编,而不是画出错的东西。
- 32 位游戏现在会明确报错,而不是半路失败。
- Unreal 的着色器解码会接着已有的流继续。
- pak 的 AES 不再依赖 commoncrypto,pycryptodome 的另一个名字也认。
- 顶栏那个小标会按子进程上限变色。
- 不含任何文件的存档包会被拒绝。
- 引导会检查电池设置。
Community ports
- 上个版本之后还没有合并的社区 PR。
- 这一版历史里的每一位作者,都在 README 的贡献者表里。
开始之前
- 只用自己的文件。 App 不带、不下载任何游戏文件、keys 或固件;它用的是你自己从 Switch 导出的文件。
- 显卡: Adreno(骁龙)或 Xclipse(三星 Exynos 2200 及以后)。Mali 和 PowerVR 跑不了这些游戏。
- APK 用项目的密钥签名,所以能盖在
v0.3.0-alpha06上,存档也留着。 - 这是 alpha,可能还有毛刺。
开始:下载下面的 APK,装到安卓手机上,让它自己把手机配好(除了需要的工具,它什么都不下载)。
v0.3.0-alpha06: The Android line's sixth alpha
The Android line's sixth alpha. The phone app is the whole tool: it ports a game on the device itself and plays the data pack it makes.
This one is the repository's Latest release: the release page and the "latest" link point at it. The next alpha does not take that place on its own.
Changelog
Before you update
- The data packs are untouched this time: the games you ported with alpha05 play as they are, no porting again.
- The output folder setting is gone: the data pack lives in the app's own folder. A pack made on a computer does not play on the phone any more - the game is ported on the phone (the shaders are reused, so it is quick).
New
- The data pack can live on a removable card: one button in the library moves it (with a progress bar), and a rebuild writes the new pack on the card as well. Pulling the card during a move leaves the pack where it was; a deletion with the card out says that the pack on the card was not deleted. Verified on a device (a Xiaomi tablet and a memory card).
- The library clears the build cache and deletes a game: a failed port no longer leaves files behind that nothing could get rid of. A deletion takes the data pack (and the saves in it) with it, and your own game files stay. Both ask first, and the confirmation says what the action does.
- The settings page is a page of sections: an icon in the top bar opens it, five sections on the left, one row per setting. The settings themselves did not change; the language moved into About.
- The update dialog spreads over the available width on a small screen.
Fixed
- Picking a Lossless.dll from anywhere failed to copy: only the path that finds it on its own made the folder, and the failure was reported as "this does not look like a Lossless.dll". The folder is made now, and a copy that does not work is logged.
- The frame generation row has one button: the private copy refreshes itself, so the button that refreshed it by hand only repeated what the app did.
Community ports
- @15622162922 — #10: fix(android): compile adrenotools C hooks with clang
The Vulkan driver loader's hooks keep their names now: they were built as C++, so the names came out mangled and the loader could not find them.
Want to take part?
- The repository has the whole community front now: issue and pull request templates, CONTRIBUTING.md, badges and a contributors table in the README, and the handle of the person who brought each ported game up in the port checklist. Discussions are off: the issue tracker is the one place (a blank issue is open again, so a question that fits no form still has a way in).
Before you start
- Your own files only. The app never ships or downloads game files, keys or firmware; it works on the files you dump from your own Switch.
- GPU: Adreno (Snapdragon) or Xclipse (Exynos 2200 and later). Mali and PowerVR cannot run these games.
- The APK is signed with the project's key, so it installs over
v0.3.0-alpha05and keeps your saves. - It is an alpha: expect rough edges.
Get started: download the APK below, install it on an Android phone, and let it set the phone up (it downloads nothing but the tools it needs).
更新日志
Android 线的第六个 alpha。手机 App 就是全部的工具:它在设备上自己移植游戏,也运行自己生成的数据包。
这一版是仓库的 Latest:release 页和「最新版本」链接都指向它。下一个 alpha 不会自动接替这个位置。
更新前必读
- 这次升级不动数据包:alpha05 移植的游戏装完直接玩,不用重新移植。
- 「输出文件夹」这个设置没有了:数据包固定放在应用自己的目录里。电脑上移植出来的数据包不再能在手机上运行——游戏要在手机上移植(着色器直接复用,很快)。
新增
- 数据包可以挪到存储卡:库里一键移动(带进度条),重新移植也会直接写到卡上。移动中拔卡,源包不受影响;卡不在时删除会告诉你卡上的包没删掉。真机验证过(小米平板 + 存储卡)。
- 库里可以「清理构建缓存」和「删除游戏」:失败的移植不再留下删不掉的垃圾文件。删除会把数据包(连同里面的存档)一起删掉,你自己的游戏文件不动。两个操作都要确认,确认框写明会做什么。
- 设置页重做:顶栏图标进入,左边五个分区,每个设置占一行。设置本身没变;语言选项挪到了「关于」里。
- 更新弹窗在小屏幕上铺满可用宽度,不再挤成窄窄一条。
修复
- 从任意位置选 Lossless.dll 时复制失败:只有自动找到的那条路会建目录,手选的不建,还把失败报成「文件不对」。现在目录会建,失败也会记日志。
- 帧生成那一行合并成一个按钮:私有副本本来就会自动刷新,手动刷新按钮删了。
Community ports
- @15622162922 — #10: fix(android): compile adrenotools C hooks with clang
Vulkan 驱动加载器的几个钩子现在保住名字了:之前按 C++ 编译,名字被改过,加载器找不到。
想参与?
- 仓库有了完整的社区入口:issue / PR 模板、CONTRIBUTING.md、README 的徽章和贡献者表,每个移植过的游戏在 PORT_CHECKLIST 里标出移植人。Discussions 关了,issue 是唯一入口(空白 issue 也开着,问题有地方问)。
开始之前
- 只用自己的文件。 App 不带、不下载任何游戏文件、keys 或固件;它用的是你自己从 Switch 导出的文件。
- 显卡: Adreno(骁龙)或 Xclipse(三星 Exynos 2200 及以后)。Mali 和 PowerVR 跑不了这些游戏。
- APK 用项目的密钥签名,所以能盖在
v0.3.0-alpha05上,存档也留着。 - 这是 alpha,可能还有毛刺。
开始:下载下面的 APK,装到安卓手机上,让它自己把手机配好(除了需要的工具,它什么都不下载)。
v0.3.0-alpha05: The Android line's fifth alpha
The Android line's fifth alpha. The phone app is the whole tool: it ports a game on the device itself and plays the data pack it makes.
This one is the repository's Latest release: the release page and the "latest" link point at it. The next alpha does not take that place on its own.
Changelog
Before you update
- Data packs made with an older version do not work any more. Port your games again - the library marks them, and the button says "port again".
- The shaders are not translated again: the ones that did not change are reused. Only the host's glue layer is rebuilt, so it is much faster than the first port.
- Your game progress and your exported save backups are kept.
- The game's files have to be in the same folder as before.
New
- Faster ports. The data pack is written to the app's own folder instead of shared storage: ~200-230 MB/s instead of ~50-100 MB/s. Three Tears of the Kingdom ports died at that copy step before.
- Performance overlay over the game: FPS, frame time, CPU, GPU, memory, battery temperature, power. You choose which fields show.
- New in-game menu. It opens from the left edge with the gamepad's menu button or the back gesture. Pause / resume / exit are in it.
- The library shows the game's own name and version, not the file name.
- "Extra address space" on the build page. It fixes "AllocateAddressRegion refused (0x1803)" in some games.
- The environment's state is on the top bar of every page. Tap it to see what is missing.
- The on-screen gamepad is drawn by the app now. The layout editor is new, and the d-pad lights up the direction you press.
- The update check opens a popup with the new version, the version you run, and the release's own notes.
Fixed
- The app update replaces the tool tree instead of writing over it. An update that left the old files behind built two hosts at once, and every port failed.
- The update check runs on its own: an error there no longer closes the app.
- The frame generation no longer slows frame-locked games down. Measured on a Y700 (120 Hz): 60 -> 120 fps.
- The frame generation can be turned off from the in-game menu. The switch only turned it on before.
- Without Lossless.dll the switch says it is not available, instead of looking like an ordinary off switch.
- Typing in a game no longer freezes and then crashes it.
- A crash writes a log now instead of dying without one.
- The hidden on-screen gamepad no longer blocks touches on the game.
- After a game closed, the library no longer flashed "back to game / exit game".
Before you start
- Your own files only. The app never ships or downloads game files, keys or firmware; it works on the files you dump from your own Switch.
- GPU: Adreno (Snapdragon) or Xclipse (Exynos 2200 and later). Mali and PowerVR cannot run these games.
- The APK is signed with the project's key, so it installs over
v0.3.0-alpha04and keeps your saves. - It is an alpha: expect rough edges.
Get started: download the APK below, install it on an Android phone, and let it set the phone up (it downloads nothing but the tools it needs).
更新日志
Android 线的第五个 alpha。手机 App 就是全部的工具:它在设备上自己移植游戏,也运行自己生成的数据包。
这一版是仓库的 Latest:release 页和「最新版本」链接都指向它。下一个 alpha 不会自动接替这个位置。
更新前必读
- 旧版本移植的数据包不能直接用了,游戏要重新移植一次。库里会把这样的游戏标出来,按钮是「重新移植」。
- 着色器不用重新翻译:没变的部分直接复用。要重编的只有宿主的胶水层,比第一次移植快得多。
- 游戏进度和导出的存档备份都保留。
- 重新移植需要游戏文件还在原来的文件夹里。
新增
- 移植提速:数据包直接写在应用自己的目录里,复制速度约 200-230 MB/s(原来走共享存储只有 50-100 MB/s)。之前王国之泪有三次移植都死在这一步。
- 游戏内的性能悬浮窗:帧率、帧时间、CPU、GPU、内存、电池温度、功耗。显示哪些项自己挑。
- 游戏内菜单重做:从屏幕左缘滑出(手柄菜单键或返回手势都能开),暂停 / 继续 / 退出都在里面。
- 库里显示游戏自己的名字和版本号,不再拿文件名当名字。
- 构建页新增「额外地址空间」:解一部分游戏的 AllocateAddressRegion refused (0x1803)。
- 每页顶栏都有环境状态,缺什么点开就能看到。
- 虚拟手柄改为 App 来画:布局编辑器重做,十字键按下会亮。
- 更新检查会弹窗告诉你新版本、你现在的版本,以及这一版的说明。
修复
- App 更新时整棵树换掉,而不是盖在上面。旧文件没删干净的话会同时编出两个宿主,每次移植都失败。
- 更新检查自己跑:它出错的时候不会再把 App 弄崩。
- 帧生成不再把锁帧游戏拖成慢动作。Y700(120 Hz)实测 60 → 120 fps。
- 游戏内菜单的帧生成开关现在真的能关掉(之前只存了设置,主机还在生成)。
- 没有 Lossless.dll 时开关显示「不可用」,不再是灰色的关。
- 游戏里的文字输入不再卡死然后崩溃。
- 崩溃会留日志,不再无声无息。
- 关掉的虚拟手柄不再吃触屏(之前语言选择页会自己动)。
- 游戏退出后,库里不再闪「回到游戏 / 退出游戏」。
开始之前
- 只用自己的文件。 App 不带、不下载任何游戏文件、keys 或固件;它用的是你自己从 Switch 导出的文件。
- 显卡: Adreno(骁龙)或 Xclipse(三星 Exynos 2200 及以后)。Mali 和 PowerVR 跑不了这些游戏。
- APK 用项目的密钥签名,所以能盖在
v0.3.0-alpha04上,存档也留着。 - 这是 alpha,可能还有毛刺。
开始:下载下面的 APK,装到安卓手机上,让它自己把手机配好(除了需要的工具,它什么都不下载)。
v0.3.0-alpha04
The Android line's fourth alpha. The phone app is the whole tool: it ports a game on the device itself and plays the data pack it makes.
This one is a pre-release: it does not become the repository's "Latest" release, so the players on v0.3-android are not pushed onto an alpha. The app's update check keeps pointing at the released version.
Changelog
Added
- The app's data pack is built in the app's own folder (
files/ports), not on the shared storage. The extracted game files were copied over FUSE, which is slow (50-100 MB/s) and fragile; the copy now runs at the device's write speed (200-230 MB/s measured) and no media scanner shares the files. The log of 2026-11-09 shows three ports of Tears of the Kingdom dying in that stage: the system killed the app, a half-made pack left behind made the next port fail, and a cancel interrupted a read. The game reads its files from there as well. - The free-and-open-source notice. It is shown once, when the setup finishes, and on the first start of an app that had already done the setup. It says the app is free and open source, that selling it is not allowed, and that a player who paid for it can ask the seller for a refund. "View the repo" opens the fork's page on GitHub.
- Tapping the version in the Settings opens the repository on GitHub. The underline says the row can be tapped; a device without a browser has no other way there, so the app stays quiet.
- An experimental port says so. The data pack's manifest carries the profile's own status: a game that was never brought up on Android is written with the status experimental, and the library shows it as one - the player is told the port may stop at a path that was never walked.
- A developer setup guide (
docs/GETTING_STARTED.md).
Fixed
- A game's text entry froze the game and then killed it. The host told the app "the drawer steps aside" with a JNI call made on the game's own thread, and that call blocked there: the log showed the entry opening and nothing after it, and the process died of SIGSEGV with no backtrace and no tombstone. The notice goes on a thread of its own now - the game's thread must never wait for the app.
- A crash on Android was silent. The crash handlers were only installed by the desktop host, so a SIGSEGV killed the game silently: the kernel had nowhere to run a handler, the process died of the signal and the log stayed empty. They are installed now, and every thread that can fault gets the signal alternate stack.
- The log said the wrong reason. The line read "audio suspended (background / interruption)" every time the game was held, but the game is held for three reasons: the app is in the background, the pause menu is open, or a text entry is open. A game's name entry froze with the keyboard never coming up, and the log blamed the background. The host names the reason now.
- The app checks the all-files permission before a port starts. Without it the game file cannot be read, and the port died in the middle of a Python stack trace.
- The cleanup of a half-made pack is tolerant now. The folder may be gone already (another process removed it), and a directory that vanishes while it is being removed must not stop the port - that was the FileNotFoundError that ended with exit 139.
The whole changelog, from the first release on, is in CHANGELOG.md.
Before you start
- Your own files only. The app never ships or downloads game files, keys or firmware; it works on the files you dump from your own Switch.
- GPU: Adreno (Snapdragon) or Xclipse (Exynos 2200 and later). Mali and PowerVR cannot run these games.
- The APK is signed with the project's key, so it installs over
v0.3.0-alpha03and keeps your saves. - It is an alpha: expect rough edges.
License
The app as distributed is licensed under GPL-3.0-or-later: it links the LSFG frame generation, and the component's source and license text travel inside the APK (android/NOTICE.md says which parts are which). The rest of the tree is MIT.
Get started: download the APK below, install it on an Android phone, and let it set the phone up (it downloads nothing but the tools it needs).