显示配置信息获取与 SurfaceControl 初始化

134 阅读3分钟

以通俗易懂的语言,结合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);

	}

四、调试与优化技巧

  1. 查看当前配置

    bash
    	adb shell dumpsys SurfaceFlinger --display-info
    
  2. 强制刷新率(需root):

    bash
    	adb shell settings put system peak_refresh_rate 120
    
  3. 性能监控

    • 跟踪SurfaceControl操作:adb shell trace start surfaceflinger
    • 查看刷新率统计:adb shell dumpsys gfxinfo display

五、系统演进方向

从Android 12开始,显示系统正在向以下方向发展:

  1. 动态分辨率切换:根据内容自动调整分辨率
  2. 可变刷新率(VRR) :支持游戏场景的动态刷新率
  3. HDR10+认证:强制通过认证才能启用HDR
  4. 显示场景检测:自动识别游戏/视频场景优化显示

通过理解这个“智能显示屏配置”过程,您可以:

  • 优化显示相关的应用性能(如游戏高帧率模式)
  • 调试显示异常(如花屏、色彩失真)
  • 开发需要精确控制显示参数的专业应用(如摄影/视频编辑工具)