在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