Camera应用旋转预览拉伸Bug:RK3588+Android 12环境下的复现、分析与临时解决方案

电子说

1.4w人已加入

描述

 

 

在移动设备 Camera 应用开发中,预览画面稳定性直接影响用户拍摄体验。近期我们在RK3588 芯片平台 + Android 12 系统环境下调试时,发现 Camera2 应用存在高概率预览拉伸 Bug—— 当用户多次旋转屏幕后,预览图像会出现明显变形,而关闭系统自动旋转功能后,该问题可有效规避。今天我们就结合该硬件与系统环境,详细拆解 Bug 的现象、根源及临时解决方案,为同平台开发者提供参考。

 

 

 

 

一、Bug 核心现象与复现路径(RK3588+Android 12

 

 Bug RK3588 芯片驱动的 Android 12 设备上表现尤为明显,核心特征是旋转屏幕后 Camera 预览图像拉伸,复现概率接近 100%,具体操作步骤如下:

 

 

1.首次操作:打开 Camera2 应用 → 手动旋转屏幕(任意角度,触发设备重力感应)→ 完全退出 Camera 应用(确保进程未后台驻留);

 

 

2.二次操作:再次启动 Camera2 应用 → 再次旋转屏幕(与首次旋转角度可相同,如均为 270°→ 高概率触发预览图像拉伸(对比正常场景,预览区域尺寸与比例异常)。

 

 

实际测试验证:在同一 RK3588+Android 12 设备上,关闭系统 自动旋转” 功能后,重复上述操作,预览拉伸现象完全消失 —— 这表明 Bug RK3588 平台上 Android 12 系统传递的旋转事件强相关,且该环境下重力感应事件对 Camera 应用的影响更显著。

 

 

二、关键日志拆解:RK3588+Android 12 下的预览计算异常

 

为定位根源,我们提取了 RK3588+Android 12 环境下 Bug 触发时的关键日志(旋转角度 270°,预览拉伸场景),通过日志可清晰看到预览区域(previewRect)计算存在明显偏差,且与平台系统的参数传递逻辑直接相关:

 

 

调试

异常点分析(基于 RK3588+Android 12 特性):

 

RK3588 平台对屏幕旋转的事件传递机制与其他芯片略有差异 ——Android 12 系统下,该平台会更频繁地向应用推送 旋转状态更新,即使旋转角度未实际变化(如重复旋转至 270°)。日志中虽显示预览区域宽高比(1344:1008=4:3)与设定的previewAspectRatio一致,但因:

 

 

旋转角度(rotation=270°)与 RK3588 平台的预览方向(mDisplayOrientation=0°)未同步,导致CaptureLayoutHelper.javagetPositionConfiguration方法计算的预览渲染区域” 与 实际屏幕显示区域” 错位,最终在 Android 12 的 UI 渲染机制下呈现拉伸效果。

 

 

三、初步排查:旋转事件处理的认知与验证(RK3588+Android 12

 

针对该 Bug,我们最初假设:Camera 应用无需接收 RK3588 传感器传递的旋转信息—— 因部分手机 Camera 应用旋转时预览正常,且旋转不影响拍摄逻辑。为验证该假设,我们在RK3588+Android 12 环境下进行了测试:

 

 

1.测试操作:修改

Camera2srccomandroidcameraappOrientationManagerImpl.java,屏蔽接收传感器旋转信息” 的逻辑;

 

 

2.测试结果:即使屏蔽旋转信息接收,Camera 应用仍会响应 RK3588 平台的屏幕旋转事件,预览拉伸 Bug 依旧存在;

 

 

3.关键发现:在同一设备上关闭系统自动旋转” 功能后,Android 12 系统不再向 Camera 应用推送旋转事件,Bug 复现率从 100% 降至 0—— 这说明:Bug 诱因并非 “Camera 主动接收传感器信息,而是 “RK3588+Android 12 下,系统自动旋转开启时多次传递旋转事件,导致预览布局计算参数混乱

 

 

四、临时解决方案:关闭自动旋转,快速规避问题(RK3588+Android 12

 

目前在RK3588 芯片 + Android 12 系统的设备上,已验证有效的临时规避方案如下,适用于用户临时使用及同平台测试验证:

 

 

1.操作步骤

 

 

打开 Camera2 应用前,通过系统设置(或下拉通知栏快捷开关)关闭 自动旋转” 功能;

 

 

2.适配原理

 

 

关闭自动旋转后,Android 12 系统不再向 Camera 应用传递 RK3588 平台的旋转事件,CaptureLayoutHelper.java中的预览计算参数(rotation、窗口宽高)保持稳定,避免因参数频繁变化导致的适配错误;

 

 

3.实际效果

 

 

 RK3588+Android 12 设备上,重复原复现步骤,预览画面始终保持 4:3 比例,无任何拉伸现象。

 

 

五、后续优化方向:聚焦布局计算与旋转事件同步(RK3588+Android 12

 

临时方案可解决当前痛点,但长期需结合RK3588 平台特性与 Android 12 系统机制,从代码层面修复根本问题,核心优化方向有两个:

 

 

1. 修复CaptureLayoutHelper.java的预览区域计算逻辑(适配 RK3588+Android 12

 

针对 RK3588 平台的旋转事件传递特性,在getPositionConfiguration方法中强化参数联动:

 

 

 RK3588 平台传递旋转角度变化时,强制同步更新mDisplayOrientation(预览方向),避免两者数值不一致;

 

 

适配 Android 12 的窗口管理机制,增加 “RK3588 横屏 竖屏切换时的宽高适配” 逻辑,确保预览区域宽高比与previewAspectRatio严格匹配,不受平台旋转事件延迟影响。

 

 

2. 优化OrientationManagerImpl.java的旋转事件过滤(适配 RK3588+Android 12

 

RK3588+Android 12 下系统会推送大量 重复旋转事件(如同一角度多次推送),需增加过滤逻辑:

 

 

仅接收有效旋转事件(如旋转角度变化≥90°),避免频繁触发updatePositionConfiguration(预览布局重算);

 

 

检测到系统自动旋转关闭时,主动屏蔽 RK3588 平台的所有旋转事件,防止参数混乱。

 

 

总结

 

本次在RK3588 芯片 + Android 12 系统上发现的 Camera 预览拉伸 Bug,本质是 平台旋转事件传递” 与 预览布局计算” 的联动异常 ——RK3588 的高频旋转事件结合 Android 12 的渲染机制,导致关键参数(rotationmDisplayOrientation)不同步,最终引发预览拉伸。当前关闭系统自动旋转可快速规避问题,后续需结合该平台与系统特性,优化布局计算逻辑与旋转事件过滤,从根本上保障用户旋转屏幕时的预览稳定性。

 

 

若你在 RK3588+Android 12 或其他平台调试 Camera 应用时遇到类似问题,欢迎分享场景细节!

 


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分