1. 问题现象与背景分析
最近在RK3588平台上调试Android 12系统时遇到一个典型问题:当我们将屏幕显示方向设置为90度旋转(竖屏转横屏)后,系统开机动画只能显示一半内容。具体表现为动画画面被截断,约几秒钟后才恢复正常全屏显示。这个现象在嵌入式Android系统开发中颇具代表性,涉及到显示子系统多个模块的协同工作。
通过adb shell getprop命令查看系统属性,确认ro.surface_flinger.primary_display_orientation已被正确设置为ORIENTATION_90。在device/rockchip/common/BoardConfig.mk中的配置项也显示:
code复制SF_PRIMARY_DISPLAY_ORIENTATION := 90
TARGET_RECOVERY_DEFAULT_ROTATION := ROTATION_RIGHT
关键点:开机动画(bootanimation)是系统启动过程中由SurfaceFlinger负责渲染的最后一个阶段,它运行在系统服务完全启动之前,因此对显示参数的初始化特别敏感。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题根因探究
2.1 SurfaceFlinger的显示处理流程
在Android显示系统中,SurfaceFlinger服务负责所有图层的合成与显示。当设置屏幕旋转时,主要影响以下两个处理环节:
- 硬件合成器(HWC):处理显示缓冲区的物理旋转
- SurfaceFlinger逻辑:处理图层矩阵变换和显示区域计算
通过分析开机动画的显示过程,发现问题出在DisplayDevice类的setProjection方法中。该方法负责计算显示设备的投影矩阵,但在处理旋转时没有正确调整显示区域(viewport和frame)的尺寸。
2.2 旋转状态下的显示区域计算
正常横屏(0度)情况下:
- 显示区域宽高为 (width, height) = (1920, 1080)
- 显示矩阵为单位矩阵
当旋转90度后:
- 物理显示尺寸应变为 (height, width) = (1080, 1920)
- 但原始代码未同步调整显示区域边界值
code复制// 问题代码逻辑(简化版)
void DisplayDevice::se
