保姆级教程:在AAOS 14模拟器上配置多屏(仪表+中控+副驾)并修改分辨率
车内多屏交互正成为智能座舱的核心体验。从传统仪表盘到副驾娱乐屏,开发者需要面对分辨率适配、多任务处理等复杂场景。本文将手把手带你从源码编译到参数调优,构建一个1920x1080高清多屏测试环境。
1. 环境准备与源码配置
1.1 获取AAOS 14源码基础环境
确保已完成以下前置条件:
- 200GB以上可用磁盘空间
- Ubuntu 22.04 LTS操作系统
- JDK 17开发环境
- 已同步AAOS 14源码(建议使用清华镜像源加速)
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-14.0.0_r1 repo sync -j81.2 定位多屏配置文件关键路径
多屏配置主要涉及三个核心文件:
device/generic/car/common/car_md.mk- 定义屏幕参数和硬件配置device/generic/car/emulator/multi-display/display_settings.xml- 控制各屏显示特性device/generic/car/common/config.ini.car_md- 模拟器基础参数
通过对比sdk_car_x86_64和sdk_car_md_x86_64的差异,可以发现多屏方案主要新增了以下功能模块:
| 功能模块 | 配置文件 | 作用描述 |
|---|---|---|
| 多触点输入 | virtio_input_multi_touch_*.idc | 为每个屏幕分配独立触摸输入 |
| 显示布局 | display_layout_configuration.xml | 定义屏幕物理排列关系 |
| 音频分区 | car_audio_configuration.xml | 实现多区域独立音频控制 |
2. 编译多屏模拟器镜像
2.1 选择编译目标
执行以下命令进入编译配置界面:
source build/envsetup.sh lunch sdk_car_md_x86_64-userdebug关键编译参数说明:
PRODUCT_NAME: sdk_car_md_x86_64PRODUCT_DEVICE: emulator_car64_x86_64PRODUCT_MODEL: Car multi-display on x86_64 emulator
2.2 启动增量编译
建议首次编译使用完整构建,后续修改配置后可使用增量编译:
make -j$(nproc) # 首次完整编译 make snod # 增量构建system.img注意:编译过程中若出现Java堆空间不足,可设置
export _JAVA_OPTIONS="-Xmx8g"
3. 分辨率与DPI调优实战
3.1 修改屏幕物理参数
打开car_md.mk文件,定位到EMULATOR_MULTIDISPLAY_HW_CONFIG参数:
# 原始配置 EMULATOR_MULTIDISPLAY_HW_CONFIG := 1,968,792,160,0,2,1408,792,160,0,3,1408,792,160,0 # 修改为1080P配置 EMULATOR_MULTIDISPLAY_HW_CONFIG := 1,1320,1080,220,0,2,1920,1080,220,0,3,1920,1080,220,0参数格式解析:
<display_id>,<width>,<height>,<dpi>,<flag>,...3.2 调整显示密度设置
同步修改config.ini.car_md和display_settings.xml中的DPI值:
<!-- display_settings.xml示例 --> <display name="port:1" forcedDensity="220" dontMoveToTop="true"/>3.3 皮肤文件适配
将模拟器皮肤调整为1080P规格:
# config.ini.car_md skin.name=1920x1080 skin.path=1920x10804. 多屏模拟器操作指南
4.1 启动模拟器
使用以下命令冷启动多屏模拟器:
emulator -no-snapshot -skin 1920x1080常用调试参数组合:
-gpu host:启用主机GPU加速-memory 6144:分配6GB内存-no-boot-anim:跳过启动动画加速启动
4.2 多屏管理命令
获取当前活跃屏幕信息:
dumpsys display | grep mDisplayId典型输出示例:
mDisplayId=4619827259835644672, state=ON mDisplayId=4619827551948147201, state=ON mDisplayId=4619827124781842690, state=ON启动应用到指定屏幕:
am start -n com.android.car.settings/.Settings_Launcher --display 24.3 屏幕截图技巧
为每个屏幕单独截图:
for did in $(dumpsys display | grep mDisplayId | cut -d= -f2 | cut -d, -f1); do screencap -d $did -p screen_${did}.png done5. 常见问题排查
5.1 触摸事件失效
检查/vendor/usr/idc/目录下是否包含多触点配置文件:
virtio_input_multi_touch_7.idc virtio_input_multi_touch_8.idc virtio_input_multi_touch_9.idc5.2 分辨率未生效
验证步骤:
- 确认已执行
make snod重新生成system.img - 删除
out/target/product/sdk_car_md_x86_64/data缓存 - 使用
-wipe-data参数启动模拟器
5.3 多屏错位问题
调整display_layout_configuration.xml中的物理位置参数:
<display x="0" y="0" width="1320" height="1080" name="port:1"/> <display x="1320" y="0" width="1920" height="1080" name="port:2"/>6. 高级调试技巧
6.1 SurfaceFlinger分析
获取各屏图层信息:
dumpsys SurfaceFlinger --display-id 46198275519481472016.2 窗口管理调试
查看各屏窗口堆栈:
wm displays6.3 输入事件监控
实时查看触摸事件分发:
getevent -l /dev/input/event7在实际项目中,我发现修改DPI后需要同步调整framework/base中的默认尺寸常量。例如将config_defaultDisplayMinimumSize从默认的600dp调整为适应车机的400dp,才能确保系统UI元素正常显示。