C层的MessageQueue和NativeMessageQueue

C 层(或者说 Native system 层)的 MessageQueue,它不是 NativeMessageQueue,但它和 NativeMessageQueue 是不同目的的组件。

我们现在来厘清这几个名字相似但角色不同的组件:

一、三个层级的 MessageQueue 对比

名称 所在语言/模块 主要职责 与谁打交道
android.os.MessageQueue Java 层 提供给 Handler 用的消息队列 Java 应用开发者,Handler、Looper
NativeMessageQueue C++(JNI bridge) 封装 Looper,为 Java 提供 native poll 接口 被 android.os.MessageQueue 调用
android::MessageQueue C++(system_server native层) System Server 中用于调度 native 层任务 与 native binder、InputDispatcher 等交互

二、你提到的 C++ 层android::MessageQueue

位于:

frameworks/base/libs/androidfw/MessageQueue.cpp

这个 android::MessageQueue 主要存在于 System Server 的 native 层代码中,例如在 SystemUI、ActivityManagerService 的 native 代码中会用到。

它主要职责是:

  • 作为 native 层任务分发队列;
  • 用来与 Java 层的主线程同步;
  • 通过 Java 的 MessageQueue 与 Looper 共享同一个 NativeMessageQueue 实例。

示例代码(位于 SystemServer 中):

mMessageQueue = new MessageQueue(looper);  // 这里的 looper 是 android::Looper*

它内部使用的是 同一个 Looper 对象,也就是:

android::MessageQueue 是围绕 android::Looper 做的一层封装,提供 C++ 层的消息派发能力。

三者关系图(推荐理解):

                 Java层
──────────────────────────────────────
android.os.Looper
    │
    └── android.os.MessageQueue
            │
            └── JNI 调用 nativePollOnce()
                  │
Native层
──────────────────────────────────────
android::NativeMessageQueue
    │
    └── android::Looper  (真正 epoll 等待、wake)
            │
            └── 被其他 C++ 模块复用
                  │
                  └── android::MessageQueue(System Server 内)

总结

名称 层级 角色 与其他组件的关系
android.os.MessageQueue Java 管理 Java Message 消息的队列 上层接口,依赖 NativeMessageQueue 进行等待
NativeMessageQueue C++ JNI 层 为 Java 层提供 native 等待/wake 能力 持有 android::Looper
android::MessageQueue C++ system server 层 SystemServer 中的消息派发类 同样使用 android::Looper,可以和 Java 主线程共享 Looper

结论

android::MessageQueue 是专门给 native system server 代码用的,而 NativeMessageQueue 是 JNI 层提供给 Java 的桥梁。它们通过共享同一个 android::Looper 实例,在不同层统一调度事件。

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器