google huawei bei

博客提供了一个优快云资源的下载链接,地址为http://d.download.youkuaiyun.com/down/586838/szu030606 。
错误信息 `"dtc" is not allowed to be used.` 表明在构建过程中,设备树编译器(`dtc`, Device Tree Compiler)被调用,但当前构建环境或策略明确禁止使用它。 这通常出现在 **Android**、**AOSP** 或某些定制化嵌入式系统(如 MIUI、华为、OPPO 等厂商项目)的编译流程中,尤其是在启用了安全策略或使用了受限工具链的情况下。 --- ### 🔍 错误原因分析 `dtc` 是用于将 `.dts`(Device Tree Source)文件编译成 `.dtb`(Device Tree Blob)的工具。正常情况下,构建系统会自动调用它: ```bash dtc -I dts -O dtb -o output.dtb input.dts ``` 但当你看到: ``` "dtc" is not allowed to be used. ninja: build stopped: subcommand failed. ``` 说明: - 构建系统检测到对 `dtc` 的调用; - 但由于某种限制(如白名单机制、sandbox 隔离、Soong 安全策略),该二进制不允许执行; - 常见于使用 `soong_ui`、`kati`、Google 的封闭构建系统或 CI/CD 流水线中的沙箱环境。 --- ### ✅ 解决方案 #### ✅ 方案 1:改用预编译的 DTB 或禁用手动调用 `dtc` 很多现代 Android 设备不再允许直接调用 `dtc`,而是要求通过官方支持的方式生成设备树。你应该: ##### ✔️ 使用 `device_tree_type` 在 `Android.bp` 中声明设备树 示例:`Android.bp` ```json cc_binary { name: "recovery", device_tree_type: "vendor", srcs: ["recovery.c"], ... } ``` 或者定义专门的设备树模块: ```json device_tree_file { name: "qcom", src: "path/to/qcom.dts", } ``` > 这样 Soong 会使用受信任的封装方式调用 `dtc`,而不是让你直接执行。 --- #### ✅ 方案 2:检查是否在 `Makefile` 中手动调用了 `dtc` 如果你在 `Android.mk` 或 shell 脚本中写了类似: ```makefile $(shell dtc -I dts -O dtb -o $(OUT_DIR)/foo.dtb foo.dts) ``` 这是 **不允许的**!因为: - `$(shell ...)` 在解析阶段执行命令,破坏了 Soong 的依赖追踪; - 直接调用外部程序违反了 sandbox 规则。 ✅ 正确做法是使用 `genrule` 来生成设备树: ##### 示例:使用 `genrule` 替代直接调用 `dtc` ```json // Android.bp genrule { name: "generate_dtb", srcs: ["my_device.dts"], tool: ":dtc_tool", out: ["my_device.dtb"], cmd: "$(location :dtc_tool) -I dts -O dtb -o $@ $<", } // 可选:显式声明 dtc 工具(如果可用) cc_binary { name: "dtc", host_supported: true, srcs: ["dtc/dtc.c"], cflags: ["-Wno-unused-parameter"], system_shared_libs: [], stl: "none", } ``` 这样 `dtc` 就作为受控工具被调用,不会触发“not allowed”错误。 --- #### ✅ 方案 3:启用允许 `dtc` 的构建标志(仅限内部环境) 有些项目提供配置项来控制是否开启特定工具权限。例如: ```bash # 设置环境变量允许 dtc(视项目而定) export ALLOW_DTC_EXECUTION=true ``` 或者修改某个全局配置文件(如 `BoardConfig.mk`): ```makefile # BoardConfig.mk ALLOW_MISSING_DT_FILES := true # 允许缺少 DT 文件(间接避免调用 dtc) BOARD_USES_GENERIC_KERNEL_IMAGE := true # 使用通用内核镜像,跳过 dtb 构建 ``` ⚠️ 注意:这些选项不能解决根本问题,只是绕过,建议优先使用 `Android.bp` + `genrule`。 --- #### ✅ 方案 4:升级或修复构建系统工具链 有时是因为 `prebuilts/misc/linux-x86/dtc/dtc` 缺失或权限不对导致 fallback 到系统 `dtc`,从而被拦截。 ✅ 操作: ```bash # 检查预编译 dtc 是否存在 ls prebuilts/misc/linux-x86/dtc/dtc # 若无,则同步代码或从其他分支复制 repo sync prebuilts/misc # 添加可执行权限 chmod +x prebuilts/misc/linux-x86/dtc/dtc ``` 然后在 `Android.bp` 中引用这个预编译版本: ```json host_executable { name: "dtc", srcs: ["dtc/dtc.c"], defaults: ["libfdt-host"], enabled: false, // 使用预编译版而非自己编译 } ``` --- ### 🛠 总结:如何安全地使用 `dtc` | 方法 | 推荐程度 | 说明 | |------|----------|------| | 使用 `device_tree_file` / `device_tree_type` | ⭐⭐⭐⭐☆ | AOSP 推荐方式,无需手动干预 | | 使用 `genrule` 调用预装 `dtc` | ⭐⭐⭐⭐☆ | 灵活可控,适合复杂场景 | | 手动调用 `dtc`(禁止) | ❌ | 会被 sandbox 拦截 | | 修改构建脚本绕过限制 | ⚠️ | 不推荐,影响 CI/CD 稳定性 | --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值