OutputLayer的析构方法解读

55 阅读4分钟

背景:

分析SurfaceFlinger的合成trace发现如下: 在这里插入图片描述执行collectVisibleLayers时候具体还会触发destroyLayer操作,还是个跨进程的 在这里插入图片描述明显属于在finalizePendingOutputLayers触发的调用

在这里插入图片描述看到了finalizePendingOutputLayers明显好像没啥啊,没看到有调用destroyLayer啊,但是Trace中确实有展示对应destroyLayer,这个是为啥?

通过堆栈追踪:

经过堆栈添加如下: 在这里插入图片描述

1:46.840 12577 12577 D HidlComposer: #00 pc 0000000000133940  /system/bin/surfaceflinger (android::Hwc2::HidlComposer::destroyLayer(unsigned long, unsigned long)+80)
01-11 11:51:46.866 12577 12577 D destroyLayer: #00 pc 0000000000133950  /system/bin/surfaceflinger (android::Hwc2::HidlComposer::destroyLayer(unsigned long, unsigned long)+96)
01-11 11:51:46.866 12577 12577 D destroyLayer: #01 pc 000000000013e89c  /system/bin/surfaceflinger (android::HWC2::impl::Layer::onOwningDisplayDestroyed()+104)
01-11 11:51:46.866 12577 12577 D destroyLayer: #02 pc 0000000000141410  /system/bin/surfaceflinger (android::HWC2::impl::Layer::~Layer()+28)
01-11 11:51:46.866 12577 12577 D destroyLayer: #03 pc 000000000021bcb4  /system/bin/surfaceflinger (android::compositionengine::impl::OutputLayerCompositionState::~OutputLayerCompositionState()+104)
01-11 11:51:46.866 12577 12577 D destroyLayer: #04 pc 000000000021bc14  /system/bin/surfaceflinger (std::__1::unique_ptr<android::compositionengine::impl::OutputLayer, std::__1::default_delete<android::compositionengine::impl::OutputLayer> > android::compositionengine::impl::createOutputLayerTemplated<android::compositionengine::impl::OutputLayer>(android::compositionengine::Output const&, android::sp<android::compositionengine::LayerFE>)::OutputLayer::~OutputLayer()+20)
01-11 11:51:46.866 12577 12577 D destroyLayer: #05 pc 00000000001e8404  /system/bin/surfaceflinger (std::__1::shared_ptr<android::compositionengine::impl::Display> android::compositionengine::impl::createOutputTemplated<android::compositionengine::impl::Display, android::compositionengine::CompositionEngine>(android::compositionengine::CompositionEngine const&)::Output::finalizePendingOutputLayers()+152)
01-11 11:51:46.866 12577 12577 D destroyLayer: #06 pc 00000000001edf24  /system/bin/surfaceflinger (android::compositionengine::impl::Output::collectVisibleLayers(android::compositionengine::CompositionRefreshArgs const&, android::compositionengine::Output::CoverageState&)+188)
01-11 11:51:46.866 12577 12577 D destroyLayer: #07 pc 00000000001edd70  /system/bin/surfaceflinger (android::compositionengine::impl::Output::rebuildLayerStacks(android::compositionengine::CompositionRefreshArgs const&, std::__1::unordered_set<android::sp<android::compositionengine::LayerFE>, android::compositionengine::LayerFESpHash, std::__1::equal_to<android::sp<android::compositionengine::LayerFE> >, std::__1::allocator<android::sp<android::compositionengine::LayerFE> > >&)+276)
01-11 11:51:46.866 12577 12577 D destroyLayer: #08 pc 00000000001ed948  /system/bin/surfaceflinger (android::compositionengine::impl::Output::prepare(android::compositionengine::CompositionRefreshArgs const&, std::__1::unordered_set<android::sp<android::compositionengine::LayerFE>, android::compositionengine::LayerFESpHash, std::__1::equal_to<android::sp<android::compositionengine::LayerFE> >, std::__1::allocator<android::sp<android::compositionengine::LayerFE> > >&)+56)
01-11 11:51:46.866 12577 12577 D destroyLayer: #09 pc 00000000001e5c88  /system/bin/surfaceflinger (android::compositionengine::impl::CompositionEngine::present(android::compositionengine::CompositionRefreshArgs&)+120)
01-11 11:51:46.866 12577 12577 D destroyLayer: #10 pc 00000000001a7828  /system/bin/surfaceflinger (android::SurfaceFlinger::composite(long, long)+1628)
01-11 11:51:46.866 12577 12577 D destroyLayer: #11 pc 0000000000183fb0  /system/bin/surfaceflinger (android::impl::MessageQueue::Handler::handleMessage(android::Message const&)+116)
01-11 11:51:46.866 12577 12577 D destroyLayer: #12 pc 0000000000017500  /system/lib64/libutils.so (android::Looper::pollInner(int)+376)
01-11 11:51:46.866 12577 12577 D destroyLayer: #13 pc 0000000000017328  /system/lib64/libutils.so (android::Looper::pollOnce(int, int*, int*, void**)+112)
01-11 11:51:46.866 12577 12577 D destroyLayer: #14 pc 000000000018462c  /system/bin/surfaceflinger (android::impl::MessageQueue::waitMessage()+84)
01-11 11:51:46.866 12577 12577 D destroyLayer: #15 pc 000000000018cbec  /system/bin/surfaceflinger (android::scheduler::Scheduler::run()+28)
01-11 11:51:46.866 12577 12577 D destroyLayer: #16 pc 00000000001e5640  /system/bin/surfaceflinger (main+1992)
01-11 11:51:46.866 12577 12577 D destroyLayer: #17 pc 000000000004a1f4  /apex/com.android.runtime/lib64/bionic/libc.so (__libc_init+96)

堆栈打印出来就很明显啦,那就是在

        mCurrentOutputLayersOrderedByZ = std::move(mPendingOutputLayersOrderedByZ);

赋值时候就会导致mCurrentOutputLayersOrderedByZ析构,从而一系列的析构方法回调

本文章对应视频手把手教你学framework: hal+perfetto+surfaceflinger mp.weixin.qq.com/s/LbVLnu1ud… 在这里插入图片描述

私聊作者+v(androidframework007)

七件套专题:在这里插入图片描述 点击这里 mp.weixin.qq.com/s/Qv8zjgQ0C…

视频:www.bilibili.com/video/BV1wc…