Skip to content

Releases: krilikd-factory/AutoSystemBoost

ASB-V64

Choose a tag to compare

@krilikd krilikd released this 17 Sep 20:59
e6d41ce

AutoSystemBoost — V64 Release Notes

Release V64 Previous V63 versionCode 640

OnePlus 15 OnePlus 13 OnePlus 12 Ace 5 and Ace 6 Verified delivery

V63 made the module tidier. V64 asked whether the tweaks reach the system at all. The answer was unpleasant: several subsystems had been writing correct files to paths nothing reads, and whole installer sections were skipped in silence. Most of this release is repairing delivery — then using the freed confidence to cut real power draw with measurements instead of intuition.

Battery results still depend on display time, signal quality, applications, Bluetooth route and ambient temperature. V64 reports what it measured on the reference device and names what it cannot fix.


V63 → V64 at a glance

Area V63 V64
Internal check pass ratio 69% 97%
WebUI tweaks 55 63
DEEP_IDLE current (measured) 140 mA 50 mA
sysfs reads per governor tick 19 2
Foreground probe up to 3 popen/tick cached, activity-tiered TTL
Watchdog, screen off every 300 s every 1800 s
fsync on the tick path 3 files none
Files changed — 103 changed, 52 added

Delivery: tweaks that were never applied

This is the core of the release. Each item below was a tweak that built its file, verified it, passed every internal check — and was read by nobody.

  • Camera, Wi-Fi and audio overlays landed outside the live tree. The destination was built as system/<source>, and ${src#/system} strips a prefix that does not exist for /vendor/etc/audio or /odm/etc/camera. On these devices /vendor and /odm are separate mount points, not symlinks into /system. Four sites across three subsystems, all corrected to mirror the live path while keeping the system/ variants for devices where /odm really is a symlink.
  • Feature flags were resolved 2000 lines after their first use. The ASB_* block sat at line 2735; the first [ "$ASB_CAMERA" = "true" ] test runs at 711. Every category check was false, and whole sections — audio, camera, network, kernel — were skipped without a word. The installer then rewrote features.conf from the same empty variables, producing zeros that shipped in the next build and reproduced themselves on every install.
  • Camera tone grading: four defects in one chain, each hiding the next — wrong destination, a per-file destination list consumed after its loop closed, the grading block running before that list was filled, and _cam_get defined inside a conditional so it did not exist at the call site.
  • The retouch app list broke when the camera path was corrected. Two consumers still pointed at the old system/... location and silently injected into nothing.
  • qdisc never reached the mobile link. The interface filter required operstate = up; rmnet is virtual over the modem and the kernel leaves it at unknown for its whole life. A single fallback to fq was added for kernels lacking the requested qdisc, instead of leaving the link on pfifo_fast.
  • The night modem gate targeted paths that do not exist. Two releases of the IPA gate matched nothing; the lookup now follows /sys/class/wakeup by the name the kernel itself reports.
  • Bluetooth absolute-volume output had no section, so its line printed under whichever heading came last — usually CAMERA.

Correctness

  • GAMING fired without a game. GPU load and a busy CPU describe video playback, map rendering and an animated feed just as well. The state carries the loosest rails in the ladder, so a false positive spends power on a workload that never asked for it. Entry now requires the Smart package table to agree; devices without package detection keep the old behaviour.
  • Thermal lean was inverted. Warm buckets raised the ceiling instead of lowering it, so every thermal decision worked against its own purpose. The stored model is reset on upgrade because its conclusions point the wrong way; the measurements are kept.
  • Learner showed "no data" on non-English interfaces. The profile was read from the visible label, which is translated, and compared against English tokens. Every comparison against that variable was affected, not only the learner.
  • A disputed thermal sensor now buys more confirmation, never less safety. Where the control source is uncorroborated, load-driven transitions need one extra tick; thermal escalation still acts immediately.
  • LPM mode comparison used pointer equality on string literals — a silent no-op that made mode changes invisible.
  • Debug log capture failed on first press. A lock whose PID was never recorded could not be reclaimed, so the next attempt reported "already running".
  • A trial of a value already set now refuses with a reason instead of a bare "could not start".

Battery and heat

  • Background uclamp tier in DEEP_IDLE: 29% → 18%. The GPU was already pinned and the CPU rails were low, but a waking sync job could still ask the scheduler for a third of peak capacity with the screen off. Measured on device: 140 mA → 50 mA. Top-app and foreground are untouched, so unlocking is exactly as fast as before.
  • The module stopped loading the CPU in its sleep. Screen-off raised swappiness by 20 unconditionally, costing 3.2 GiB of zram compression in a single DEEP_IDLE phase — CPU work done while the phone should be asleep, decompressed again on wake. The gate is now memory PSI: swap when tasks actually stall on memory, not when the screen goes off.
  • Prime cluster during quiet screen-off background work: 1665 → 1401 MHz. Gated on a quiet run queue, because the data showed this state also covers sync bursts that genuinely want prime cores.
  • Active cooldown clamp. A phone that falls asleep warm is pulled to hardware minimum until it cools, with entry and exit both logged so the night capture shows how long it held.
  • DSP gain backs off with heat — 1200 mB above 55 °C, 800 above 60. Two steps rather than a curve: continuous gain movement is audible as pumping.
  • Light thermal trim requires a sustained deficit. Headroom is a vendor estimate that moves on its own; trimming on a single dip was an action taken on noise that then had to be undone.
  • FSM oscillation. Confirmation windows for the MODERATE↔HEAVY and MODERATE↔SUSTAINED pairs; field transitions fell from 99 to 24 per capture.

Module overhead

V63 V64
Watchdog, screen off 300 s 1800 s
Network loop, screen off 120 s 600 s
Doze helper every 600 s always screen-off only
Reconcile fixed interval backs off when nothing drifts
fsync per tick state + conflicts + learner none
sysfs reads per tick 19 2
Foreground probe up to 3 forks/tick cached, 8 s / 25 s / 120 s by activity

Governor timers are disarmed with the screen off and re-armed on wake; the calm tick cadence now covers 50% of screen-on time instead of 3%.


New controls

  • Keep Apps In Memory (mglru_hold) — working-set protection via min_ttl_ms on MGLRU kernels. The one lever in this area the kernel actually honours: the lru_gen_config property a third-party module ships is already ignored here, and disabling the Android 14+ collector is a downgrade, not a tune.
  • Bluetooth link stability (bt_link_stability) — codec and interval policy for unstable links.
  • Network handover controls (net_handover_fast, net_handover_active, net_wifi_leave_rssi, net_avoid_bad_wifi) — Wi-Fi to mobile transition behaviour, off by default.
  • Radio policy switch (radio_policy_enable) — explicit opt-in before any cellular control is touched.
  • Media guard (smart_media_guard) — keeps Smart from treating playback as idle.
  • vendor_passive_clamps — the clamp count after which the module stops fighting for the cap. Previously hardcoded at 20, tuned against a single ROM.
  • GMS freeze level max — Icing, Fitness and Romanesco components; checkin deliberately excluded.
  • Automatic config reload — the governor watches the file's mtime. A WebUI save of a governor-owned key used to sit inert until reboot, and the diagnostic had to print instructions to reload by hand.
  • Settings trials — put a risky control on probation for 12 hours with automatic revert.
  • Named config profiles, snapshot import validation and a separate Smart Learning reset.

Diagnostics

  • Devices that refused to suspend are reported separately from wake sources. A refusal is worse: a wake source did its job and let go, while a refusal means the phone never went down at all. In a tester's report this immediately named the culprit — the Wi-Fi chip, 49 refusals in one capture.
  • Wake sources say whether they can be gated. One device had 28 radio sources and not one with a runtime-PM handle, which means the night modem gate cannot help there. Now stated plainly instead of left to inference.
  • Module cost is published: transitions, physical writes, readbacks, ...
Read more

ASB-V63

Choose a tag to compare

@krilikd krilikd released this 20 Aug 20:16
c66af1d

AutoSystemBoost — V63 Release Notes

Release V63 Previous V62 versionCode 630

OnePlus 15 OnePlus 13 OnePlus 12 Ace 5 and Ace 6 Capability-gated policy

V63 is the largest ASB refinement since V62. It adds new user controls for sleep, GPS, wake-locks, networking and performance; a tiered thermal-budget engine; safer device-specific gating; and an evidence chain that explains every major decision. V63 is designed to reduce unnecessary heat and energy use without replacing required performance with blind caps.

Actual battery-life gains depend on display time, signal quality, applications, Bluetooth/audio route, ambient temperature and the length of true screen-off periods. V63 therefore reports its evidence instead of promising one fixed percentage for every device.


V62 → V63 at a glance

Area V62 release baseline V63 release improvement Practical result
Thermal control Device-aware limits, but no P0 validation of an implausible selected thermal source. Validates socd against CPU peers, falls back to a real CPU zone, records confidence and revalidates the primary source. A false vendor thermal report cannot become a fake 90–95°C governor input.
Performance tuning Per-device frequency scaling and profile limits. Adds Performance Ceiling (60–100%), a tiered thermal budget and optional Observe / Shadow mode. Users can trade peak headroom for cooler, calmer sustained use without fixed model tables.
Sleep-side power Quiet Night and V62 Doze controls. Adds Act on Wakelocks, Trim Background GPS, Quiet Radio at Night and screen-off classification. V63 can identify or selectively address the app/radio work that prevents real sleep.
Networking Network buffers, qdisc and restore-aware baseline. Adds Spread Network Load (RPS) and Transmit Queue controls. Fast Wi-Fi can distribute softirq work; loaded wireless links can reduce queueing latency.
Audio / DSP V62 repaired DSP routing and output safety. Adds route-aware offload evidence, Bluetooth reconnect trace and conflict-first audio verdicts. DSP remains usable while diagnosis stops making unproven offload claims.
Multi-device safety V62 removed fixed OP15 frequency assumptions. Adds capability manifest, device tiers, exact-fingerprint property domains and lease arbitration. Unknown devices degrade safely instead of receiving copied property packs.
Configuration writes Validated config updates. Adds atomic linked thermal writes, config backup/preview, writer provenance and legacy-state recovery. New controls and valid slider values work even after an older retained config.
Upgrade path Config schema 17. Tested schema-17 → schema-18 additive migration with backup and idempotence. A V62 update preserves existing choices and adds V63 controls safely.
Release build integrity A release-only pre-build check could require the next GitHub release asset before the first build produced it; selective packaging could also omit a tool that ZIP validation required. update.json is strictly post-build OTA metadata, while the release package contract now proves that every required tools/ runtime helper is copied back after the developer-tool exclusion. The first V63 build has no dependency on a future asset or manifest contents, and required diagnostic/runtime tools cannot silently disappear from the flashable ZIP.

New V63 tweaks and controls

Battery, heat and performance

Performance Ceiling

New WebUI control: Performance Ceiling (perf_ceiling_pct, 60–100%, default 100%).

This is a proportional ceiling over the profile’s own device-correct CPU/GPU limits. It does not substitute one fixed frequency table for all phones and it does not raise the profile floors that keep scrolling and audio responsive. For example, 90% is a mild everyday reduction; 75% is an explicit battery-first trade-off for travel or light use.[1]

Setting What V63 changes Safety boundary
100% Keeps the selected profile’s normal limits. Default; no extra ceiling.
95–90% Applies a modest proportional cap. Suitable for calmer everyday use when peak benchmark speed is not needed.
85–75% Applies a clearer sustained-performance trade-off. Better suited to travel, charging or battery-first intent.
70–60% Strong conservative cap. Available only as an intentional user choice; it is not selected silently.

Adaptive Thermal Budget — enabled by default

V63 adds a tiered thermal-budget engine, operating before the hard thermal cap is raised. It evaluates available thermal headroom, skin trend, temperature rise rate and battery-current evidence. Instead of jumping directly from unrestricted performance to a hard restriction, it can apply a light, moderate or severe trim and holds that choice for a dwell interval to avoid oscillation.[2]

The shipped policy is deliberately bounded:

V63 thermal-budget control Default Purpose
thermal_budget_enable 1 Enables adaptive pre-cap response.
thermal_budget_light_headroom_pct / thermal_budget_light_trim_pct 70% / 8% First gentle response while headroom is narrowing.
thermal_budget_moderate_headroom_pct / thermal_budget_moderate_trim_pct 45% / 18% More visible response for sustained pressure.
thermal_budget_severe_headroom_pct / thermal_budget_severe_trim_pct 25% / 32% Conservative response before hard thermal protection dominates.
thermal_budget_dwell_s 30 s Prevents caps from rapidly moving up and down.

Camera activity receives special treatment: a light budget response is not allowed to undermine a protected camera deadline. Hard thermal safety and platform thermal limits always retain priority.

Observe / Shadow mode and intent presets

V63 introduces shadow_mode: ASB calculates and records its policy decision but avoids policy writes. It is intended for diagnosis and validation before a new policy is trusted on a device. This is available through the observe intent preset rather than as an aggressive default.[3]

The new asb_intent.sh helper supplies safe-writer-backed presets for daily, camera, game, travel, charging and observe. Presets use already validated V63 knobs; they do not edit governor.conf directly or bypass its full semantic validation.[3]


New sleep, GPS and wake-lock controls

Act on Wakelocks

New WebUI control: Act on Wakelocks (wakelock_action, default off).

V63 always observes significant wake sources when the kernel exposes them. When this control is enabled, an application must satisfy multiple safeguards before V63 acts: it must be user-installed, hold a relevant partial wakelock through a long screen-off interval, and the device must demonstrably remain awake. The action is Android’s reversible restricted bucket; V63 does not force-stop the app and never targets kernel/system sources, the modem, display, alarms, sensors, authenticator, dialer, SMS, messaging or clock apps.[4]

Trim Background GPS

New WebUI control: Trim Background GPS (gnss_trim, default off).

V63 targets a narrow case: a third-party app that continues holding location while cached and screen-off. It limits that app to coarse location only while the condition persists. Foreground use, navigation, fitness/route tracking, emergency/finding functions and protected classes are excluded. Permissions are not revoked; full access returns when the app leaves the cached state, and all ASB restrictions are restored when the control is disabled or ASB is removed.[5]

Quiet Radio at Night

New WebUI control: Quiet Radio at Night (night_modem_idle, default off).

This control works inside the learned/configured night window and only while screen-off. It changes keepalive/probe timing so fewer background sockets wake the modem path. It does not power the radio off, and it does not suppress calls, SMS or high-priority push. The explicit trade-off is that a polling application can be later until morning; users who rely on polling instead of push should leave it disabled.[6]

Screen-off classifier

V63 adds a read-only asb_screenoff_class observer. It distinguishes genuine sleep from screen-off audio, VPN/tunnel activity, GNSS-held work, charging and other confounders before anyone attributes drain to CPU policy. The classifier writes no system node and changes no user policy in this release cycle.[7]


New network controls

Spread Network Load

New WebUI control: Spread Network Load (net_rps, default stock).

V63 can direct receive-packet work to the efficiency cluster (little) or all available cores (all) when the device exposes the relevant queue nodes. On high-throughput Wi-Fi, this can prevent one core from being pinned by softirq work. On a slow link, waking extra cores can cost...

Read more

ASB-V62

Choose a tag to compare

@krilikd krilikd released this 05 Aug 08:35
568eb19

AutoSystemBoost — Changelog

V62 V61 versionCode

OP15 OP13 OP12
Ace 6 Ace 5 any OnePlus


V62 — nothing is on until you turn it on

Nine new settings, a per-device CPU rework, a scheduler that stops asking for maximum, and
a first install that finally does nothing until you ask it to.

Nothing is on until you turn it on

A clean install applies no power profile at all and leaves every switch at stock. Eleven
settings used to ship enabled, so the module had opinions about your phone before you had
opened its interface once. The home screen shows not selected until you choose.

Upgrades are unaffected: your profile and every setting carry across, including through an
uninstall-and-reinstall.

CPU limits that fit the device

The frequency caps were OnePlus 15 numbers applied to every model. On a OnePlus 13 — whose
policy0 covers six cores and whose frequency table contains no 1190400 at all — the cap
could not hold, six cores ran unrestrained, and the phone ran hot. Owners of the 15 and Ace 6
saw nothing wrong, which is why it took field reports to find.

Caps are now scaled to each device's own frequency table and snapped to steps it really has.
The half that writes them reads that file too, which it previously did not.

And a cap of "45%" now means 45%. Turning a percentage into a frequency picked the
nearest step below the target, and frequency tables have gaps: on a OnePlus 13 prime
cluster, 45% landed on 39%. Those percentages were tuned from field feedback, so a sixth
harder than the tuned number is a different setting wearing its name — and a prime pinned
below what the work needs pushes that work onto the little cluster for longer.

Related: when something outside ASB raises a cap back up, that is now recognised as a
conflict and backed off from, instead of being counted as ASB's own work and fought all day.

Scheduler no longer pinned to maximum

sched_util_clamp_min ships at 1024 on OxygenOS — every task may demand full capacity, and
the vendor boost framework does. Frequencies stayed high regardless of real load. ASB now
caps that ceiling at the running profile's own top-app minimum. Idle, reading and music are
where you will notice; genuine load still gets what it needs.

Heat and battery: three causes found in field captures

With the screen off, the governor now goes quiet on every profile. It used to do that
only for Battery: on Balanced and Performance it kept polling sensors every five seconds
with the anti-clamp armed, screen off or not. Two captures show the cost — idle at 83%
CPU-awake and charging-idle at 100%, against a 5% target, with 274 of 416 throttle events
landing while charging. That last part is the module and the vendor thermal engine writing
over each other, and on a OnePlus 13 it was enough for OxygenOS to disable its own display
enhancement with "device overheated".

Camera hold is bounded now. Holding the clocks up while the camera streams stops a
dropped frame in a burst or in 4K60 — those last seconds to minutes. A video call streams
the camera identically for forty minutes, and the hold had no limit at all. It releases
after three minutes, or as soon as the CPU reaches the profile's own throttle point,
whichever comes first. Real load still raises the clocks on its own, so a recording that
needs them keeps them.

Video playback has its own GPU ceiling. It was the single highest-drain phase in a
capture — 25.4 %/h against 14.2 %/h for gaming on the same phone, with the CPU nearly idle
and the GPU at 55%. It was also the one high-GPU case with no ceiling of its own. The
decode block does the work and the GPU only composites, so a ceiling above what compositing
needs still saves a ramp to maximum that nothing asked for.

New settings

Freeze Google Components Disables telemetry, reporting and ads components inside Play services. GMS itself stays enabled — push, sign-in and payments keep working. Reversible per component.
Google Services Trim Narrows what Play services may do in the background, without freezing anything.
Deep Sleep Doze tuning that covers the light phase as well as deep — the phase that actually runs while a phone is in a pocket.
Trim Doze Exemptions Removes user-installed apps from the list that lets them ignore Doze. Never touches the dialer, SMS, clock or your root manager.
Animation Speed A real setting instead of a side effect of the power profile.
DSP Outputs Restricts the audio effect to chosen outputs, so headphone gain stops boosting the loudspeaker.
Headphone Volume Limit The EU volume cap is no longer removed silently. Off by default, with the hearing warning stated plainly.
Background Process Limit Android's phantom-process killer, controllable.
Athena Background Killer OxygenOS has its own background app killer, and it is why a messenger left in the background stops delivering notifications until you reopen it — no battery whitelist fixes that, because it is not Android's Doze. Disables the deciding component only; the rest of the package keeps running. Costs RAM and a little drain.

Fixes

  • Throttling temperature stayed where you put it. Two separate boot paths rewrote it, so
    a deliberate 55 came back as 70 — and on a hot-idling device the correction could produce
    values outside the slider's own range. The slider also allowed points a phone can never be
    below: a OnePlus 15 idles at 48 °C on the hottest CPU zone, so a 36 °C point meant
    throttling was permanently on — which makes a phone hotter, not cooler. The floor is 52 °C,
    and a value stored by an older build is raised to something this device can actually sit
    below.
  • DSP output routing never worked: the effect runs inside the vendor audio HAL, which
    cannot read the module's properties. The decision moved to the component that can.
  • Camera grading no longer compounds across installs.
  • The module card said "Balanced" while the app said "not selected". Two copies of the
    function that writes the card exist, and the one that wins was missing the not-selected
    case.
  • Settings that could not be applied now say so. On some devices the settings command
    fails while still reporting success, so writes looked fine and read-backs returned the
    error text as a value: Bluetooth volume, WiFi scan rate, blur, haptics and the OEM toggles
    were all quietly doing nothing. The module falls back to the content provider and verifies
    every write by reading it back.
  • Values from Android 15 and newer parse correctly. Settings started returning
    1, is_preserved_in_restore=true instead of 1, which silently broke every comparison in
    the module.
  • Skip lockscreen has been removed. It could only ever work below Android 11 — above that
    the keyguard ignores the setting it wrote, so it stored perfectly and did nothing. Anyone
    who had it on gets their original setting back automatically.
  • Installs from CI failed with a missing-file error that pointed at the wrong file
    entirely. There were two copies of the installer and the dead one was being packaged over
    the live one.
  • Blur no longer flashes off for a moment the first time the app drawer opens.
  • OEM toggles are recorded before install and put back once afterwards, so RAM expansion
    stops re-enabling itself on machines where the user keeps it off.
  • Network auto now means the value your phone shipped with, captured before ASB touches
    anything, rather than a value ASB picked.
  • Two failed boots remove ASB's display properties automatically.
  • config.disable_rtt removed. It disabled Real-Time Text — an accessibility feature for
    deaf and hard-of-hearing users — for no measurable saving. Inherited from a build.prop list
    that has circulated since the early 2010s.
  • db.log.slow_query_threshold set to a large positive value. At -1 logging was off by
    accident of implementation; at 0 it logged every query.

Interface

  • 11 languages, up from 2: English, Russian, Ukrainian, German, Spanish, Portuguese,
    Turkish, Indonesian, Italian, Arabic, Chinese. Translations live in webroot/i18n/*.json,
    so contributing one no longer means editing a 4700-line file.
  • Every card states when it takes effect, and the confirmation that appears agrees with it.
  • Aggressive settings say what will stop working, next to the switch rather than in a wiki.
  • DSP Outputs reads USB and BT in English instead of wired and bt — these phones
    have no headphone jack, so "wired" meant the USB-C port all along.
  • The Smart panel is shown only while Smart is the running profile.

Under the hood

  • The learner reads the temperature and drain history it had been recording and ignoring, and
    compares against this device's own median rather than absolute degrees.
  • `a...
Read more

ASB-V61

Choose a tag to compare

@krilikd krilikd released this 31 Jul 09:03
033463a

AutoSystemBoost — Changelog

V61 V60 versionCode

OP15 OP13 OP12
Ace 6 Ace 5 any OnePlus


V61 — settings you can see

Installs over V60 the usual way — your settings carry across.

V60 had 16 settings. V61 has 41, spread over six categories instead of four. Several
things the module used to change quietly now either ask you first or are not done at all.


🌐 New category: Network

Nine settings that did not exist before.

Download Ramp — how the phone builds up speed while downloading. On mobile data and on
weak Wi-Fi bbr usually wins: it paces to the speed actually available, whereas the classic
cubic reads radio interference as congestion and throws away speed for nothing.

You can set it separately for Wi-Fi and for mobile, and both apply at the same time
rather than taking turns: the algorithm is attached to the route itself, so there is nothing
to switch when the network changes.

Packet Queue — how the phone shares the connection between apps. fq_codel suits most
people: video stops stuttering when something is downloading in the background.

Network Buffers — how much data goes out in one burst before the first reply. The
smart mode measures your link — negotiated speed, MTU, radio type — and sizes it for you:
larger on a fast link, left at the factory value on a weak one, because a big burst there
only causes the losses it was meant to avoid.

Wi-Fi Region — decides which channels your phone may use, and that sets the ceiling on
link speed. CR opens the widest set.
Using channels not permitted where you are is your own call.

Wi-Fi Scan Rate — for when Wi-Fi clings to a weak access point as you move around.

If your kernel cannot do something — stock kernels usually lack bbr — the card says
"not supported" rather than pretending it applied.


🎨 New category: Interface

In V60 the System section mixed two unrelated things: what you see and what the system
does. Everything visual moved into its own category.

Skip Lockscreen While Unlocked — when Android's "Lock after screen timeout" is set, the
phone is already unlocked for those seconds, yet OxygenOS still asks for a swipe. Now it can
wake straight back to where you were.

Done carefully: the setting changes neither whether the device locks nor when — that
stays Android's decision. It refuses to run if you have no secure lock, or if your lock is
immediate.


📷 Camera: real control instead of one slider

V60 had a single processing setting. There are now six: grain, contrast,
portrait AI, low light, and hold performance while the camera runs — the last
one stops a dropped frame in the middle of a burst or a video.

The processing scale is twice as long. The old maximum was the middle of what the engine can
do, which is why the effect was hard to notice.


🔋 Battery and heat

Throttling Point — when the module starts holding performance back for temperature.
Stock uses your device's own trip point, read from the CPU thermal zone at boot, not a
number guessed for phones in general. Smart starts from the same place and adjusts itself.
Manual pins exactly what you set, and nothing moves it.

Quiet Night — overnight the module stops polling and lets the device sleep deeper.

No Game Mode on Battery Profile — on that profile a game counts as ordinary load rather
than a reason to raise clocks.

Auto Battery profile now switches at exactly 20% and returns at 21%, instead of 19% and
30%: the number in the setting matches the number on the battery icon.


🔊 Audio

DSP Compressor, Bluetooth Audio Offload, and DSP loudness now up to +25 dB
instead of 20.

About Bluetooth: if your headphone equaliser does nothing, move encoding to the CPU — then
the equaliser can see the stream. It costs a little battery.

Raising the gain is safe: the output is bounded by construction rather than by that number.
The soft limiter cannot mathematically exceed its ceiling, so the extra decibels change how
dense the sound is, not how clean.


📳 Vibration

Separate strength for alerts and for touch feedback — V60 had neither.


📝 Logging, and a way to switch it off entirely

Log Detail was a developer knob; it is now a real choice, and the numbers moved.

  • Stock — the module does not touch your phone's logging at all. This is the only value
    that leaves it exactly as the ROM set it, and the card stays dim to say so.
  • 0 — extreme. Cuts device logging and debug output as far as it goes: log buffers
    shrunk, tag levels silenced, vendor debug traces off. It saves the disk writes and the
    wakeups logging costs. It also makes almost any bug report from the phone useless,
    including one you might send us — so it is for people who have finished troubleshooting,
    not for people about to start.
  • 1 — normal. Exactly what the module always did; this is what used to be called 0.
  • 2 — detailed. Learner updates and screen transitions. Turn this on before sending a
    log about battery behaviour.
  • 3 — verbose. Fills the log quickly; only while reproducing something specific.

Extreme mode is reversible: everything it changes is recorded before the first change and
put back the moment you leave it. Nothing here is a one-way door.


🩹 What stopped breaking

"Cards" and "Simple" in Recent Tasks Manager. The module disabled task snapshots — which
are exactly the thumbnails the Cards style draws. Without them OxygenOS hid the whole
selector. It happened unconditionally, whatever settings you had chosen, so the only way to
get the option back was to remove the module. Snapshots are left alone now, and anyone
already affected is repaired automatically — it takes two reboots.

Turning blur off no longer flattens Recents. They were two separate settings tied
together for historical reasons.

Simplified effects are offered on the OnePlus 15 only. On other models that setting
removes the Cards/Simple selector from Recent Tasks Manager and the phone does not put it
back on its own - a OnePlus 13 owner lost the option and could not work out where it had
gone. The setting still exists where its effect is reversible; elsewhere the button is
simply not shown, and anyone already on it is moved back to normal automatically.

Settings no longer vanish on update. Some of them — the whole camera section, vibration,
the whole network section — were saved in one place and restored from another, so updating
the module quietly reverted them to defaults.

Profiles were applied only partly: an internal profile variable stayed empty, so some of
the profile's settings never reached the system.

Camera processing compounded with itself when installing over an existing copy —
saturation grew with every install until the picture went lurid.

Audio disappeared after a reboot for some users: the volume tables were delivered by two
mechanisms at once and the two fought.

SystemUI restarted on its own about a minute into every boot — the screen blinked, the
lock screen came back, and status-bar theming from other modules was torn down. It now
restarts only when you press the button.

Throttling temperature did not work everywhere: the value from settings was read on the
Battery profile alone and silently replaced by a built-in one on the other three.

OnePlus 15 was detected as a generic device and given conservative limits.

The diagnostic never shipped in release builds — the script users are asked to run when
reporting a problem existed only in debug versions.


🎛 Smaller things you will notice

  • Six categories instead of four, in less space than the old four took
  • Soft reboot and restart SystemUI buttons beside the normal one
  • Modem LPM, drain, thermal trend and session count on the Smart card
  • Toasts wrap instead of running off the screen, and match their category colour
  • A card is highlighted only when the module is actually changing something
  • The install screen no longer reports settings you did not enable

⚠️ Worth knowing

  • Network settings apply immediately; a few need a reboot, and the card says so
  • Wi-Fi Region re-associates Wi-Fi when changed
  • Camera changes show up after the camera app is restarted
  • Log Detail 0 silences the phone's logs. If you later report a problem, set it back to
    2 first, reproduce, and send the log then
  • A setting that your kernel or ROM cannot do says "not supported" on its card instead
    of pretending to work

ASB-V60

Choose a tag to compare

@krilikd krilikd released this 25 Jul 08:46
5ab140d

AutoSystemBoost — Changelog

V60 V59 versionCode

OP15 OP13 OP12
Ace 6 Ace 5 any OnePlus


V60 — the DSP release

The headline is an audio engine that did not exist before: ASB now ships its own
effect, built from scratch, registered into the device's own effects config and
attached to the global mix. Around it, the audio settings were rebuilt into three
clear choices instead of a pile of flags. Everything else in this release came from
full-day field logs on real phones — a 4K60 recording that stuttered, a prime core
capped at 48 % of its own hardware, and three settings that reported success while
doing nothing at all.

🎚 ASB DSP — a real audio engine

Loudness that the volume curves cannot give you: real gain above unity, with a
soft-knee compressor, automatic make-up and a true-peak limiter so nothing clips on
the way out. dsp_loudness takes any value from 1 to 20 dB; dsp_bass adds a 90 Hz
low shelf at the head of the chain, so the compressor and limiter both see the
boosted low end rather than letting it escape every safeguard.

The engine is shipped twice from one shared core: a legacy effect and an AIDL
port, because Android 13+ binds effects through the android.hardware.audio.effect
AIDL contract and a legacy .so is simply never attached to the stream. A companion
daemon creates the effect programmatically on the global mix — OxygenOS never applies
config-declared post-processing, which is why every session-attached effect stays
silent until you open an EQ app. Moving a slider is handed to the live effect over
binder: no audioserver restart, no drop-out.

🎵 Audio, rebuilt around three clear choices

AUDIO_AGGRESSIVE and AUDIO_EQ_COMPAT are gone. In their place:

  • audio_profile — stock, hifi, or eq_compat (hands the stream to ViPER
    and friends; the ASB DSP steps aside there rather than fighting for the output).
  • audio_dac_hifi — the mixer half on its own switch: Class-H DAC, flat EQ,
    companders off.
  • media_loudness — reshapes the music volume curves themselves, position-
    weighted so the boost lands where people actually listen (40–80 % of travel) and
    the quietest steps stay exactly where stock put them. 100 % is never raised — that
    is unity, and past it you only clip.

📷 Camera hold — 4K60 recording gets its clocks back

The load classifier reads GPU busy and the one-minute loadavg, and a camera capture
lights up neither: the ISP and the hardware encoder carry the work. So the state
machine sat in MODERATE through an entire recording while the pipeline missed its
16.6 ms frame deadline — on one device against a prime cluster declared at 48 % of
its ceiling. ASB now holds interactive caps for as long as the camera streams,
restores the foreground/top-app cpuset to every core, lifts the uclamp.max
ceilings the camera HAL sits under (foreground was never managed at all — and
neither the camera HAL nor the media codec is top-app), and eases swappiness.

Every value is read back before it is touched and restored to exactly what was
found. Thermal protection is untouched: only the soft battery lean is overridden,
the junction hard-limit and the thermal cap still throttle. Set
camera_hold_enable=0 for the old behaviour.

⚡ The prime core is no longer the slowest thing on the phone

On 3- and 4-cluster SoCs the balanced and performance ceilings were capping slot 2 —
the single strongest core. Measured side by side on one device, same profile and
screen state, the prime ran at 48 % of its hardware ceiling instead of 100 %: it
felt sluggish and saved no battery, because the little and mid clusters simply spent
longer at their own caps. Both profiles leave the prime alone again. Battery still
caps it — that profile exists to trade speed away.

🔎 An action screen that says what did not apply

The report was rewritten around one idea: a setting that silently does nothing is
invisible everywhere else. A new NOT APPLIED section checks the system for
evidence that each configured tweak actually landed and lists only what did not —
and it names where things landed, so a report answers its own questions. Alongside
it: live battery lean, learning confidence, thermal veto and night-safe state,
screen-on and idle runtime estimates, and per-section detail for audio, camera,
memory, network, Wi-Fi and GPS.

🧩 Overlay delivery — three settings that reported success and did nothing

  • The DSP effect was registered on the reference device only. Registration now
    runs on every model, covers per-SKU layouts under both audio_effects_config.xml
    and audio_effects.xml, clones the config the framework will actually read when
    the overlay has none, and delivers odm-side files through the fuse-guarded runtime
    bind. persist.asb.dsp.enable is now published on a first install instead of
    waiting for someone to touch the WebUI.
  • media_loudness could only ever be applied by flashing. The curve reshape
    lived in the installer and nowhere else, so changing it in the WebUI wrote the
    config, promised a reboot, and rebuilt nothing. It is now shared code, called at
    runtime, and boot self-heals a table that does not match the setting.
  • The camera configs under /odm were never delivered on a root manager that
    does not magic-mount the odm tree. They now use the same runtime bind the audio
    configs already did.

🎨 WebUI

Every setting card carries its category colour — audio, camera, battery,
performance, UX, display, memory, system — and the confirmation that slides up from
the bottom now echoes the colour of the card you touched instead of the profile
palette. New cards for the audio rework, the DSP sliders, and disable_blur.

🧹 Smaller things

  • Wi-Fi diagnostics no longer assert a regulatory domain ASB stopped forcing long
    ago — that check fired on every device that has ever had a SIM in it.
  • overlay: 0 mounts was never a fault: Magisk mounts in a private namespace, so
    the count reads zero even when the overlay is live. The screen now probes a file
    the overlay actually delivers.
  • Bluetooth adaptive bitrate (SBC/AAC ABR) enabled — steadier links on weak signal.
  • The camera guard's saved state survives a governor restart, so a session that ends
    the hard way cannot leave ceilings raised.

ASB-V59

Choose a tag to compare

@krilikd krilikd released this 13 Jul 08:51
43a08c3

AutoSystemBoost — Changelog

V59 V58 versionCode

OP15 OP13 OP12
Ace 6 Ace 5 any OnePlus


V59 — cooler thermals, quieter nights, leaner games

Full-day field logs drove every change here. The headline is a thermal-decision
rework: ASB was reading a junction sensor that sits at 85–95 °C under any load
and treating it as "hot", so its veto fired constantly during normal use — while
the phone's actual surface was ~50 °C. V59 anchors thermal decisions to
user-facing skin temperature, stops asking the CPU for clocks the vendor clamps
away anyway, and fixes a batch of smaller diagnostics and Bluetooth issues.

🌡️ Skin-anchored thermal veto — no more false throttling on a hot die

The cpu_max sensor (cpu-1-1-1) is a junction/skin-hybrid that reads 85–95 °C
under load, so gating the Smart veto and throttle on it forced battery-lean bias
during ordinary bursts — defeating race-to-idle (which costs heat and drain, not
saves them). ASB now decides on the shell/skin sensor when one is present
(thermal_skin_c, default 47 °C) with a junction hard-limit as a silicon
safety net (thermal_junction_hard_c, default 95 °C). No skin sensor → it falls
back to the original junction gate, so behaviour is unchanged on devices without
one. Genuine skin heat and true silicon emergencies still throttle; a merely-hot
die during a light burst no longer does.

🎮 Gaming CPU ceiling — stop paying for clocks the vendor won't give

In gaming, the smart curve could declare scaling_max up to ~3 GHz, but the vendor
PowerHAL clamps the real clock to ~2.2 GHz regardless — so the extra request buys
zero FPS and only drives brief high-voltage OPP excursions (more heat + drain).
A new gaming_cpu_max_ceiling_khz (default 2.4 GHz, 0=off) caps the declared
max during the GAMING state to just above the vendor's settle point. Applied
across representative and extra physical clusters (OP12's 4th cluster included).

🎧 Bluetooth volume: quiet-after-reboot fixed for every mode

Changing absolute-volume state left BT output quiet until an EQ/ViPER app
re-attached its effect. ASB now re-initialises the audio stack once at boot (waits
for the audio HAL, then restarts audioserver) for all three bt_absvol_mode
values, so the state is live from the first connection. The one-time on → auto
migration that overrode a deliberate choice was removed — your setting now persists
across updates.

📡 Mobile data no longer throttled during active use

The network layer no longer applies its screen-off battery bias while the screen is
on, so foreground data stays at full speed.

⚙️ WALT input-boost now matches the real CPU topology

apply_walt_boost was hard-coded to policies 0 4 7 (the old SM8550 layout);
OP15 (0,6) and SM8650 (0,2,5,7) never matched it, so some clusters were
silently skipped. It now discovers the device's actual cpufreq policies.

🔋 One more idle offender + cleaner diagnostics

com.oplus.oidt (an OPPO diagnostic hourly-timer seen in the wake logs) joins the
rare standby bucket. Diagnostics were tightened too: the full-day report no
longer hides most of the night, the screen-off metric measures the whole night
(not the last hour), a sleep/post_wake unreachable-code path was fixed, gaming
detection now uses a single reader with hysteresis, and update.json points at the
correct release.

💅 Installer & WebUI polish

A refreshed installer banner (multi-device, cleaner section rules) and an improved
WebUI. The ASB signature art stays.


ASB-V58

Choose a tag to compare

@krilikd krilikd released this 09 Jul 11:22
3134f3c

AutoSystemBoost — Changelog

V58 V57 versionCode

OP15 OP13 OP12 Ace 6 Ace 5 any OnePlus


V58 — full support for the Ace family

The headline is simple: Ace 6 and Ace 5 are now fully supported — the same
tuning pipeline as the OnePlus 13 and 12, asbdiag PASS, first-boot clean.

Getting there meant fixing the detection bug at its root instead of guarding
against its symptoms, and rebuilding how non-reference devices receive their
/odm audio. Around that, V58 lands a format-agnostic hi-res audio lifter, an
SoC-aware speaker-gain ceiling, resolution-aware media bitrates, a cooler
thermal envelope, lag-safe CPU bounds for 3/4-cluster SoCs, and an ad-identity
kill that finally cleans up after itself on uninstall.


🛸 Ace 6 bootloop — fixed at the root (issue #8)

What actually went wrong. The OnePlus Ace 6 (ktm, PLQ110 / OP6113) ships on
the shared SM8750 firmware with the OnePlus 13 — its fingerprint and property
set literally carry the sun codename. The installer's SM8750 branch matched
*sun* and concluded "this is an OP13", so Ace 6 was handed the full OP13
reference overlay
, including a magic-mount graft of system/odm. On these
devices /odm is a real partition mount; grafting a directory over it makes the
audio HAL fail before the boot guard can ever run. Hard bootloop.

Earlier releases treated this as a safety problem — fuses, strike counters,
retries. Those helped users recover, but the device was still being
misidentified every single install. V58 fixes the identification itself.

What changed:

  • Explicit sibling exclusion, evaluated first. ktm / plq110 / op6113 /
    ace 6 are matched before the sun test, so Ace 6 can never fall into the
    OP13 reference branch no matter what its fingerprint claims. The same guard
    rail already keeps foreign SM8850 codenames (macan, fairlady, 15R,
    Ace 6T, 15T) out of the OP15 branch, and foreign SM8650 codenames out of
    OP12.
  • The generic path never grafts /odm. system/odm, system/vendor/odm and
    system/my_product are hard-removed from the module tree on every
    non-reference device. Whatever the pipeline generates, an /odm graft cannot
    reach the mount namespace.
  • Real /odm audio is still delivered — as runtime binds.
    asb_generate_odm_binds clones the device's own /odm audio and media files
    into /data/adb/asb/odm_patched/, patches them, copies the live SELinux
    context
    off each original target, and records a manifest. post-fs-data.sh
    replays it with mount --bind on the first boot, before zygote. The /odm
    partition itself is never modified.
  • The fuse can no longer be defeated. The boot counter is now flushed with
    sync before the first bind is applied. Previously a hard early-boot crash
    could lose the cached counter write, turning a recoverable one-strike into a
    permanent loop. A tripped fuse now also clears odm_patched/, its manifest,
    and any staged deferred_overlay.

Result: Ace 6 and Ace 5 boot on the first try, with asbdiag reporting PASS
on the audio and media checks. They are no longer "compatibility mode" devices:
both run the same asb_apply_device_native_tuning pipeline as the OnePlus 13
and 12 — identical audio, camera, media, GPS, perf and Wi-Fi stages, built from
their own stock files. Ace 5 additionally gets device-adaptive CPU bounds enabled
by default (the SM8650 interactive-cluster lean); on Ace 6 they stay opt-in via
the WebUI. The only structural differences left are how /odm is delivered
(runtime binds instead of a magic-mount overlay) and the stricter 1-strike fuse.

Scope, stated plainly. Reference devices (OP15 / OP13 / OP12, matched by
confirmed codename) keep the proven clone-and-patch pipeline and their
3-strike guard. Every other OnePlus gets the device-native /vendor overlay
plus /odm runtime binds under a 1-strike fuse: one failed boot tears the
whole generated overlay out before the module mounts and writes
/data/adb/asb/vendor_overlay_blocked, so the device comes up governor-only
until that marker is deleted.


🏷️ The installer now knows which phone it is

Install logs used to say OnePlus (generic). asb_identify_device resolves a
real name in three passes:

  1. the OPPO/OnePlus retail marketing-name properties
    (ro.vendor.oplus.market.enname and friends) — no lookup needed;
  2. a model / codename / project / fingerprint table — Ace 6, Ace 5, 15, 13, 13R,
    12, 12R;
  3. SoC family (OnePlus (SM8850 / SM8750 / SM8650)), then bare model, then a
    safe default.

The resolved name is printed at install and used everywhere the log previously
said "generic".


🎧 Audio — hi-res that works on every layout, gain that never clips

  • asb_lift_hires_policy — format-agnostic. V57 lifted
    audio_policy_configuration.xml with six exact-string sed rules. They
    matched OP15's comma-separated lists and silently skipped Ace 6's
    space-separated 44100 48000 88200 96000. The new awk lifter walks every
    samplingRates="…" attribute and, where the list already reaches 96000 but
    stops short of 384000, appends the missing hi-res steps
    (176400 192000 352800 384000) in the separator that list already uses.
    Idempotent, per-device sed rules gone, correct on OP15 / OP13 / OP12 / Ace and
    anything future.
  • SoC-aware Digital Volume ceiling. SM8650 / pineapple WCD/WSA
    Digital Volume controls top out at 84 = 0 dB unity; writing the OP15
    value of 88 clips and breaks the speaker path on those devices. The mixer
    patcher now caps at 84 on SM8650 and keeps 88 on sun / canoe.
  • RX HPH Mode is lifted to CLS_H_HIFI from CLS_H_LOHIFI as well as from
    CLS_H_ULP — the runtime tweak layer previously only handled ULP.
  • Diag rewritten to match reality. asbdiag no longer demands the literal
    string 88. It reports the actual peak RX/WSA Digital Volume and fails only
    on an out-of-range value (>88, which would break the speaker path) — so the
    correct-and-different SM8650 tuning reads PASS instead of FAIL.

🎬 Media — bitrate lift by resolution, on the right feature gate

asb_media_lift_file replaces bracket-guessing with resolution-aware targets:

Resolution Target bitrate
1920×1080 37.3 Mbps (40 Mbps on canoe)
3840×2160 100 Mbps
1280×720 floor of 20 Mbps

Lines without an explicit width/height keep the conservative bracket bump for
back-compatibility, and a lift is never allowed to lower a stock bitrate.

The media_profiles patch is now gated on MEDIA rather than CAMERA —
media_profiles.xml controls video encoder bitrate, not the camera HAL, and
users who switched CAMERA off were silently losing it.


🌡️ Thermals — the envelope moves 65 °C → 60 °C

Three thresholds move together, so the governor, the Smart veto and the gaming
relax all agree on what "warm" means:

Setting V57 V58
thermal_throttle_temp (governor.conf, asb_config.h) 65 60
ASB_SMART_VETO_CPU_TEMP_C (asb_smart_defs.h) 65 60
Gaming heat-relax trigger (asb_smart.h) < 65 °C < 60 °C

Trade-off: this buys lower skin temperature and a calmer sustained curve at
the cost of some peak clock during long hot sessions. To restore the old
behaviour, set thermal_throttle_temp=65 in governor.conf.


🧮 CPU bounds — lag-safe lean for 3- and 4-cluster SoCs

OP15/OP13 are 2-cluster parts, and the synthesized bounds derive from their
ratios. On a 3/4-cluster device (SM8650's 1+3+2+1) those raw ratios pin the
main interactive cluster low in battery mode (mid ≈ 41 %, prime ≈ 35 %),
which reads to the user as UI stutter: the scheduler parks interactive work on
the strongest middle cluster and it cannot clock up.

asb_synthesize_bounds.sh now leans every interactive cluster's BATTERY and
BALANCED ceiling upward on >2-cluster devices only (≈ 62–64 % battery,
≈ 82–86 % balanced; prime 62 / 86 / 92). The field-proven 2-cluster OP15/OP13
ratios are untouched. The direction is deliberately the safe one — a higher cap
can only reduce stutter. The cost is some battery, never smoothness.


🔒 Privacy — ad-identity actually silenced, and reverted on uninstall

Built from a full-day telemetry log rather than guesswork, and applied through
device_config — the namespace GMS actually reads:

gms          AdvertisingId__enable_ad_id_reconciliation   false
gms          AdsIdentity__enable_status_service           false
gms          AdsIdentity__enable_mendel_property_update   false
measurement  measurement.service.disable                  true
measurement  measurement.collection.enabled               false
  • com.oplus.oidt jo...
Read more

ASB-V57

Choose a tag to compare

@krilikd krilikd released this 04 Jul 16:49
95c0473

AutoSystemBoost — Changelog

V57 V56 versionCode

OP15 OP13 OP12 any OnePlus


V57 — *network for gamers

Field telemetry from a full evening-night-day cycle on released V56 confirmed
the big fixes landed: idle drain 1.89 → 0.66 %/h, active drain 10.1 →
6.4 %/h
, idle SoC peak 63 → 48 °C, and the vendor-clamp write war fell
from 59% to 24% of ticks — the "boiler" is gone and nights are properly quiet
(7–37 mA in deep idle). V57 builds on that with a scenario-aware network layer
and a few targeted refinements — all within ASB's no-daemons, one-shot,
device-respecting philosophy.

🛠️ Ace 6 bootloop (issue #8): patched overlays for everyone, now with a fuse

The V52 "Ace 6 won't boot" bug came back in V55/V56: detection was still correct
(SM8750 siblings like ktm never match the OP13 overlay), but the unified
pipeline generated a device overlay for every OnePlus, and Ace 6's
ColorOS-based layout bootlooped on its own generated one — twice in the field.
The philosophy stays: modifications are applied as patches to the device's
own files at install; ASB now ships ZERO static vendor files
(the last 49
OP15-shaped shipped statics are gone from the tree — they were being stripped
and regenerated on every supported device anyway). What changes is the safety
model on non-reference devices:

  • Reference families (OnePlus 15 / 13 / 12 by confirmed codename) keep the
    proven pipeline and the 3-strike boot guard.
  • Every other OnePlus still gets the full device-native patched overlay, but
    under a 1-strike boot fuse: a single failed boot tears the whole
    generated overlay out before the module mounts (manifest replay + category
    sweep) and writes a persistent /data/adb/asb/vendor_overlay_blocked, so
    that device — and every future install on it — comes up governor-only until
    the user deliberately deletes the marker to retry. One bounce maximum,
    self-healing, remembered across updates.
  • Upgrading straight from a bootlooping V55/V56 is clean: the failed-boot
    counter persisted in /data/adb/asb, so the very first V57 boot trips the
    fuse before the overlay ever mounts — zero bounces.
    The old guard needed three failed boots and forgot everything on reinstall;
    a hang (rather than a crash-loop) could defeat it entirely. The fuse fixes both.

🌐 TCP: scenario-aware — power-saving in sleep, low latency in games

ASB's network stack was already extensive; V57 fills the remaining gaps and
makes the additions scenario-dependent
, riding ASB's per-profile network
engine (values re-apply on every profile change and on Smart's own internal
shifts):

  • Thin-stream retransmit mode (tcp_thin_linear_timeouts/tcp_thin_dupack)
    — thin streams are exactly the small-packet flows of online games, so linear
    recovery cuts lag spikes after a lost packet. Enabled in balanced and
    performance; disabled in battery, where push connections are the thin
    streams and exponential backoff lets the radio sleep between retries.
  • tcp_rto_max per scenario: 8 s in performance (fastest stall recovery for
    gaming), 15 s in balanced, kernel-default 120 s in battery so a stalled
    connection backs off instead of re-waking the modem all night.
  • Smart follows the day: when Smart's learned battery-bias crosses into
    battery territory (α ≥ 0.8 — nights, low battery), the reconcile loop applies
    the full battery network set (5-hour keepalives, thin-stream off, small NAPI
    budgets) and restores the balanced set when the device wakes back up. Gaming
    under Smart keeps the low-latency set (the gaming heat-relax clamps α ≤ 0.4).
  • tcp_mem set dynamically from the device's RAM (3% / 6% / 10% of pages)
    and the new PLB sysctls enabled where the kernel supports them — these two
    are scenario-independent by nature and stay static.
    All one-shot guarded writes — no qdisc-watchdog or per-interface monitoring
    daemons: a permanent polling loop would contradict the standby work that just
    got idle drain to 0.66 %/h.

🎛️ Device-Adaptive Bounds toggle removed from the WebUI

Everything is decided at install now, so the toggle had no job left: the
installer sets device_bounds_override device-aware (ON on the OP15, where the
synthesized values equal the shipped hand-validated tuning; OFF elsewhere,
where OP15-derived ratios can under-clock UI clusters — the V55 OP12 lag),
the config carry-over deliberately never migrates it, and stale saved values
are scrubbed on upgrade. The WebUI writes config per-key, so removing the
control means the installer's choice simply persists. Power users can still
flip it by editing governor.conf directly.

🧠 Swappiness that actually sticks on OxygenOS

OxygenOS carries its own swappiness scene props
(sys.mem.swappiness_on_launcher, sys.mem.swappiness_on_start,
sys.sysctl.swappiness) and can re-assert them over vm.swappiness. ASB's
per-profile swappiness is now mirrored into those props — but only when they
already exist on the device, so nothing new is created on ROMs that don't use
them. A boot-time zram resize was deliberately avoided: it would fight
OxygenOS's own RAM-expansion management, which ASB already handles.

ASB-V56

Choose a tag to compare

@krilikd krilikd released this 03 Jul 20:07
801c5df

AutoSystemBoost — Changelog

V56 V55 versionCode

OP15 OP13 OP12 any OnePlus


V56 — smarter learning + memory visibility (in progress)

Grounded in 500 real sessions of the module's own telemetry. The headline is a
fix to the environment classifier that was quietly blocking Smart Mode from ever
trusting what it learned, plus the module's first look at memory pressure.

🔥 Smart Mode "boiler" fixed: it was secretly running the PERFORMANCE plan

Two independent reports — "Smart turns the phone into a boiler, Balanced is
always fine" and elevated warmth on the reference device — traced to one bug in
the session planner. Its profile dispatch predates Smart Mode: it matched
BATTERY and BALANCED explicitly and everything else fell into the else
branch — the performance plan. So Smart sessions always ran with full
sensor polling, headroom reads enabled, deep_sleep never engaged, and — the
hot part — the anti-clamp armed: ASB kept re-raising the vendor thermal
engine's clamps (up to 95 °C) in a write war. The field log showed it plainly:
cap_owner=vendor on 59% of ticks, 96–235 mA and a 40 °C surface in
DEEP_IDLE overnight, 63–65 °C SoC peaks in daily use. Smart now plans as what
it actually is — a battery/balanced blend: battery plans when idle or
screen-off
(sparse sensors, thermal divider, deep-sleep on, anti-clamp off)
and balanced plans when active (exactly the profile users report as
running cool). The storm shield also covers Smart screen-off now, which the
old dispatch accidentally excluded.

🧠 Learning unblocked: wake attribution — the user is not "noise"

Two rounds of field telemetry drove this. Round one (500 sessions) showed the
environment classifier calling 64% of sessions "hostile" because active
screen-on use naturally has ~zero deep-idle; the idle-quality verdict is now gated
on the session being idle-dominant (≥50% of tracked time idle). Round two — 43
fresh sessions after the reset — exposed the deeper half of the same bug: 53% of
sessions were rejected as wake_noisy, and every single one had wake_bg=0
—
all their wakes were the user's own screen checks. The model was counting you
picking up your phone
as environment noise. Every learning gate now uses
background wakes (bat_wake_bg) instead of total wake cycles: the environment
classifier's wake-rate, the trust gates and their iq wake-penalty, the
wake-noise/settle causes, the wake_noisy verdict, the clean-night reward, and the
wake-spike anomaly. Screen wakes remain tracked and reported, they just no longer
condemn a session. Replayed against the fresh telemetry: learn-feeding clean
sessions go 10 → 29 (23% → 67%), wake_noisy rejections 23 → 0, and env
"hostile" 19 → ~1 (matching reality: the device's background hygiene is
genuinely clean). Session schema bumped to v16; noisy_dim now records the
bg/screen split so the old-logic shadow stays comparable.

♻️ Learning reset on upgrade — now resurrection-proof

Upgrading from V55 or earlier resets the learned state once (buckets, pstats,
app-heat, session history, auto-battery state) while preserving every user setting
and the device detection. Field data proved the first version of this reset was
being silently defeated: the old governor daemon is still running during
install and re-saves buckets.bin/pstats from memory every ~5 minutes — a
device examined after a "successful" reset held 286 pre-reset bucket sessions
with last_seen timestamps older than the reset marker (this is also why the
WebUI kept showing 200+ sessions). The reset now leaves a pending marker that
service.sh consumes at the next boot, before the governor starts — deleting
the learned state again at a moment when no old daemon is alive to resurrect it.
Devices that already upgraded and got resurrected are repaired by a one-shot boot
sweep (learner state only; the append-only session_history.jsonl survived the
race cleanly and is kept).

📊 Memory-pressure visibility (first step toward memory-aware tuning)

The module recorded nothing about RAM/swap despite memory being a stated priority.
V56 samples /proc/pressure/memory (PSI) every tick and records a per-session
peak pressure and pressured-tick count (mem_psi_peak, mem_press_ticks).
The first cut wrote these into the WebUI status JSON only; field records proved
they never reached session_history.jsonl, so they are now written by the actual
session-record writer too (and stay in the live status for the WebUI). Pure
observation — no behaviour change — but it's the data needed to make memory-aware
decisions in a later release instead of flying blind.

ASB-V55

Choose a tag to compare

@krilikd krilikd released this 01 Jul 08:12
8498fbf

AutoSystemBoost — Changelog

V55 V54 versionCode

OP15 OP13 OP12 any OnePlus


V55 — device-adaptive: per-device CPU bounds + device-native vendor overlays

The "works properly on more than one phone" release. Two shifts underneath it:
CPU ceilings now scale to the installing device's real hardware, and per-model
vendor tuning — audio, camera, media, GPS, Wi-Fi — is built live from each
device's own stock files
at install instead of shipping pre-baked overlays.
Net result: 76 fewer files shipped, and any OnePlus (not just the 15/13/12)
gets real tuning. Cumulative over V54 — all settings and learned data carry across.

📱 Device-native vendor overlays for every OnePlus

Dropped all pre-baked per-model overlays (canoe/alor audio SKUs, canoe
media_profiles, static camera tone, op12/op13 overlay sets — 79 files). A single
clone-and-patch pipeline now runs on every OnePlus: it clones the device's own
stock audio (keeping its real SKU + codec-specific controls like the canoe
HiFi/DS2/Audiosphere set), camera tone, media_profiles, GPS, perf and Wi-Fi
WCNSS, then key-patches only known values (volume→88, flat EQ, Class-H DAC, video
bitrate, GPS protocol keys, thermal/boost ceilings). Every file comes from the
device itself, so it can't mismatch its HALs. Non-reference models (Ace / T / R
series) now get full audio/camera/media/GPS/Wi-Fi tuning instead of governor-only.
OP12 keeps its system/odm camera carve-out (that path SIGABRTs its multicamera
HAL). The old OP15 volume fix (volume_listener / audio_pre_processing) is now
derived from the device's own cloned audio_effects — added only if missing,
skipped when ViPER is present — so it needs no static file either. A manifest plus
3-strike bootloop self-recovery tears the whole generated overlay back out if the
device fails to boot three times, returning it fully stock.

⚙️ Device-adaptive CPU frequency bounds

At install, asb_synthesize_bounds.sh reads the device's real per-cluster
cpuinfo_max_freq, scales the OP15 reference ratios onto it, and snaps to real
frequencies from each cluster's own table; the governor loads these over its
compiled defaults at boot. Topology-aware for 2/3/4 clusters (so a 3-cluster SoC
like the OP12 gets its middle cluster a sane ceiling), range-guarded, and
revertible — an absent or malformed bounds file just leaves the compiled defaults.
On the OP15 itself the synthesised values equal the defaults, so it's unchanged.

🔬 Install-time device analysis

New asb_install_probe.sh inventories the device's specific stock files (CPU
topology, GPU back-end, audio SKU + mixer/effects, camera/media presence, Wi-Fi
WCNSS, GPS, perf) and writes a report the installer summarises and asbdiag
surfaces. Pure observation — modifies nothing — so per-device patching is auditable
and a returned field bundle shows what was patchable on a device we don't own.

🔎 Standby tuning from real wakelock data

A full-day OP15 capture named the top idle wakeups; the GMS activity-recognition
background sampling interval is now lengthened via the existing wakelock-throttle
pass (doesn't disable location, foreground unaffected). An overnight capture
confirmed idle drain dropped ~7.9 %/h → ~1 %/h. A few OnePlus bloat services (HTMS
ads, Market auto-upgrade check, Pictorial telemetry) are now bucketed to rare —
restricted, not disabled; push is left alone.

🌐 Connectivity check + fewer debug daemons

Captive-portal check now uses Cloudflare generate_204 with a gstatic/Google
fallback instead of the slower Google-only check (fixes spurious "no internet" on a
working connection). Developer-only daemons (crash/ramdump collectors, ostatsd,
qseelogd, mqsasd, bootstat, cnss_diag, …) are stopped on boot. Removed seven
redundant Bluetooth system.prop entries (one pinned a longer LE scan interval).

🎞️ WebUI: transitions, toast layering, slider-vs-swipe

All page transitions unified onto one easeInOutCubic curve and trimmed to 0.32 s —
same smooth motion, quicker. Fixed toasts appearing under the Config page (they
were z-index 100, below the page's 120; now 1000, above everything). Fixed dragging
a Config slider flipping the page — the swipe handler now ignores gestures that
start on a control. Removed the Device-Adaptive Bounds toggle (it's always-on now;
edit governor.conf to override).

🎥 OP15 1080p recording bitrate

Bitrate lift is now resolution-aware (parses each <Video> line) so 1080p lands on
40 Mbit and 4K on 100 Mbit. On-device data confirmed recording already gets 40 Mbit
via /vendor/etc/media_profiles*.xml; asbdiag had been reading the camera's own
/odm copy, which sits on a read-only opex partition the module can't touch, and
falsely failing. It now checks the overlaid framework file.