Thor v1.96.3 Release Notes
Version 1.96.3 (1963) is a hotfix for Shizuku system-app freezing on affected devices,
including Xiaomi builds that refuse disabling a system app for the current Android user.
It restores the removal fallback with a persistent opt-out and improves freeze/restore diagnostics.
It also makes the Extensions confirmation sheet scrollable on small screens and in landscape
(issue #518).
These public release notes include all changes since
v1.96.1 through 7994cf40,
including the App Ops, scrollbar and Japanese-language changes delivered in 1.96.2 development
builds. Since the latest development release,
v1.96.2-dev-89,
the range contains the Shizuku hotfix and web/CI dependency updates. The release also
reconciles dependency updates already merged to the beta branch.
✨ Highlights
- 🧊 Restore affected Shizuku freezes. When Android refuses disabling a system app,
Thor can remove it for the current Android user and reinstall it on Unfreeze.
System app removal fallback is on by default when no saved choice exists. A saved off
choice stays off across updates. Find the option in Settings → Freezer. - ⚠️ Understand the fallback. It retains the app's data files, but app-managed accounts
may be lost. It applies to manual and automatic freezes. Turning the option back on after
opting out requires confirmation. - 📜 Reach the Extensions confirmation controls. The warning, answer field and buttons
scroll together when the screen is too short to display them all, including in landscape. - 🛡️ App Ops in Permission Manager. Inspect Android operations and change supported
package or UID modes with Root or Shizuku. Thor reads changes back before confirming them. - ↕️ Draggable scrollbars help navigate long Apps and Freezer lists or grids.
- 🇯🇵 Japanese support is available in the app's language selection.
What's Changed
🧊 Shizuku system-app freeze and restore
PR #521, addressing
issue #519
(04d51a5e, d17ac998, 63f31e43; merged as 7994cf40):
- Thor first tries the existing Binder disable and
pm disable-userpaths. Only a
policy-refused Shizuku system-app disable can usepm uninstall -k --user N, and only
while the removal fallback setting is enabled. Ordinary command/transport failures,
user-installed apps, Root and Dhizuku do not use this fallback. - A healthy local preference store with no saved choice defaults to enabled, including on
upgrades. Explicit off choices persist and are checked when queued work executes. The setting
is device-local and excluded from backups, so restoring other settings cannot override it.
Unreadable preferences disable the fallback; corruption recovery persists an off choice. - Unfreeze reinstalls packages removed for the current user. Restoration of legacy removed
packages remains available even when the fallback is off. - Queue history preserves distinct disable-refused, disable-failed and restore-failed reasons.
Diagnostic logs retain both shell output streams. Unrelated root-availability probes no longer
mark Shizuku tasks as degraded; task warnings follow commands actually executed for that target. - Shizuku launches
shfor either server identity, allowing the child process to inherit the
server UID without an unnecessary nestedsudependency.
📜 Extensions confirmation on small screens
PR #523, addressing
issue #518 (a1d522bf):
- The Extensions acknowledgement sheet now scrolls vertically, so its warning, answer field,
Accept button and Cancel control remain reachable in short windows and landscape. - The arithmetic confirmation and saved consent behavior are unchanged.
🛡️ App Ops in Permission Manager
PR #511
(f06b540d, 06373e87, 26f57ac0, 76f0cba4, 699fe66a, 1ef6de96):
- A separate App Ops tab discovers operation names, controlling switches, linked permissions,
defaults and reset support from the running Android build. Search and the Relevant,
Changed and All filters make long catalogs easier to inspect. - Root or Shizuku can read and change supported package- or UID-scoped modes for the current
Android user. Thor verifies the requested scope after writes, reports uncertain results and
offers a separate reset-to-platform-default action. Shared-UID edits warn about other affected apps. - Runtime-permission-controlled operations stay read-only in App Ops, with a path to Permissions.
Unknown policy blocks potentially conflicting edits. Parsing handles supported mixed Xiaomi
operation output, and the editor sheet dismisses when swiped down from its title.
↕️ Draggable scrollbars in Apps and Freezer
PR #510
(7df4c174, 664808ec, ebd93039, 5ae8ab7d):
- Drag scrollbar thumbs through long lists and grids, with a bubble showing the visible app
range and accessibility progress controls for navigation. - The expanded drag target and responsive spacing preserve grid columns and nearby row/card
taps. Dragging remains stable when the item count changes. Sort-aware snapping is a follow-up.
🇯🇵 Japanese localization
PR #513 (bfc594cf):
- Adds Japanese strings across the app, including App Ops, backup, settings and Store features,
and exposes Japanese in the supported language picker and Android locale configuration. - Updates locale tests and contribution guidance. The hotfix also supplies its new messages in
all nine app locales and aligns Japanese wording with the existing Unfreeze terminology.
🔧 Project: distribution, dependencies and follow-up tracking
- PR #512 (
ca46642f,29a3138d)
prepared 1.96.2 development release notes and addeden-GBFastlane metadata for Play's
primary listing. This release provides the complete 1.96.3 Play/F-Droid changelog in every
Fastlane locale. - PR #494 (
c68810c2) synchronized
the Shizu listing with production 1.96.1. Its changelog is synchronized to a new version after
production promotion; the listing follows the public/releases/latest/APK. - PR #514 (
6888e96a) refreshes
dependencies, removes compiler warnings and records scrollbar design prototypes.
PR #499 (265d3b0e) updates Fastlane;
PR #507 (c358263f) updates Coil. - Release reconciliation includes PR #498
(6ed949d2), retaining the beta branch's devalue 5.9.2 fix.
PR #515 (37f97ae6) is also joined
into the release history; development already carries its Fastlane update and a newer
compatible Rubyzip version, which are retained when resolving the lockfile. - Web dependency updates are in PR #500
(45f3eb83) and PR #516 (fe319596).
CI action updates are in PR #501
(69131bcd) and PR #517 (f770cd59). - PR #506 (
0b5360c9,a2502252,
3e58535b) and PR #508 (ab3e98d6,
fb214ae2) reconcile README and follow-up reports with shipped behavior and remaining checks.
The production-history reconciliation is recorded in6e2df990.
🧪 Validation scope and remaining device checks
For release preparation, ./gradlew test lintFossDebug lintStoreRelease passed on
Zulu JDK 21.0.12.1: 3,098 unit tests per flavor, zero failures, errors or skips,
and no lint warnings or errors. The release-note budgets, 13 shell test files, and
35 release-routing tests also passed. After reconciling the beta branch, the Android gates
passed again; the website passed all 304 tests and its production build with no diagnostics.
The Shizuku hardware checks recorded below were not repeated for release preparation.
The Extensions regression tests verify scrolling to the answer and controls, incorrect-answer
rejection and correct-answer acceptance in portrait, landscape and reduced-height viewports.
On a disposable API 37.2 emulator at 480 × 854 pixels and 240 dpi, the old build reproduced the
clipped controls. The fix allowed scrolling to both actions in portrait and landscape and
successful acceptance; the challenge and answer survived rotation. Portrait also worked with
the keyboard open. In landscape, Gboard left only a 51-pixel viewport, so pressing Done to hide
the keyboard was needed to fully expose the controls. The reporter's Android 13 Jelly Star has
not been tested; the reporter has been asked to verify the next build.
The issue #519 device record
and PR #521 report these checks for the hotfix:
- POCO F7, Xiaomi.eu, Android 16/API 36, Shizuku ADB mode (UID 2000): Android refused
disabling the authorized Wallpaper Carousel fixture. Legacy restoration with the option off,
refusal without removal when off, and foreground-queue freeze by removal followed by Unfreeze
succeeded. The fixture was returned to its original removed state. - Fresh API 37.2 emulator, Shizuku ADB mode: shell identity, disable/enable, gateway and
foreground-queue round trips passed. Disabling worked on this build; removing a system app
for a user required root. This is device/ROM-specific behavior, not a blanket Android-version rule. - The PR records
./gradlew test lintFossDebug lintStoreRelease, debug/instrumentation builds,
confirmation UI checks, and preference regressions for the default and persistent opt-out.
Its reported post-default-change run had 3,093 unit tests per flavor and no test failures or
errors. Read-failure/corruption opt-out coverage was added in the review follow-up. - Limits: the reporter's exact HyperOS build was not tested. Root-backed Shizuku was not
live-tested after the shell-launch change. Account retention was not tested: the fixture was
not an account provider. The checks do not establish a common cause for every reported
unfreeze failure or compatibility with every vendor restriction. - App Ops still needs broader acceptance for scoped Shizuku writes, Android 9, secondary/work
users, shared UIDs and additional OEM formats. Scrollbar sort-aware snapping and remaining
physical-device gesture checks are tracked separately.
🛠 Commits Log
Complete non-merge history in chronological order: 29 commits from v1.96.1..7994cf40.
The release-preparation commit adds version 1963 and these notes.
c68810c2fix(shizu): sync complete changelog to production 1.96.1265d3b0echore(deps): bump fastlane from 2.239.0 to 2.240.1 in the fastlane group45f3eb83chore(deps-dev): bump the web group in /web with 2 updates69131bcdchore(deps): bump ruby/setup-ruby in the actions group0b5360c9chore: refresh Thor documentation and AGP versiona2502252docs: distinguish partial Samsung fix from shipped work3e58535bdocs: qualify extension catalog hash verificationc358263fchore(deps): update Coil to 3.6.3ab3e98d6docs: mark shipped installer and bulk follow-upsfb214ae2docs: reconcile follow-up index and reports with shipped work7df4c174feat: add draggable scrollbars to Apps and Freezer664808ecfix: tighten grid scrollbar spacing without losing columnsebd93039feat: use responsive scrollbar spacing in lists and grids5ae8ab7dfix: preserve scrollbar drag when item count changesf06b540dfeat(permissions): add verified App Ops manager06373e87fix(app-ops): support mixed Xiaomi operation responses26f57ac0fix(app-ops): explain runtime restrictions and restore editor input76f0cba4fix(app-ops): filter relevance by manifest permissions699fe66afix(app-ops): guard unknown policy and reveal linked permissions1ef6de96fix(app-ops): make editor title swipe dismiss sheetca46642fchore(release): prepare v1.96.229a3138dchore(release): add en-GB Fastlane metadatabfc594cfi18n: add Japanese app localization6888e96achore: refresh dependencies, fix warnings, and save scrollbar prototypesfe319596chore(deps): bump the web group in /web with 5 updatesf770cd59chore(deps): bump the actions group with 2 updates04d51a5efix(shizuku): restore consented system-app freeze fallbackd17ac998fix(shizuku): enable removal fallback by default and preserve opt-outs63f31e43fix(shizuku): preserve removal opt-out on preference read failures
Additional beta-branch history reconciled for promotion:
6ed949d2chore(deps): bump devalue37f97ae6chore(deps): bump rubyzip in the bundler group across 1 directory
Hotfix added during release preparation:
a1d522bffix(extensions): make consent sheet scrollable on small screens