4.2 KiB
P11 B0:同机跨 app 的 client 能否走 unix + 共享内存(真机)
2026-09-29,Redmi 2f7cbe2e(Adreno 830,Android 16 / HyperOS),代码 82467823。server = trace APK #1(top.mobilegl.plugin.trace,untrusted_app:c83);client = adb shell 里的 retrace 可执行文件(shell)与 trace APK #2(top.mobilegl.plugin.b0.trace,untrusted_app:c84)。只记录、不设门。原始数据 ~/w7/notes/p11/evidence/b0/,报告 ~/w7/notes/p11/b0-report.md。
结论
SELinux 挡的是连接这一步。 另一个安全上下文里的 client 连不上 server app 的 @abstract 端点:unix_stream_socket connectto 被拒,shell → untrusted_app:c83 与 untrusted_app:c84 → c83 都一样。一旦连上(用 root relay 代替 broker),现有代码就走 SharedSegments(7 个 fd 经 SCM_RIGHTS:4 个段、3 个门铃),c84 读写、mmap c83 的段都没有拒绝,ssim 1.0。数据面与协议都不用改,缺的是跨上下文的连接中介。
| client → endpoint | 连接 | 数据面 | ssim(openra / rd12) |
|---|---|---|---|
shell → @mglb0 |
拒(avc: denied { connectto } … scontext=u:r:shell:s0 tcontext=u:r:untrusted_app:s0:c83,…) |
— | — |
APK #2 → APK #1 的 @mglb0 |
拒(类别不同) | — | — |
| APK #1 自己的 client → 自己的 server | OK | SharedSegments | 1.0 |
| shell / APK #2 → tcp loopback | OK | Stream | 1.0 / 0.99988 |
root → @mglb0;shell、APK #2 → root relay → @mglb0 |
OK | SharedSegments,7 fd | 1.0 / 0.99988 |
线程落位决定 shm 是否更快(Espryt rd12 稳态 fps)
| 落位 | tcp | shm |
|---|---|---|
| 默认(5 次) | 45–52 | 26 |
| server apply 线程在 cpu6、client 在 cpu7(3 次) | 54.5 | 118.0 |
默认下 apply 线程亲和两个大核(auto = 0xc0)且自旋,外部 client 的 GL 线程落到同一对核上。干净落位时 shm 与 P10 的 app 内 shm(120 fps)相同,openra Espryt 491 → 903。Magma rd12 在各臂都受 server 限制(默认 19 tcp / 23 shm)。
B1 要做的(按代码)
| # | 件 | 依据 |
|---|---|---|
| 1 | server app 里导出、校验调用方的 bound Service,把 client 的两条已连接套接字经 Binder 交出(最简:Service 自己连两次自己的端点,同 app 允许) | MobileGLServerService.onBind 今天返回 null;唯一入口是 Listen + AcceptPair |
| 2 | client 端点接受已连接的 fd(如 fd:<control>,<aux>) |
ClientSession.cpp:846-855 今天只收 fork / tcp:// / unix: |
| 3 | client 侧能调用 bindService 的引导:有 Java 的 client(FCL、启动器)直接用;Termux 一类原生程序没有 Context,要伴生的 helper(如 app_process)——待用户裁定 |
原生进程没有 Context;AServiceManager 只到系统服务 |
| 4 | 按身份配对控制与辅助连接,不按到达顺序 | F2(下) |
| 5 | 外部 client 使用期间 server 进程不被冻结 | F1(下) |
| 6 | 外部 client 会话的亲和 / 自旋策略 | 上表 |
| 7 | broker 上的调用方认证(unix 端点今天没有令牌) | Handshake.h AuthenticatePeerToken 无令牌即通过 |
顺带查出
- F1 HyperOS 熄屏冻结整个 server uid(
frozen uid = … reason=screen off),FGS 进程、supervisor 与会话子进程同一 cgroup,在飞的会话 120 s 后Fatal{BarrierTimeout}。FCL 的同机用法也会碰到。 - F2
AcceptPair按到达顺序配对(SocketTransport.cpp:373-420;产品的 TCP 路径本来就按身份配对——一条控制连接、数据连接按 nonce 绑定——受影响的是 unix 端点与非--serve的一次性 TCP server;已修,P11 PAIR,ID-P11-12):ServerControlActivity的就绪探测是一次空的connect()+close(),2 s 内会与下一个真 client 的控制连接配成一对,会话读到探测的套接字后退出;两个 client 同时连也会交错。 - 构建:
-Pmobilegl.apkSuffix只改文件名;包名由-Pmobilegl.applicationIdSuffix决定。 - 工具提交
72926a88(p11/b0):tools/device_bench/disagg/fdrelay.c,root 的字节 +SCM_RIGHTS中继,B1 broker 的替身。