surfaceflinger非常复杂,代码也非常多,漫无目的地看代码什么也看不懂并且容易犯困。(别问我怎么知道的,因为看这块东西睡着好多次)
我对app的东西不熟,基本上都是从hwc,然后一路摸爬滚打到surfaceflinger的逻辑。也吃了不少苦头。
我会把surfaceflinger精简一下,用一个功能来梳理流程,比如surfaceflinger是怎么创建layer的,怎么把layer与hwc中的layer对应的,又是怎么把图推给hwc的。
这样做的好处是可以不用关心其他又多又臭又硬的代码,增强自己的信心,原来自己能看懂。
简单看下surfaceflinger初始化的流程
本篇的代码为了梳理流程做了精简,有需要可以对比源码分析
1. 创建surfaceflinger
android12\frameworks\native\services\surfaceflinger\main_surfaceflinger.cpp
int main(int, char**) {
sp<SurfaceFlinger> flinger = surfaceflinger::createSurfaceFlinger();
flinger->init();
flinger->run();
}
android12\frameworks\native\services\surfaceflinger\SurfaceFlingerFactory.cpp
sp<SurfaceFlinger> createSurfaceFlinger() {
static DefaultFactory factory;
return new SurfaceFlinger(factory);
}
用factory来创建surfaceflinger,看下surfaceflinger的构造函数
SurfaceFlinger::SurfaceFlinger(Factory& factory) : SurfaceFlinger(factory, SkipInitialization) {
... ...
}
SurfaceFlinger::SurfaceFlinger(Factory& factory, SkipInitializationTag)
: mFactory(factory),
mEventQueue(mFactory.createMessageQueue()),
mCompositionEngine(mFactory.createCompositionEngine()),
mHwcServiceName(base::GetProperty("debug.sf.hwc_service_name"s, "default"s)),
mInternalDisplayDensity(getDensityFromProperty("ro.sf.lcd_density", true)) {
ALOGI("Using HWComposer service: %s", mHwcServiceName.c_str());
}
这里有几个比较重要的成员:
mCompositionEngine:负责参数配置,图像的合成,和刷图等
mHwcServiceName:hwc name用来获取hwc的service
mInternalDisplayDensity:显示内容在屏幕上显示的大小
createCompositionEngine的实现比较简单就不分析了。
surfaceflinger构造函数还有其他的内容,暂时涉及不到。
2. SurfaceFlinger::init()
- 获取composer service
- 创建Display
- 创建DisplayDevice
上代码:
void SurfaceFlinger::init() {
mCompositionEngine->setHwComposer(getFactory().createHWComposer(mHwcServiceName));
processDisplayHotplugEventsLocked();
mDrawingState = mCurrentState;
}
2.1 获取composer service
createHWComposer流程如下图:
从流程图可以看出,使用IComposer::getService(serviceName)拿到hwc service,并且创建client;然后使用HWComposer把composer包起来;后面使用HWComposer就可以拿到composer;
如果想看composer service创建的具体流程,可以看下hidl生成在路径流程图最后的c++代码。
然后调用setHwComposer,保存到mHwComposer成员里
android12\frameworks\native\services\surfaceflinger\CompositionEngine\src\CompositionEngine.cpp
void CompositionEngine::setHwComposer(std::unique_ptr<HWComposer> hwComposer) {
mHwComposer = std::move(hwComposer);
}
在SurfaceFlinger.cpp中有很多getHwComposer().xxx()的调用,来通过HWComposer配置参数,而在HWComposer中有的接口会使用mComposer实现与hwc进行交互。
2.2 创建Display
android12\frameworks\native\services\surfaceflinger\CompositionEngine\include\compositionengine\impl\Display.h
class Display : public compositionengine::impl::Output, public virtual compositionengine::Display {
}
从头文件来看Display继承Output;在display中好多方法用的都是Output里面的。在后面的流程分析中会遇到。
整体流程没什么特殊的,有两个类函数需要注意一下createDisplayTemplated和createOutputTemplated。
diaplay的创建流程如下:
2.3 创建DisplayDevice
使用上面创建的display,和displaySurface等参数创建DisplayDevice;流程图如下:
创建完成将display放入mDisplays。
3. 总结
这里省略了很多代码和逻辑,只着重于HWComposer,Display,DisplayDevice的创建及初始化。
后面在分析其他流程时会遇到这些变量的具体使用,敬请期待。
创作不易,欢迎评论点赞收藏。