github Amiga500/Onion OnionPlus-v4.4.0-beta-20260925-9f688d3c
OnionPlus V4.4.0-beta-20260925

latest releases: RedOnion-v4.5.0-20261106-3d9f2add, RedOnion-v4.5.0-20261106-e7657bc0, RedOnion-v4.4.0-20261027-6cbd9b07...
one month ago

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.json is 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.json reads).

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.json could 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 of cJSON_Delete()).

Under the hood

  • runtime.sh: fork-free get_full_resolution_path, get_info_value and a new
    sysjson_get (falls back to jsonval for 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.sh helper (dash and bash
    POSIX mode), load_settings behaviour, and play_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.log samples 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.sh is 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); one sync per 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 global sync each.
  • 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.

Don't miss a new Onion release

NewReleases is sending notifications on new releases.