Android14 InputManager SurfaceFlinger同步Windowinfo到Input

本文详细探讨了WMS如何通过setInputWindowInfo将信息设置到SurfaceFlinger,并解释了这个过程如何通知Input以及涉及的相关组件如WindowInfosListener和WindowInfosListenerInvoker的工作原理。
摘要由CSDN通过智能技术生成

WMS通过 setInputWindowInfo将信息设置到SurfaceFlinger后是如何通知到Input的呢?如下图

  setInputWindowInfo将信息设置到SurfaceFlinger

12-26 14:09:36.912  2315  2315 D jinyanmeifocus: updateInputFlinger 
12-26 14:09:36.920  2315  2650 D jinyanmeifocus:   #00 pc 00000000001b1504  /system/bin/surfaceflinger (android::WindowInfosListenerInvoker::windowInfosChanged(android::gui::WindowInfosUpdate, std::__1::unordered_set<android::sp<android::gui::IWindowInfosReportedListener>, android::gui::SpHash<android::gui::IWindowInfosReportedListener>, std::__1::equal_to<android::sp<android::gui::IWindowInfosReportedListener> >, std::__1::allocator<android::sp<android::gui::IWindowInfosReportedListener> > >, bool)+116) (BuildId: 7b6306e54c32d48d9de95fd2f4f7363c)
12-26 14:09:36.920  2315  2650 D jinyanmeifocus:   #01 pc 000000000023e048  /system/bin/surfaceflinger (std::__1::__function::__func<android::SurfaceFlinger::updateInputFlinger(android::VsyncId, android::TimePoint)::$_0, std::__1::allocator<android::SurfaceFlinger::updateInputFlinger(android::VsyncId, android::TimePoint)::$_0>, void ()>::operator()() (.__uniq.59679109406690186319419933358127648880.b7ab55bb571e826de581a294e3abdb85)+668) (BuildId: 7b6306e54c32d48d9de95fd2f4f7363c)
12-26 14:09:36.920  2315  2650 D jinyanmeifocus:   #02 pc 00000000001510f8  /system/bin/surfaceflinger (void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, android::BackgroundExecutor::BackgroundExecutor()::$_0> >(void*) (.__uniq.40551338734768535425960610675403556019)+588) (BuildId: 7b6306e54c32d48d9de95fd2f4f7363c)
12-26 14:09:36.920  2315  2650 D jinyanmeifocus:   #03 pc 00000000000cb6a8  /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+208) (BuildId: a87908b48b368e6282bcc9f34bcfc28c)
12-26 14:09:36.920  2315  2650 D jinyanmeifocus:   #04 pc 000000000006821c  /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64) (BuildId: a87908b48b368e6282bcc9f34bcfc28c)
12-26 14:09:36.940  2315  2315 D jinyanmeifocus:   #00 pc 0000000000211cfc  /system/bin/surfaceflinger (android::SurfaceFlinger::commit(android::TimePoint, android::VsyncId, android::TimePoint)+13448) (BuildId: 7b6306e54c32d48d9de95fd2f4f7363c)
12-26 14:09:36.940  2315  2315 D jinyanmeifocus:   #01 pc 00000000001f1860  /system/bin/surfaceflinger (android::scheduler::Scheduler::onFrameSignal(android::ICompositor&, android::VsyncId, android::TimePoint)+60) (BuildId: 7b6306e54c32d48d9de95fd2f4f7363c)
12-26 14:09:36.940  2315  2315 D jinyanmeifocus:   #02 pc 0000000000019044  /system/lib64/libutils.so (android::Looper::pollInner(int)+548) (BuildId: ab8535da6fc0d3526aee3d4b6edd4117)
12-26 14:09:36.941  2315  2315 D jinyanmeifocus:   #03 pc 0000000000018dc0  /system/lib64/libutils.so (android::Looper::pollOnce(int, int*, int*, void**)+120) (BuildId: ab8535da6fc0d3526aee3d4b6edd4117)
12-26 14:09:36.941  2315  2315 D jinyanmeifocus:   #04 pc 00000000001e3334  /system/bin/surfaceflinger (android::impl::MessageQueue::waitMessage()+84) (BuildId: 7b6306e54c32d48d9de95fd2f4f7363c)
12-26 14:09:36.941  2315  2315 D jinyanmeifocus:   #05 pc 00000000001f181c  /system/bin/surfaceflinger (android::scheduler::Scheduler::run()+28) (BuildId: 7b6306e54c32d48d9de95fd2f4f7363c)
12-26 14:09:36.941  2315  2315 D jinyanmeifocus:   #06 pc 0000000000256b0c  /system/bin/surfaceflinger (main+1792) (BuildId: 7b6306e54c32d48d9de95fd2f4f7363c)
12-26 14:09:36.941  2315  2315 D jinyanmeifocus:   #07 pc 000000000005f610  /apex/com.android.runtime/lib64/bionic/libc.so (__libc_init+104) (BuildId: a87908b48b368e6282bcc9f34bcfc28c)

这里遍历的listener实际上是DispatcherWindowListener

WindowInfosListener的添加

下面来看WindowInfosListenerReporter是如何添加到WindowInfosListenerInvoker中的

void WindowInfosListenerInvoker::addWindowInfosListener(sp<IWindowInfosListener> listener,
                                                        gui::WindowInfosListenerInfo* outInfo) {
    int64_t listenerId = mNextListenerId++;
    outInfo->listenerId = listenerId;
    outInfo->windowInfosPublisher = sp<gui::IWindowInfosPublisher>::fromExisting(this);
                ALOGJIN("addWindowInfosListener     ");
                android::CallStack stack(LOG_TAGJINYANMEI);
    BackgroundExecutor::getInstance().sendCallbacks(
            {[this, listener = std::move(listener), listenerId]() {
                ATRACE_NAME("WindowInfosListenerInvoker::addWindowInfosListener");
                sp<IBinder> asBinder = IInterface::asBinder(listener);
                asBinder->linkToDeath(sp<DeathRecipient>::fromExisting(this));
                mWindowInfosListeners.try_emplace(asBinder,
                                                  std::make_pair(listenerId, std::move(listener)));
            }});
}

 //以SurfaceFlinger对端进程binder作为key 保存对应的listner

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值