Binder
Priv Kit 通过特权服务端转发 Binder 调用,Android 服务接口由应用提供。
访问系统服务
通过已连接的 Privileged Server,按服务名获取系统服务:
kotlin
val activityBinder = PrivilegeBinderWrapper.fromSystemService("activity")
val activityManager = IActivityManager.Stub.asInterface(activityBinder)
Log.d(
"activity",
activityManager.getTasks(1).toString(),
)部分服务只能在 shell 或 Root 服务端进程中获取:
kotlin
val binder = PrivilegeBinderWrapper.fromSystemService(
serviceName = "miui.mqsas.IMQSNative",
source = PrivilegeSystemServiceSource.SERVER_PROCESS,
)将资源绑定到服务端生命周期
部分 Binder API 接收 owner 或 death token,以便远端进程在 owner 退出时释放资源。 如果资源应当跟随当前 Privileged Server 进程,可以使用专用的服务端生命周期 Binder:
kotlin
val serverInfo = Privilege.getServerInfo()
val serverLifecycle = serverInfo.lifecycleBinder
serverLifecycle.linkToDeath(
{ Log.d("server", "Privileged Server 已退出") },
0,
)该 token 在服务端被替换前保持不变。Privilege.serverState 变化后重新获取;未连接时 getServerInfo() 抛出 PrivilegeServerUnavailableException。
处理调用失败
Core 控制调用和 Binder wrapper 在特权服务不可用时统一抛出 PrivilegeServerUnavailableException。wrapper 没有连接时会在发送事务前抛出该异常;实际事务异常原样传递。
如果服务端或 UserService 的 Binder 调用失败后可以安全地改用其他方式,可以使用 PrivilegeBinderCall.orElse(...):
PrivilegeBinderCallFailure.ServerUnavailable表示 Privileged Server 不可用,exception的类型为PrivilegeServerUnavailableException。PrivilegeBinderCallFailure.BinderDied保留原始DeadObjectException。 对于转发事务,仅凭该异常无法确定死亡的是特权服务还是目标端点, 不应仅根据这一分类将特权服务标记为断开。- 其他异常保持不变。
该工具也可以包住挂起调用、命令结果收集和 UserService 操作。连接失效异常直接传播; 工具不会搜索嵌套 cause,也不会自动重试。取消、权限错误、普通 I/O 失败及命令超时 不会进入 fallback。
orElse(...) 适合原调用结果未知时仍可安全恢复的场景。服务进程可能已经完成修改后 才死亡。