【Android】AHandler/AMessage/ALooper机制

以MediaCodec.cpp中, mCodecLooper 成员的使用来说明

cpp 复制代码
init() 函数中
if (mCodecLooper == NULL) {
    mCodecLooper = new ALooper;  // 构造ALooper
    mCodecLooper->setName("CodecLooper");  //设置消息处理线程的线程name,方便trace分析查看
    mCodecLooper->start(false, false, ANDROID_PRIORITY_AUDIO); //创建消息处理线程,新线程loop()循环检测主AHandler发来的消息
}
  // 将mCodec这个AHandle与关联的Alooper注册保存起来,
  // 注册后, AHandle发送的消息,才能找到对应的ALooper,并post
  // ALooper才能收到消息并调用AHandler的onMessageReceived来处理
    mCodecLooper->registerHandler(mCodec);

reset() 函数中
if (mCodecLooper != NULL) {
    //清理掉 mCodec这个AHandler相关联的Alooper, 此AHandler再发的消息,就没有ALooper发送了
    mCodecLooper->unregisterHandler(mCodec->id());
}

以下是具体的调用流程

由于刚刚 registerHandler的对象是MediaCodec的 mCodec, 可能是ACodec,也可能是 CCodec,

这里以 ACodec为例, 简单说明 AMessage 的post与 处理流程

从图可知, AHandler post AMessage时, 最终会在新线程中调用AHandler (其子类)的 onMessageReceived() 函数来处理

注意

1个ALooper可能对应多个AHandler,但一个Handler只能有一个ALooper,

这样多个Handler共用一个ALooper时,其发送的消息共用一个消息队列(同一个ALooper的mEventQueue),

但AMessage的AHandler是确定的, 故调用 AMessage::deliver() -> Ahandler::deliverMessage() -> xxx::onMessageReceived()

就分发至各自的AHandler中来处理了

结论

由上可知

APP通过 MediaPlayer.java的方式来使用MediaCodec.cpp时,

NPDecoder-CL 是 NuPlayer创建MediaCodec时,

此线程处理 MediaCodec类 以及 非Video Codec的 ACodec 类中的相关信息;

因为在MediaCodec.cpp中, 针对非Video Codec时, registerHandler(mCodec)

还 registerHandler(this)

APP通过 MediaCodec.java的方式来使用MediaCodec.cpp时,

有 MediaCodec_looper 消息处理线程,

此线程不仅处理 JNI中 JMediaCodec 类的消息,

还处理 MediaCodec类 以及 非Video Codec的 ACodec 类中的相关信息;

CodecLooper 线程处理 Video Codec的 ACodec 类中的相关信息;

由上可知,ALooper注册了哪些AHandler, 则其消息处理线程均会处理对应的AHandler的信息

所以分析Trace的时候,先确定消息处理线程的name, 再查看代码其注册的AHandler,最后确定处理的消息

为了方便查找,如下列举了一些 Thread Name以及对应处理的AHandler的类

相关推荐
金融RPA机器人丨实在智能3 小时前
Android Studio开发App项目进入AI深水区:实在智能Agent引领无代码交互革命
android·人工智能·ai·android studio
科技块儿3 小时前
利用IP查询在智慧城市交通信号系统中的应用探索
android·tcp/ip·智慧城市
独行soc3 小时前
2026年渗透测试面试题总结-18(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
王码码20354 小时前
Flutter for OpenHarmony 实战之基础组件:第二十七篇 BottomSheet — 动态底部弹窗与底部栏菜单
android·flutter·harmonyos
2501_915106324 小时前
app 上架过程,安装包准备、证书与描述文件管理、安装测试、上传
android·ios·小程序·https·uni-app·iphone·webview
vistaup4 小时前
OKHTTP 默认构建包含 android 4.4 的TLS 1.2 以及设备时间不对兼容
android·okhttp
常利兵4 小时前
ButterKnife在Android 35 + Gradle 8.+环境下的适配困境与现代化迁移指南
android
撩得Android一次心动4 小时前
Android LiveData 全面解析:使用Java构建响应式UI【源码篇】
android·java·android jetpack·livedata
熊猫钓鱼>_>4 小时前
移动端开发技术选型报告:三足鼎立时代的开发者指南(2026年2月)
android·人工智能·ios·app·鸿蒙·cpu·移动端
Rainman博14 小时前
WMS-窗口relayout&FinishDrawing
android