|
|
## 现象
执行 `source build/envsetup.sh && breakfast xuanyuan-userdebug && mka` 编译小米 15 Ultra(代号 xuanyuan,骁龙 8 Elite / SM8750)自定义 ROM 时,在编译中后期出现以下报错:
```
FAILED: out/target/product/xuanyuan/obj/ETC/sepolicy_policy.conf_intermediates/sepolicy_policy.conf
/bin/bash: line 1: out/target/product/xuanyuan/obj/ETC/sepolicy_policy.conf_intermediates/sepolicy_policy.conf: No such file or directory
build/make/core/base_rules.mk:397: recipe for target 'out/target/product/xuanyuan/obj/ETC/sepolicy_policy.conf_intermediates/sepolicy_policy.conf' failed
```
或更常见的变体——sepolicy 阶段静默失败,随后 `make` 在合并 system.img 时崩溃:
```
ERROR: platform_system_sepolicy 31: Could not load policy file: out/target/product/xuanyuan/system/etc/selinux/plat_sepolicy.cil
```
两个错误的根因相同:device tree 中 SELinux 策略文件与 AOSP 15 分支不兼容,且 xuanyuan 的设备私有策略(vendor/xiaomi/xuanyuan/sepolicy)尚未同步 Android 15 的 `cil` 格式变化。
---
## 背景知识:什么是 SELinux 与 sepolicy
SELinux(Security-Enhanced Linux)是 Android 系统底层的强制访问控制(MAC)机制,由美国国家安全局(NSA)开发并开源。不同于传统的自主访问控制(DAC),SELinux 通过策略规则严格限定进程对文件、网络端口、系统资源的访问权限,即便进程以 root 身份运行也不例外。
在 Android 编译系统中,sepolicy 是 SELinux 策略的编译产物。Android 从 8.0(Oreo)开始引入 Treble 架构,将 vendor 分区与 system 分区解耦,sepolicy 也随之拆分为 `plat_sepolicy`(平台公共策略)和 `vendor_sepolicy`(设备私有策略)两部分。Android 15 进一步强制要求所有策略文件以 CIL(Common Intermediate Language)格式编译,原有的 `.te`(Type Enforcement)文件直接编译路径已完全废弃。
为什么小米 15 Ultra 的编译会触发 sepolicy 报错? 原因在于:小米 15 Ultra 发布于 2025 年 2 月,搭载基于 Android 15 的 HyperOS 2.0,而主流第三方 ROM 社区(如 LineageOS、PixelOS)的 xuanyuan device tree 适配进度滞后于官方固件迭代,导致 device tree 中的 sepolicy 规则与 AOSP 15 的 CIL 编译器之间存在代差。
---
## 深度分析:三类根因详解
### 1. 官方设备树尚未合并 Android 15 SELinux 变更
小米 15 Ultra 发布时间为 2025 年 2 月,官方 kernel 源码仓库(MiCode/Xiaomi_Kernel_OpenSource,分支 `xuanyuan-v-oss`)处于持续更新状态。Android 15 对 SELinux 引入了新的 CIL(Common Intermediate Language)策略格式,原有 `.te` 文件直接编译路径已被废弃。
具体来说,Android 15 在 `system/sepolicy` 中新增了以下关键变更:
| 变更项 | Android 14 | Android 15 |
|--------|-----------|-----------|
| 策略文件格式 | .te 可直接编译 | 必须转换为 .cil |
| mapping 目录 | 可选 | 强制要求 |
| platform_sepolicy | 单文件 | 拆分为 base + extensions |
| vendor_sepolicy 合并 | shell 脚本 | Makefile 内联 |
如果 device tree 中的 `BoardConfig.mk` 仍然使用旧版 `BOARD_SEPOLICY` 变量而非 Android 15 要求的 `BOARD_PLAT_PUBLIC_SEPOLICY_DIRS` / `BOARD_PLAT_PRIVATE_SEPOLICY_DIRS`,编译系统将无法正确找到并编译策略文件,最终导致上述两类报错。
实战案例:2025 年 3 月,XDA 论坛用户 @xiaomifirmware 编译 LineageOS 21 时首次遇到此问题。该用户在 LineageOS 官方仓库的 issue 区(#LineageOS/android_device_xiaomi_xuanyuan #158)反馈,排查后发现 LineageOS 21.0 分支的 `device/xiaomi/xuanyuan/sepolicy` 目录缺少 `mapping/30.0 cil` 文件,而该文件是 Android 15(API level 35)sepolicy 的强制 mapping 文件。社区维护者在收到反馈后 48 小时内推送了修复 commit,验证了"device tree 同步滞后"这一根因。
### 2. proprietary-files.txt 未提取或版本不匹配
xuanyuan 的 `vendor/xiaomi/xuanyuan/proprietary-files.txt` 中包含数十个来自高通 TEE(Trusty OS)的闭源 blobs,这些 blobs 携带内置的 SELinux 策略,与通用 AOSP sepolicy 存在规则冲突。提取失败或版本过旧会导致后续 sepolicy 合并阶段报错。
高通骁龙 8 Elite(SM8750)的 TEE 环境是一套独立的安全操作系统,运行在 ARM TrustZone 安全世界中。与普通 Android 系统不同,TEE 有自己的 TEE OS 策略,这些策略被打包在 `trusty_kernel_encrypted.img` 等 blobs 中。当 AOSP sepolicy 编译器尝试合并 vendor 策略时,如果 TEE blobs 中的策略声明与 AOSP 15 的 CIL schema 不一致,就会触发如下冲突:
```
Could not load policy file: .../plat_sepolicy.cil
Error at 'some_te_statement': neverallow check failed at 'sysfs'
```
---
【标签】
iPhone, 华为, 小米, 手机, 续航, 拍照, 华强北手机, 手机报价, 选购指南
【相关阅读】
- 华强北手机报价与选购指南
- 手机续航优化技巧
|
|