v1.0.15 binder fix confirmed working, but still failing on Samsung One UI 2.5 (Android 10) — uid 2000 permission rejection
Device: Samsung Galaxy S9+ / One UI 2.5 / Android 10
Affected apps: AppOps, MT Manager (and likely others)
Status after v1.0.15
The binder delivery fix in this release is correct — ProviderDiscovery now finds *.shizuku providers and sendShizukuBinderToAllClients() runs on startup. The binder is reaching apps that were previously skipped entirely. Good fix.
However, apps still cannot use the Shizuku compat layer on Samsung One UI. The failure now happens at the next layer: when apps try to actually invoke Shizuku API methods after receiving the binder.
Root cause (Samsung-specific)
The release notes mention ColorOS/OxygenOS for the uid 2000 does not have android.permission.xxx error. Samsung One UI hits the exact same wall, but through Knox's permission enforcement layer rather than ColorOS's.
When ShizukuServiceIntercept executes privileged calls as uid 2000, Samsung Knox checks uid 2000 against its own permission allowlist for operations like:
android.permission.GET_APP_OPS_STATS
android.permission.OBSERVE_APP_USAGE
android.permission.INTERACT_ACROSS_USERS
Knox rejects these even for uid 2000. Real Shizuku bypasses this because its server process calls adoptShellPermissionIdentity() at the Java framework level before these checks run, establishing a different execution identity. Stellar's ShizukuServiceIntercept is a shim that doesn't replicate that identity setup, so Knox sees a raw uid 2000 call and blocks it.
What would fix this
The fix needs to be inside ShizukuServiceIntercept — specifically, it needs to mirror what Shizuku's actual server does when handling API calls from client apps on OEM-customized ROMs:
- Before executing any privileged operation on behalf of a client, call
ShellUtils.exec("pm grant ... android.permission.xxx") or equivalent to self-grant required permissions to the calling app where OEM restrictions would block it
- Or: detect OEM (Samsung/ColorOS/OxygenOS) at runtime and apply a different execution path that pre-elevates the necessary permissions before the Knox/OEM layer sees the call
The binder delivery is now solved. This is the remaining blocker for OEM devices.
Happy to provide logcat output from the S9+ if that helps narrow down the exact permission(s) being rejected.
v1.0.15 binder fix confirmed working, but still failing on Samsung One UI 2.5 (Android 10) — uid 2000 permission rejection
Device: Samsung Galaxy S9+ / One UI 2.5 / Android 10
Affected apps: AppOps, MT Manager (and likely others)
Status after v1.0.15
The binder delivery fix in this release is correct —
ProviderDiscoverynow finds*.shizukuproviders andsendShizukuBinderToAllClients()runs on startup. The binder is reaching apps that were previously skipped entirely. Good fix.However, apps still cannot use the Shizuku compat layer on Samsung One UI. The failure now happens at the next layer: when apps try to actually invoke Shizuku API methods after receiving the binder.
Root cause (Samsung-specific)
The release notes mention ColorOS/OxygenOS for the
uid 2000 does not have android.permission.xxxerror. Samsung One UI hits the exact same wall, but through Knox's permission enforcement layer rather than ColorOS's.When
ShizukuServiceInterceptexecutes privileged calls as uid 2000, Samsung Knox checks uid 2000 against its own permission allowlist for operations like:android.permission.GET_APP_OPS_STATSandroid.permission.OBSERVE_APP_USAGEandroid.permission.INTERACT_ACROSS_USERSKnox rejects these even for uid 2000. Real Shizuku bypasses this because its server process calls
adoptShellPermissionIdentity()at the Java framework level before these checks run, establishing a different execution identity. Stellar'sShizukuServiceInterceptis a shim that doesn't replicate that identity setup, so Knox sees a raw uid 2000 call and blocks it.What would fix this
The fix needs to be inside
ShizukuServiceIntercept— specifically, it needs to mirror what Shizuku's actual server does when handling API calls from client apps on OEM-customized ROMs:ShellUtils.exec("pm grant ... android.permission.xxx")or equivalent to self-grant required permissions to the calling app where OEM restrictions would block itThe binder delivery is now solved. This is the remaining blocker for OEM devices.
Happy to provide logcat output from the S9+ if that helps narrow down the exact permission(s) being rejected.