保姆级教程:在Ubuntu上编译并运行Android Automotive 14多屏模拟器(含分辨率自定义)
保姆级教程:在Ubuntu上编译并运行Android Automotive 14多屏模拟器(含分辨率自定义)
当新能源车的屏幕数量从传统单中控演变为"一车六屏"甚至更多时,车载系统开发者的测试环境搭建就变得尤为关键。本文将带你从零构建一个支持四屏显示的Android Automotive OS 14模拟器环境,重点解决三个核心问题:如何正确编译多屏配置的镜像、如何自定义各屏幕分辨率参数,以及如何验证多屏协同效果。
1. 环境准备与源码获取
在Ubuntu 22.04 LTS上,我们需要先配置符合AOSP编译要求的开发环境。执行以下命令安装基础依赖:
sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig python3接着配置repo工具并同步AAOS 14源码:
mkdir ~/aosp && cd ~/aosp repo init -u https://android.googlesource.com/platform/manifest -b android-14.0.0_r1 repo sync -j8 --no-tags --no-clone-bundle注意:源码下载约需80GB磁盘空间,建议使用国内镜像源加速。若同步中断,可通过
repo sync --fail-fast继续。
2. 多屏配置编译详解
完成源码同步后,切换到多屏专用编译配置:
source build/envsetup.sh lunch sdk_car_md_x86_64-userdebug这个sdk_car_md_x86_64配置与标准单屏版的差异主要体现在三个关键文件中:
| 文件路径 | 作用 | 多屏特性 |
|---|---|---|
| device/generic/car/common/car_md.mk | 多屏硬件参数定义 | 配置4个物理显示屏参数 |
| device/generic/car/emulator/multi-display/display_settings.xml | 显示行为控制 | 定义各屏是否显示系统装饰/输入法 |
| device/generic/car/common/config.ini.car_md | 模拟器皮肤配置 | 设置主屏分辨率与DPI |
开始编译前,建议先清理旧构建产物:
make clobber && make -j$(nproc)常见编译问题解决方案:
- 内存不足:增加swap空间或减少并行编译线程数
- Java堆溢出:在
build/core/main.mk中添加JAVA_OPTS += -Xmx8g - 依赖缺失:根据报错信息安装对应开发库
3. 分辨率自定义实战
默认配置的792p分辨率已不符合当前车机主流规格,我们通过三步改造升级到1080p:
步骤一:修改硬件参数编辑device/generic/car/common/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 # 修改为(格式:display_id,width,height,dpi,flag) EMULATOR_MULTIDISPLAY_HW_CONFIG := 1,1320,1080,220,0,2,1920,1080,220,0,3,1920,1080,220,0步骤二:调整DPI设置在device/generic/car/common/config.ini.car_md中更新显示密度:
hw.lcd.density=220 skin.name=1920x1080 skin.path=1920x1080步骤三:更新显示策略修改device/generic/car/emulator/multi-display/display_settings.xml:
<display name="port:1" forcedDensity="220"/> <display name="port:2" forcedDensity="220"/> <display name="port:3" forcedDensity="220"/>修改完成后需要重新编译系统镜像:
make -j$(nproc)4. 多屏模拟器运行与验证
启动模拟器时建议禁用快照以获取干净状态:
emulator -no-snapshot -no-boot-anim -gpu swiftshader_indirect多屏模拟器启动后,可以通过这些命令验证效果:
检查显示屏信息
adb shell dumpsys display | grep -E 'mDisplayId|physicalSize'测试多屏应用启动
# 在display 2启动设置应用 adb shell am start -n com.android.car.settings/.Settings_Launcher_Homepage --display 2屏幕截图比对
# 获取各屏ID display_ids=$(adb shell dumpsys SurfaceFlinger --display-id) # 为每个屏幕截图 for id in $display_ids; do adb shell screencap -d $id -p /sdcard/${id}.png done
典型多屏布局效果:
- Display 0:1920x1080 中控主屏
- Display 1:1320x1080 仪表盘
- Display 2/3:1920x1080 副驾娱乐屏
5. 高级调试技巧
当遇到触摸事件异常时,需要检查virtio_input_multi_touch_*.idc配置文件是否正确部署到/vendor/usr/idc/目录。可以通过以下命令验证输入设备映射:
adb shell getevent -l多屏音频路由验证方法:
adb shell dumpsys car_audio如果需要动态调整屏幕参数,可以使用wm命令实时修改:
# 修改display 1的分辨率 adb shell wm size -d 1 1600x900 # 修改display 2的DPI adb shell wm density -d 2 2406. 性能优化建议
为提升多屏模拟器的运行效率,推荐以下配置调整:
GPU加速配置
# 使用主机GPU加速(需NVIDIA驱动) emulator -gpu host内存分配策略在
config.ini.car_md中增加:hw.ramSize=8192 hw.gpu.mode=auto多屏渲染优化
# 启用GLES 3.1渲染 adb shell setprop debug.egl.api GLES_3_1
实测性能数据对比(基于Intel i7-12700K):
| 配置方案 | 单屏FPS | 四屏FPS | 内存占用 |
|---|---|---|---|
| 软件渲染 | 24 | 8 | 5.2GB |
| GPU加速 | 60 | 38 | 6.1GB |
遇到模拟器卡顿时,可以尝试关闭不需要的屏幕:
adb shell service call SurfaceFlinger 1008 i32 <display_id>