以通俗易懂的语言,结合Android源码关键片段,为您解析显示配置信息获取与SurfaceControl初始化的全过程。我们可以把这个过程想象成“配置智能显示屏”,其中SurfaceControl是核心控制器,而显示配置信息则是它的“使用说明书”。
一、显示配置信息获取:给屏幕做“体检”
就像给新买的显示屏做全面检测,Android系统需要获取屏幕的各项参数才能正确显示内容。这个过程分为三个层次:
1. 硬件抽象层(HAL)检测
源码位置:hardware/libhardware/modules/display/
硬件厂商会提供专属的DisplayConfig实现,就像不同品牌的体检中心:
cpp
// 示例:高通平台的配置获取
class QcomDisplayConfig : public DisplayConfig {
public:
virtual Status getDisplayAttributes(
DisplayId id, DisplayAttribute* attributes) override {
// 读取EDID信息
readEdidFromI2C();
// 解析分辨率、色域等参数
parseEdidData();
return Status::OK;
}
};
2. 显示服务层整合
源码位置:frameworks/native/services/surfaceflinger/DisplayDevice.cpp
SurfaceFlinger会整合所有检测结果,生成统一的配置信息:
cpp
void DisplayDevice::initialize() {
// 获取物理分辨率
mPhysicalSize.width = config->getWidth();
mPhysicalSize.height = config->getHeight();
// 检测HDR能力
mHdrCapabilities = config->getHdrCapabilities();
// 读取色域信息
mColorSpace = config->getColorSpace();
}
3. 关键配置参数解析
就像体检报告中的各项指标,这些参数决定屏幕如何工作:
- 分辨率:
getWidth()/getHeight()(如1080x2340) - 刷新率:
getSupportedModes()(如60Hz/120Hz) - 色彩空间:
getColorSpace()(sRGB/P3/Adobe RGB) - HDR格式:
getHdrCapabilities()(Dolby Vision/HDR10+) - 物理尺寸:
getPhysicalSize()(6.5英寸)
二、SurfaceControl初始化:组装“屏幕遥控器”
SurfaceControl就像一个万能遥控器,需要正确配置才能操控屏幕。初始化过程分为三个阶段:
1. 创建基础对象
源码位置:frameworks/base/libs/surfaceflinger/SurfaceControl.cpp
通过SurfaceControl::createDisplay创建核心对象:
cpp
sp<SurfaceControl> SurfaceControl::createDisplay(
const String8& name, bool secure, float refreshRate) {
// 创建Binder代理
sp<IBinder> displayToken = new BBinder();
// 初始化显示属性
DisplayAttr attr;
attr.name = name;
attr.width = 1080; // 示例分辨率
attr.height = 2340;
attr.refreshRate = refreshRate;
// 调用底层创建
return new SurfaceControl(displayToken, attr);
}
2. 配置显示属性
就像设置遥控器的功能按钮,需要配置这些关键属性:
cpp
void SurfaceControl::applyConfig(const DisplayConfig& config) {
// 设置色彩空间
setLayerStack(config.getLayerStack());
// 配置HDR模式
setHdrMode(config.getHdrMode());
// 设置显示区域
setDisplaySize(config.getWidth(), config.getHeight());
// 应用刷新率策略
setRefreshRatePolicy(config.getRefreshRatePolicy());
}
3. 建立与SurfaceFlinger的连接
通过Binder驱动与显示服务建立通信,就像遥控器与电视配对:
cpp
status_t SurfaceControl::connectToFlinger() {
// 获取SurfaceFlinger服务
sp<ISurfaceComposer> composer = ComposerService::getComposerService();
// 建立会话
sp<IBinder> sessionToken;
status_t err = composer->createSession(sessionToken);
// 绑定显示设备
err = composer->setDisplaySurface(sessionToken, mDisplayToken);
return err;
}
三、配置信息与SurfaceControl的协同工作
就像遥控器需要持续读取电视状态,SurfaceControl需要实时获取配置信息:
1. 动态刷新率调整
cpp
void SurfaceControl::setRefreshRate(float rate) {
// 查询支持的刷新率
Vector<float> modes = getSupportedRefreshRates();
// 验证合法性
if (!modes.contains(rate)) {
return BAD_VALUE;
}
// 应用新配置
mDisplayAttr.refreshRate = rate;
updateDisplayConfig();
}
2. HDR模式切换
cpp
void SurfaceControl::setHdrMode(HdrMode mode) {
// 验证HDR支持
if (!mDisplayAttr.hdrCapabilities.supports(mode)) {
return BAD_VALUE;
}
// 更新色彩管理参数
mColorManager->setHdrMode(mode);
// 通知SurfaceFlinger
mComposerClient->setHdrMode(mDisplayToken, mode);
}
四、调试与优化技巧
-
查看当前配置:
bash adb shell dumpsys SurfaceFlinger --display-info -
强制刷新率(需root):
bash adb shell settings put system peak_refresh_rate 120 -
性能监控:
- 跟踪SurfaceControl操作:
adb shell trace start surfaceflinger - 查看刷新率统计:
adb shell dumpsys gfxinfo display
- 跟踪SurfaceControl操作:
五、系统演进方向
从Android 12开始,显示系统正在向以下方向发展:
- 动态分辨率切换:根据内容自动调整分辨率
- 可变刷新率(VRR) :支持游戏场景的动态刷新率
- HDR10+认证:强制通过认证才能启用HDR
- 显示场景检测:自动识别游戏/视频场景优化显示
通过理解这个“智能显示屏配置”过程,您可以:
- 优化显示相关的应用性能(如游戏高帧率模式)
- 调试显示异常(如花屏、色彩失真)
- 开发需要精确控制显示参数的专业应用(如摄影/视频编辑工具)