Files
MobileGL/docs/Disaggregated/notes/p11/HSPIKE.md
T

24 lines
2.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# P11 B1 预探针:无 Context 的 `app_process` helper 能否经 Binder 拿到连 server 的套接字(真机)
2026-09-29,Redmi `2f7cbe2e`(Android 16 / HyperOS),代码 `2fcde6eb`(PAIR 之前)。报告 `~/w7/notes/p11/hspike-report.md`,证据 `~/w7/notes/p11/evidence/hspike/`,工具提交 `59a5ceeb`(`p11/hspike`,保留到 B 落地),未提交的 `fd:` 端点补丁 `evidence/hspike/fd-endpoint.diff`。
## 结论:两条路都通,原生路线可行
| 路线 | helper 所在上下文 | 结果 |
|---|---|---|
| (a) | `adb shell app_process`(`u:r:shell:s0`) | 通;openra ssim 1.0,rd12 0.99988(Espryt)/ 0.999884(Magma) |
| (b) | 从 APK #2 的进程 exec `app_process`(`untrusted_app:c84`,代表 Termux 一类) | 通;同上 |
| 令牌错或缺 | 两条路 | 按名拒绝("token mismatch" / "no expected token configured"),不给 fd、不起会话 |
**链路**:helper 自建 Binder → 经隐藏接口 `IActivityManager.broadcastIntentWithFeature`(与 `am` 同路,参数按类型填)发**显式广播** → server app 里导出的 broker 核对 IPC 令牌 → 连两次自己的 `@mglb0`(同 app 允许)→ 两个 client 端作为 `ParcelFileDescriptor` 回给 helper → helper 清 `FD_CLOEXEC`、带 `MOBILEGL_IPC_CONTROL=fd:<control>,<aux>` `execve` 原生 retrace client。跨类别把 c83 建的套接字交给 c84 使用,无任何 avc 拒绝(补上 B0 §6 #1 未验证的一项)。
**依赖 ROM 的前提**:直接跑的 `app_process` 不是 zygote fork 出来的,不受 app 的隐藏 API 黑名单约束,所以 `IActivityManager` 可用;若某个 ROM 对它也强制执行,原生路线就断——`am broadcast` 这类命令带不了 Binder,没有替代。
## 顺带查出(B1 要处理)
| # | 现象 | 对 B1 的意义 |
|---|---|---|
| 1 | 从 app uid 调 `pm path` 查 server APK 被包可见性过滤;但 c84 的 `app_process` 用 APK #1 的 `base.apk` 作 `CLASSPATH` 能正常加载,显式组件广播也不需要可见性 | 无 Context 的 client 缺的只是"发现";由 server 界面生成可复制的启动命令(APK 路径、组件、令牌) |
| 2 | HyperOS 熄屏约 7 s 后冻结 server uid,在飞会话 120 s 后 `Fatal{BarrierTimeout}`;helper 的 Binder 在 `execve` 之后就没了,保不住 server。冻结也会落到 client app 上,路线 (b) 的 rd12 要靠 root 解冻才跑完 | 防冻结要另想办法(前台服务 + 文档化的每 app 电池设置),并且门要在用户能达到的拓扑下量 |
| 3 | 路线 (a) 默认落位 23.5 fps → 手工定核 118.5(与 B0 的 26 → 118 一致,helper 与 `fd:` 在数据面上零成本);路线 (b) 两种落位都约 49:退到后台的 client app 被 HyperOS 关进小核 `/background` cpuset,调用方的 `taskset` 无效 | server 侧的亲和 / 自旋策略是最大的杠杆;client 在前台时才有大核可用 |