SurfaceFlinger是Android操作系统中的一个Service,跟随系统的启动,主要用于屏幕渲染、图像合成,它负责接收所有Window的Surface作为输入,并根据透明度、大小、位置等参数,计算出每个Surface在最终合成图像中的位置,然后交由CPU或GPU生成最终的显示Buffer,最后显示到特定的显示设备上。它使用OpenGL或skia和Hardware Composer来合成一组Surface,在屏幕处于两次刷新之间时,屏幕会向SurfaceFlinger发送VSYNC信号。VSYNC信号表明可对屏幕进行刷新而不会产生撕裂。当SurfaceFlinger接收到VSYNC信号后,会遍历其层列表,以查找新的缓冲区。
SurfaceFlinger是一个服务进程,并且是一个可执行的程序,文件在设备的/system/lib/目录下。
系统开机后,init进程扫描到surfaceflinger.rc这个文件,并解析,然后执行/system/lib/surfaceflinger,这样就创建了surfaceflinger的进程。
frameworks/native/services/surfaceflinger/Android.bp
...............
filegroup {
name: "surfaceflinger_binary_sources",
srcs: ["main_surfaceflinger.cpp"],//引入源文件,这个为surfaceflinger的入口
}
cc_binary {
name: "surfaceflinger",//编译为suerfaceflinger的二进制文件
defaults: ["libsurfaceflinger_binary"],
init_rc: ["surfaceflinger.rc"],//引入surfaceflinger.rc文件
srcs: [":surfaceflinger_binary_sources"],//引入surfaceflinger_binary_sources这个组的源文件
shared_libs: [
"libsurfaceflinger",
"libSurfaceFlingerProp",
],
}
在设备下执行ps,看看surfaceflinger的进程
我们从入口函数main开始分析
/frameworks/native/services/surfaceflinger/main_surfaceflinger.cpp
int main(int, char**) {
.........
ProcessState::self()->setThreadPoolMaxThreadCount(4);//设置4个bind线程
// start the thread pool
sp<ProcessState> ps(ProcessState::self());
ps->startThreadPool();
sp<SurfaceFlinger> flinger = surfaceflinger::createSurfaceFlinger();//创建surfacelinger实例---【见2.1】
.........
flinger->init();//初始化---【见2.2】
//把surfaceflinger添加到servicemanager
sp<IServiceManager> sm(defaultServiceManager());
sm->addService(String16(SurfaceFlinger::getServiceName()), flinger, false,
IServiceManager::DUMP_FLAG_PRIORITY_CRITICAL | IServiceManager::DUMP_FLAG_PROTO);
// 启动显示服务,主要是创建HAL的服务,具体实现是在out\soong\.intermediates\frameworks\hardware\interfaces\displayservice\1.0\android.frameworks.displayservice@1.0_genc++\gen\android\frameworks\displayservice\1.0
startDisplayService();
..........
//运行surfaceflinger ---【见2.3】
flinger->run();
return 0;
}
2.1
frameworks/native/services/surfaceflinger/SurfaceFlingerFactory.cpp
sp<SurfaceFlinger> createSurfaceFlinger() {
class Factory final : public surfaceflinger::Factory {
public:
Factory() = default;
~Factory() = default;
...............
std::unique_ptr<EventControlThread> createEventControlThread(
std::function<void(bool)> setVSyncEnabled) override {
return std::make_unique<android::impl::EventControlThread>(setVSyncEnabled);
}
............
};
static Factory factory;
return new SurfaceFlinger(factory);
}
在createSurfaceFlinger通过定义Factory的类,在创建surfaceflinger的实例中同时把Factory的实例出入到了SurfaceFlinger
2.1.1
SurfaceFlinger::SurfaceFlinger(Factory& factory) : SurfaceFlinger(factory, SkipInitialization)//执行两个参数的构造函数 {
ALOGI("SurfaceFlinger is starting");
//读取系统属性值
hasSyncFramework = running_without_sync_framework(true);
dispSyncPresentTimeOffset = present_time_offset_from_vsync_ns(0);
useHwcForRgbToYuv = force_hwc_copy_for_virtual_displays(false);
.........
}
SurfaceFlinger::SurfaceFlinger(Factory& factory, SkipInitializationTag)
: mFactory(factory),
mPhaseOffsets(mFactory.createPhaseOffsets()),//创建相位
mInterceptor(mFactory.createSurfaceInterceptor(this)),
mTimeStats(mFactory.createTimeStats()),
mEventQueue(mFactory.createMessageQueue()),//创建消息队列
mCompositionEngine(mFactory.createCompositionEngine())//创建合成引擎 {}
SurfaceFlinger读取属性值,做一些初始化的工作,创建实例后会触发OnFirsetRef
void SurfaceFlinger::onFirstRef()
{
mEventQueue->init(this);
}
mEventQueue的实例是在创建SurfaceFlinger中创建的,init方法里创建looper和handler
2.2
void SurfaceFlinger::init() {
..........
// start the EventThread
mScheduler =
getFactory().createScheduler([this](bool enabled) { setPrimaryVsyncEnabled(enabled); },
mRefreshRateConfigs);//创建调度器-----【2.2.1】
auto resyncCallback =
mScheduler->makeResyncCallback(std::bind(&SurfaceFlinger::getVsyncPeriod, this));//跨进程获取垂直同步的周期后,重设垂直同步-----【2.2.2】
//创建app和sf的连接
mAppConnectionHandle =
mScheduler->createConnection("app", mPhaseOffsets->getCurrentAppOffset(),
resyncCallback,
impl::EventThread::InterceptVSyncsCallback());
mSfConnectionHandle = mScheduler->createConnection("sf", mPhaseOffsets->getCurrentSfOffset(),
resyncCallback, [this](nsecs_t timestamp) {
mInterceptor->saveVSyncEvent(timestamp);
});
mEventQueue->setEventConnection(mScheduler->getEventConnection(mSfConnectionHandle));//把sf添加到消息队列中
mVsyncModulator.setSchedulerAndHandles(mScheduler.get(), mAppConnectionHandle.get(),
mSfConnectionHandle.get());//
mRegionSamplingThread =
new RegionSamplingThread(*this, *mScheduler,
RegionSamplingThread::EnvironmentTimingTunables());
.....................
//设置渲染引擎
mCompositionEngine->setRenderEngine(
renderengine::RenderEngine::create(static_cast<int32_t>(defaultCompositionPixelFormat),
renderEngineFeature, maxFrameBufferAcquiredBuffers));
......................
//创建Hwcomposer
mCompositionEngine->setHwComposer(getFactory().createHWComposer(getBE().mHwcServiceName));
mCompositionEngine->getHwComposer().registerCallback(this, getBE().mComposerSequenceId);
// Process any initial hotplug and resulting display changes.
processDisplayHotplugEventsLocked();
// 初始化显示的信息
initializeDisplays();
...............
}
frameworks/native/services/surfaceflinger/schedule/Scheduler.cpp
Scheduler::Scheduler(impl::EventControlThread::SetVSyncEnabledFunction function,
const scheduler::RefreshRateConfigs& refreshRateConfig)
: mHasSyncFramework(running_without_sync_framework(true)),
mDispSyncPresentTimeOffset(present_time_offset_from_vsync_ns(0)),
mPrimaryHWVsyncEnabled(false),
mHWVsyncAvailable(false),
mRefreshRateConfigs(refreshRateConfig) {
................
}
在Scheduler的构造函数里主要是读取属性值,根据值是否开启IdleTimer和TouchTimer定时器
2.2.2
SurfaceFlinger.cpp
nsecs_t SurfaceFlinger::getVsyncPeriod() const {
.........
const auto config = getHwComposer().getActiveConfig(*displayId);
return config ? config->getVsyncPeriod() : 0;
}
android可以接多个显示器,通过displayId显示器的ID来获取图形显示、合成的配置,getActiveConfig的调用栈为:surfaceflinger\compositionengine\src\CompositionEngine.setHwComposer---》surfaceflinger\displayhardware\HWComposer.getActiveConfig----->surfaceflinger\displayhardware.ComposerHal.getActiveConfig,最后进入HAL层的V2_1::IComposerClient
想要学习更多编程,欢迎关注公众号:android全贯通