尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

为什么 type 要动 2~3 个 device.te?

为什么 type 要动 2~3 个 device.te? public根本不是一个“应用程序”而是一张【跨分区的公共通告牌】之所以要改动多个device.te是因为 Android 8.0 之后引入了Treble 分区隔离架构System 分区与 Vendor 分区隔离。下面用最通俗的比喻一次性为你彻底理清public与vendor的区别以及它们各自包含什么一、 形象的比喻公共大厅 vs 部门私有办公室把整个 Android 系统的 SELinux 策略想象成一座大楼┌─────────────────────────────────────────────────────────────┐ │ SELinux 策略大楼 │ ├─────────────────────────────────────────────────────────────┤ │ 1. public/ (公共大厅 / 告示栏) │ │ * 所有人System 侧 和 Vendor 侧都能看到并引用的公共类型 │ ├──────────────────────────────┬──────────────────────────────┤ │ 2. private/ (System 侧办公室)│ 3. vendor/ (MTK 侧私有办公室)│ │ * 只有 Google/System 进程 │ * 只有 MTK 内部驱动进程 │ │ 自己能看的私有策略 │ 自己能看的私有策略 │ └──────────────────────────────┴──────────────────────────────┘1.public公共大厅 / 跨分区契约它不是程序而是一个权限可见性范围Scope。规则凡是在public/device.te声明的类型如type ttyGS_device相当于挂在了大楼的公共告示栏上。谁能用跑在 System 分区的应用如m和跑在 Vendor 分区的驱动如 MTK USB HAL都能看见、都能引用。2.vendorMTK 芯片厂商私有领地包含什么包含 MediaTek联发科硬件驱动专用的私有策略如 MTK 摄像头 HAL、电源管理、USB 底层硬件驱动等。规则写在vendor/device.te里的类型相当于锁在 MTK 自己的私有抽屉里。谁能用只有 MTK 自己的 Vendor 驱动进程能用。跑在 System 分区的 App如mpos根本无权跨界去读取 MTK 抽屉里的东西二、 应用与进程的归属对照表它们分别包含哪些类别运行的分区包含哪些典型应用 / 进程能访问public吗能访问vendor私有类型吗System 侧 (system_app)v_sys(System 分区)m(key.apk)、设置 (Settings)、SystemUI、桌面 (Launcher)可以✅不可以❌ (被 Treble 隔离挡住)Vendor 侧 (vendor_init)u_sys(Vendor 分区)MTK USB 驱动 (vendor.usb_default)、摄像头 HAL、相机/音频底层服务可以✅可以✅ (自己家抽屉里的东西)三、 为什么动一个节点要同时改public/device.te和vendor/device.te这就是你最困惑的地方看完下面的推导你就彻底明白了原厂MTK最初的做法MTK 最初把ttyGS_device定义在自己的vendor/device.te抽屉里。你遇到的问题你的mpos跑在system_appSystem 分区。m想要去 open/dev/ttyGS2但是在编译 SELinux 时system_app根本看不见 MTKvendor抽屉里的ttyGS_device跨分区访问被 Treble 机制直接拦截编译报错你的解决办法提升为 Public为了让m能合法访问你必须把type ttyGS_device从 MTK 的vendor私有抽屉里拿出来挂到public/device.te这个公共告示栏上。为什么要删掉vendor/device.te里的旧定义因为你已经把定义挂在公共告示栏public上了。如果 MTK 自己的vendor/device.te抽屉里还留着同名的type ttyGS_deviceSELinux 编译器secilc在编译时就会重名冲突直接大喊Error: Duplicate type declaration of ttyGS_device!类型重复定义错误总结public不是程序而是“允许 System 侧 App 和 Vendor 侧驱动共同引用的公共声明区”。vendor包含 MTK 的底层的驱动但它的私有策略对 System 侧的mpos隔离不可见。把类型定义从vendor移到public必须在public里新增、同时在vendor里删掉这是防止 SELinux“重名报错”的标准语法要求
返回列表