Skip to content

v1.0.15 binder fix confirmed working, but still failing on Samsung One UI 2.5 (Android 10) — uid 2000 permission rejection #53

@TheDreDay1000

Description

@TheDreDay1000

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:

  1. 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
  2. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions