如何构建运行AOSP 11的Headless(无头)无显示模式
AOSP 11 无头模式(无显示)运行修改方案
以下是除虚拟显示适配器外,可修改的代码/配置位置,适配Omni ROM + RPi4场景:
1. 内核及启动参数修改
- 在内核启动cmdline中添加参数
androidboot.headless=1,同时移除所有RPi4显示相关的启动参数,如vc4.fkms_force_hotplug=1类的显示强制启用配置 - 裁剪内核配置,禁用RPi4的显示驱动:将
CONFIG_DRM_VC4、CONFIG_FB_BCM2835设置为n,避免内核尝试初始化不存在的显示硬件 - 添加启动参数
drm_kms_helper.disable=1,直接关闭DRM显示框架的内核加载逻辑
2. 原生服务配置修改
- 修改设备目录下的
SurfaceFlinger覆盖配置,在frameworks/native/services/surfaceflinger/SurfaceFlinger.rc中添加属性配置:setprop ro.surface_flinger.headless 1,让SurfaceFlinger跳过物理显示设备检测流程 - 修改
init.rc中与显示相关的等待逻辑,删除wait_for /dev/graphics/fb0类的触发条件,避免启动阶段因等待不存在的显示设备超时 - 在设备
build.prop中添加配置ro.config.headless=1,标记系统为无头运行模式,供上层服务读取判断
3. 框架层逻辑适配
- 修改
WindowManagerService源码,在frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java的初始化逻辑中,添加无头模式判断:如果ro.config.headless为1,跳过显示设备合法性校验的异常抛出逻辑,避免因无显示设备导致系统服务崩溃 - 修改显示 composer HAL 实现,在
hardware/interfaces/graphics/composer/2.1/default/ComposerImpl.cpp中,无头模式下直接返回预定义的虚拟显示设备参数,不调用底层硬件显示的检测接口,避免HAL服务崩溃触发系统重启 - 调整PackageManager过滤规则,在
frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java中,无头模式下过滤掉要求android.hardware.display特征的应用安装请求,避免启动带UI的应用导致异常
4. 系统包裁剪
- 在设备的
device.mk中移除所有依赖显示的系统包,包括SystemUI、Launcher3、WallpaperPicker等桌面、UI相关包 - 禁用
media.codec中与硬件渲染相关的组件,优先使用软编码实现,避免调用GPU渲染相关接口报错
内容的提问来源于stack exchange,提问作者Jimson James
相关产品推荐
相关产品推荐

