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 实例,在不同层统一调度事件。