Android P图形架构之三屏异显实现

本文探讨了Android P系统中实现三屏异显的技术细节,涉及Framework层、HAL层和驱动层的改动。在Framework层,SurfaceControl和SurfaceFlinger进行了相应调整以支持第三块屏幕。HAL层修改了显示屏的定义,而在驱动层,通过HAL层与kernel交互,确保第三块屏的信息传递到SurfaceFlinger。重点代码包括DisplayManager对物理显示屏的获取和管理。
摘要由CSDN通过智能技术生成

相关源码:
\frameworks\base\core\java\android\view\SurfaceControl.java
\frameworks\base\services\core\java\com\android\server\display\LocalDisplayAdapter.java
\frameworks\native\services\surfaceflinger\SurfaceFlinger.cpp
frameworks\native\services\surfaceflinger\DisplayHardware\HWComposer.h
\hardware\libhardware\include\hardware\hwcomposer_defs.h
\vendor\nxp-opensource\imx\display\hwcomposer_v20\hwcomposer.cpp
\vendor\nxp-opensource\imx\display\display\DisplayManager.cpp

我们都知道安卓支持多屏异显。但是android 9.0系统中,默认只加载了两个物理屏和一个虚拟屏。

具体资料可以参考谷歌官方资料:
https://developer.android.com/guide/topics/ui/multi-window
https://developer.android.com/about/versions/oreo/android-8.0

参考文章:
《Android P实现双屏异显》
《Android P图形架构之SurfaceFlinger加载显示屏流程》

android 9.0显示屏的定义:

  • display 0 主屏
  • display 1 副屏(辅助屏)
  • display 2 虚拟屏(显示display 1上)

增加第三块屏后的定义:

  • display 0 主屏
  • display 1 副屏(辅助屏)
  • display 2 扩展屏(第三块屏)
  • display 3 虚拟屏(显示display 1或者display 2上)

Framework层

1、SurfaceControl中,增加第三块屏的定义:
\frameworks\base\core\java\android\view\SurfaceControl.java

/**
 * Built-in physical display id: Main display.
 * Use only with {@link SurfaceControl#getBuiltInDisplay(int)}.
 */
public static final int BUILT_IN_DISPLAY_ID_MAIN = 0;

/**
* Built-in physical display id: Attached HDMI display.
* Use only with {@link SurfaceControl#getBuiltInDisplay(int)}.
*/
public static final int BUILT_IN_DISPLAY_ID_HDMI = 1;

//add by sunxiaolin 20190906
public static final int BUILT_IN_DISPLAY_ID_THIRD = 2;

2、LocalDisplayAdapter中,增加第三块屏的逻辑处理:
\frameworks\base\services\core\java\com\android\server\display\LocalDisplayAdapter.java
private static final int[] BUILT_IN_DISPLAY_IDS_TO_SCAN = new int[] {
   
        SurfaceControl.BUILT_IN_DISPLAY_ID_MAIN,
        SurfaceControl.BUILT_IN_DISPLAY_ID_HDMI,
        SurfaceControl.BUILT_IN_DISPLAY_ID_THIRD,	//add by sunxiaolin 20190906
};

@Override
public void registerLocked() {
   
    super.registerLocked();

    mHotplugReceiver = new HotplugDisplayEventReceiver(getHandler().getLooper());

    for (int builtInDisplayId : BUILT_IN_DISPLAY_IDS_TO_SCAN) {
   
        tryConnectDisplayLocked(builtInDisplayId);
    }
}

3、SurfaceFlinger中,增加第三块屏的逻辑处理:
\frameworks\native\services\surfaceflinger\SurfaceFlinger.cpp

DisplayDevice::DisplayType SurfaceFlinger::determineDisplayType(hwc2_display_t display,
                                                                HWC2::Connection connection) const {
   
    // Figure out whether the event is for the primary display or an
    // external display by matching the Hwc display id against one for a
    // connected display. If we did not find a match, we then check what
    // displays are not already connected to determine the type. If we don't
    // have a connected primary display, we assume the new display is meant to
    // be the primary display, and then if we don't have an external display,
    // we assume it is that.
    ALOGI("sunxiaolin determineDisplayType");
    const auto primaryDisplayId = getBE().mHwc->getHwcDisplayId(DisplayDevice::DISPLAY_PRIMARY);
    const auto externalDisplayId = getBE().mHwc->getHwcDisplayId(DisplayDevice::DISPLAY_EXTERNAL);
    const auto thirdDisplayId = getBE().mHwc->getHwcDisplayId(DisplayDevice::DISPLAY_THIRD)
  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunxiaolin2016

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值