OnionPlus V4.4.0-beta-20260925 (9f688d3)
Fourth performance pass (1592866e) plus the refreshed README (9f688d3c), on top of
the 747d102a release. Base is still OnionUI 4.4.0-beta; updates arrive via OTA as usual.
What you'll notice
- Safer boots:
system.jsonis no longer rewritten in place at startup. A power
cut during boot, or an empty per-device settings file, could previously leave your
settings file empty; it is now written to a temporary file and swapped in only when
complete. - Play Activity opens faster: the whole play history used to be aggregated twice
when the app opened; now once (about half the time on large histories, same results). - Slightly faster game launches and returns to the menu: a few more helper
programs replaced with shell built-ins on every launch and every return to MainUI
(Mini+/Flip 560p check, custom-core lookup,system.jsonreads).
New: on-device timing log
With Tweaks → Advanced → Diagnostics → Enable logging, Onion now records how long
each phase takes in .tmp_update/logs/timing.log (the previous session is kept as
timing.prev.log):
- boot (total,
init_system, networking); - each game: preparation, session, exit (with the ROM name);
- MainUI: preparation, session, return;
- GameSwitcher: preparation, session.
It uses the time since power-on, so it is not affected by the clock being restored at
boot, and it does nothing when logging is off. Sharing a timing.log from a Mini,
Mini+ or Flip in an issue helps target the next optimizations.
Fixes (also present in upstream OnionUI)
system.jsoncould be emptied at boot (empty per-device settings file, or a power
cut during the rewrite).- Package Manager leaked the parsed configuration of every emulator package
(free()instead ofcJSON_Delete()).
Under the hood
runtime.sh: fork-freeget_full_resolution_path,get_info_valueand a new
sysjson_get(falls back tojsonvalfor escaped values or missing keys).- Play Activity:
play_activity_find_all()reads its results in a single pass. - Package Manager: each installed file is checked once instead of twice while scanning
packages. - README refreshed: all four performance passes documented by category, with the
on-device timing marks explained.
Verification
- Host test suite: 1,423 tests / 71,436 assertions, all passing.
- Old-vs-new equivalence tests for every rewritten
runtime.shhelper (dash and bash
POSIX mode),load_settingsbehaviour, andplay_activity_find_all()under
AddressSanitizer/UBSan. - Not yet verified on hardware; the shell changes have not been run under the Miyoo
busybox shell.
Known limitations
- Timings in the README are still analytical or host-measured until on-device
timing.logsamples are collected. - Miyoo Mini Flip: lid/Hall handling unchanged and still unconfirmed on a physical Flip.
Coming from the 0f5bdb4 release? Also included since then (85bc9f2, 747d102)
- Memory leak fixed: every MainUI cache lookup leaked an SQLite connection
(about 570 KB each on a large collection); the GameSwitcher does one per recent entry. - Recent list integrity: a game could be removed instead of a duplicate when a
recent-list entry was longer than 1 KB; duplicates are now removed in one rewrite. - Faster sleep: closing the play session before suspend uses an index instead of
scanning the whole play history. - Faster game launch: about 15 fewer processes when parsing the launch command;
cmd_to_run.shis no longer rewritten on the SD card at every launch. - Faster return to MainUI: the battery icon is regenerated only when the percentage
or the theme changes (it used to decode the theme background and write a PNG every
time); onesyncper cycle instead of two; fewer processes. - Quick switch: one atomic rewrite of the recent list instead of two; a last entry
without a trailing newline no longer merges with the next one. - Network services: after a game, the Wi-Fi setting is read once and services
restart without a globalsynceach. - GameSwitcher play time is computed in the background.
If something breaks (boot, settings lost, launches from search or ports, Play Activity,
Package Manager), please open an issue with your device model (Mini / Mini+ / Flip) and,
if possible, your timing.log.