android 8.0 Hwcomposer2 HIDL流程

本文介绍了Android 8.0中引入的HIDL如何将Framework与HAL分离,以方便管理及OTA升级。重点探讨了HWComposer2.0的hotplug(热插拔)注册流程,从SurfaceFlinger的接口定义、注册回调、到HAL层的实现,最后详细梳理了hotplugHook函数如何在设备接入时被调用来完成回调的整个过程。
摘要由CSDN通过智能技术生成

在android O之后google为了更好的管理以及方便OTA的升级,加入了HIDL,将Android Framework和Hal进行分离
每个模块流程大致都一样,我主要从hwcomposer流程入手分析学习一下,本文没有涉及到HIDL的启动以及通讯,主要谈到hotplug的传递流程以及注册过程
首先看看hotplug的注册流程
查看framework native部分
frameworks\native\services\surfaceflinger\surfaceflinger.h头文件里面可以看到
我们目前使用的是hwc2,所以SurfaceFlinger 继承了ComposerCallback类

class SurfaceFlinger : public BnSurfaceComposer,
                       private IBinder::DeathRecipient,
#ifdef USE_HWC2
                       private HWC2::ComposerCallback
#else
                       private HWComposer::EventHandler
#endif

看看ComposerCallback这个类
在frameworks\native\services\surfaceflinger\DisplayHardware\hwc2.h中

class ComposerCallback {
 public:
    virtual void onHotplugReceived(int32_t sequenceId, hwc2_display_t display,
                                   Connection connection,
                                   bool primaryDisplay) = 0;
    virtual void onRefreshReceived(int32_t sequenceId,
                                   hwc2_display_t display) = 0;
    virtual void onVsyncReceived(int32_t sequenceId, hwc2_display_t display,
                                 int64_t timestamp) = 0;
    virtual ~ComposerCallback() = default;
};

在hwc2.h的头文件里面ComposerCallback 类中定义了,主要有同步,热拔插,刷新三个虚方法,目前猜测在surfaceflinger.cpp中应该会实现这三个方法,然而你的猜测是对的
frameworks\native\services\surfaceflinger\SurfaceFlinger.cpp

void SurfaceFlinger::onHotplugReceived(int32_t sequenceId,
        hwc2_display_t display, HWC2::Connection connection,
        bool primaryDisplay) {
    ALOGV("onHotplugReceived(%d, %" PRIu64 ", %s, %s)",
          sequenceId, display,
          connection == HWC2::Connection::Connected ?
                  "connected" : "disconnected",
          primaryDisplay ? "primary" : "external");
    ConditionalLock lock(mStateLock,
            std::this_thread::get_id() != mMainThreadId);
    if (primaryDisplay) {
        mHwc->onHotplug(display, connection);
        if (!mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY].get()) {
            createBuiltinDisplayLocked(DisplayDevice::DISPLAY_PRIMARY);
        }
        createDefaultDisplayDevice();
    } else {
        if (sequenceId != mComposerSequenceId) {
            return;
        }
        if (mHwc->isUsingVrComposer()) {
            ALOGE("Ex
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值