Root My Galaxy 0.3.52
SHA-256: b88564fc2065d0fab6d78e6cd58184bb202083aa6ff2ccb1fa29b6b91840eeeb
Changes since v0.3.51.
What's changed
- #42 Fix install lifecycle races and Shizuku permission hangs
Full changelog
Detailed pull-request notes for all changes included in this release.
#42 — Fix install lifecycle races and Shizuku permission hangs
Problem
A manual Shizuku install could appear frozen at Support profile: ... even while the install coroutine continued in the background. The initial refresh() performs native/network work; coroutine cancellation is cooperative, so a late return could still publish Ready/Support profile after install() had already started. A second issue allowed requestPermission() to suspend indefinitely if the Shizuku permission callback was lost.
Fixes
- Add
InstallDiscoveryGate, a synchronized generation gate that serializes discovery-state publication against install startup. refresh()now catches probe/discovery failures explicitly, rethrowsCancellationException, checks cancellation after blocking work, and can publish UI state only while its generation remains current.install()invalidates/cancels discovery both before startup and once its active Job is visible, covering the tiny assignment race as well.install()checks cancellation after blocking history/repository work and no longer converts coroutine cancellation into a normal install failure.- Shizuku permission waiting is bounded to 30 seconds. If the callback times out, the app performs one final active Binder permission refresh and accepts an already-granted permission; otherwise it fails explicitly instead of hanging forever.
- Add unit coverage for stale discovery invalidation.
Scope / safety
No payload code changed. No changes to CZG3 60 ms FOPS timing, 120 s uptime gate, P0, offsets, retries, cache-gate retry, observer, mutation handling, or fail-closed behavior. No workflow files changed.
Validation
- Reviewed the complete PR diff against main.
InstallDiscoveryGatecompiled locally withkotlinc.- Verified against kotlinx.coroutines 1.11 API that the permission bridge uses the public cancellation-safe
resume/resumeWithExceptionpath; noInternalCoroutinesApiis used. - Full Android/Gradle build was not run in this environment because there is no usable repository checkout/Android dependency set here.
- No GitHub Actions workflow was created, modified, or triggered.