背景:
分析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干货请关注“千里马学框架”