1. 整个加载流程图

2. 加载hal so的代码位置

2.1 在audiopolicymanager中的加载位置

diff --git a/frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
index 632290a933..54ead728ea 100644
--- a/frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
+++ b/frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
@@ -4110,6 +4110,7 @@ status_t AudioPolicyManager::initialize() {audio_devices_t inputDeviceTypes = mAvailableInputDevices.types() & ~AUDIO_DEVICE_BIT_IN;for (const auto& hwModule : mHwModulesAll) {hwModule->setHandle(mpClientInterface->loadHwModule(hwModule->getName()));
+        ALOGW("===weiqifa=== loadHwModule() %s", hwModule->getName());if (hwModule->getHandle() == AUDIO_MODULE_HANDLE_NONE) {ALOGW("could not open HW module %s", hwModule->getName());continue;

2.2 在audioflinger中加载

AudioFlinger.cpp

audio_module_handle_t AudioFlinger::loadHwModule(const char *name)
{if (name == NULL) {return AUDIO_MODULE_HANDLE_NONE;}if (!settingsAllowed()) {return AUDIO_MODULE_HANDLE_NONE;}Mutex::Autolock _l(mLock);return loadHwModule_l(name);
}// loadHwModule_l() must be called with AudioFlinger::mLock held
audio_module_handle_t AudioFlinger::loadHwModule_l(const char *name)
{for (size_t i = 0; i < mAudioHwDevs.size(); i++) {if (strncmp(mAudioHwDevs.valueAt(i)->moduleName(), name, strlen(name)) == 0) {ALOGW("loadHwModule() module %s already loaded", name);return mAudioHwDevs.keyAt(i);}}sp<DeviceHalInterface> dev;int rc = mDevicesFactoryHal->openDevice(name, &dev);if (rc) {ALOGE("loadHwModule() error %d loading module %s", rc, name);return AUDIO_MODULE_HANDLE_NONE;}mHardwareStatus = AUDIO_HW_INIT;rc = dev->initCheck();mHardwareStatus = AUDIO_HW_IDLE;if (rc) {ALOGE("loadHwModule() init check error %d for module %s", rc, name);return AUDIO_MODULE_HANDLE_NONE;}// Check and cache this HAL's level of support for master mute and master// volume.  If this is the first HAL opened, and it supports the get// methods, use the initial values provided by the HAL as the current// master mute and volume settings.AudioHwDevice::Flags flags = static_cast<AudioHwDevice::Flags>(0);{  // scope for auto-lock patternAutoMutex lock(mHardwareLock);if (0 == mAudioHwDevs.size()) {mHardwareStatus = AUDIO_HW_GET_MASTER_VOLUME;float mv;if (OK == dev->getMasterVolume(&mv)) {mMasterVolume = mv;}mHardwareStatus = AUDIO_HW_GET_MASTER_MUTE;bool mm;if (OK == dev->getMasterMute(&mm)) {mMasterMute = mm;}}mHardwareStatus = AUDIO_HW_SET_MASTER_VOLUME;if (OK == dev->setMasterVolume(mMasterVolume)) {flags = static_cast<AudioHwDevice::Flags>(flags |AudioHwDevice::AHWD_CAN_SET_MASTER_VOLUME);}mHardwareStatus = AUDIO_HW_SET_MASTER_MUTE;if (OK == dev->setMasterMute(mMasterMute)) {flags = static_cast<AudioHwDevice::Flags>(flags |AudioHwDevice::AHWD_CAN_SET_MASTER_MUTE);}mHardwareStatus = AUDIO_HW_IDLE;}audio_module_handle_t handle = (audio_module_handle_t) nextUniqueId(AUDIO_UNIQUE_ID_USE_MODULE);mAudioHwDevs.add(handle, new AudioHwDevice(handle, name, dev, flags));ALOGI("loadHwModule() Loaded %s audio interface, handle %d", name, handle);return handle;}

3. 开机日志

# logcat |grep loadHwModule278   278 I AudioFlinger: loadHwModule() Loaded primary audio interface, handle 10278   278 I AudioFlinger: loadHwModule() Loaded a2dp audio interface, handle 18278   278 I AudioFlinger: loadHwModule() Loaded r_submix audio interface, handle 26

4. so 在系统的位置

0:/ # find / -iname *primary*.so 2>/dev/nul
/vendor/lib/hw/audio.primary.default.so
/vendor/lib/hw/audio.primary.mt8167.so
/vendor/lib/libaudioprimarydevicehalifclient.so
1|Knowin inSight10:/ #

android 音频加载hal so调试相关推荐

  1. Android动态加载技术

    基本信息 Author:kaedea GitHub:android-dynamical-loading 我们很早开始就在Android项目中采用了动态加载技术,主要目的是为了达到让用户不用重新安装AP ...

  2. 无法从Windows上的资产index.android.bundle加载脚本

    本文翻译自:Unable to load script from assets index.android.bundle on windows I'm trying to run my first R ...

  3. 从UIL库谈Android图片加载中需要注意的事情

    Android Universal Image Loader 算是Android中最流行的图片加载库了,作者Sergey的确牛逼,能将整个Android图片加载的点点滴滴考虑的如此全面.网上研究这个开 ...

  4. Android图片加载框架最全解析(八),带你全面了解Glide 4的用法

    本文转载自郭神的Glide分析系列:http://blog.csdn.net/guolin_blog/article/details/78582548 本文同步发表于我的微信公众号,扫一扫文章底部的二 ...

  5. Android图片加载框架 Glide 4 的用法

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/78582548 本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭 ...

  6. Android WebView 加载https网页白屏,空白解决方案

    最近在做一个H5相关的需求,使用WebView加载第三方提供的https网页时显示白屏.但是调试打开Baidu和B站的https网址时就能正常打开.被这个问题困扰了半天. 合作方说是android手机 ...

  7. 初探Google推荐Android图片加载框架Glide

    简介 运行Demo 安装依赖包 现在编译好的依赖 Gradle Maven Proguard 简单使用 设置暂未图和加载失败图 加载封面图 从其他路径加载图片 加载图片到其他控件 调试信息 开启请求响 ...

  8. Android图片加载框架——Glide(Glide v4)

    原文地址 Android图片加载框架--Glide(Glide v4) 前言 android中图片加载框架有很多,所有框架最终达到的目都是在Android平台上以极度简单的方式加载和展示图片,如果我们 ...

  9. android edittext html 图片,Android EditText加载HTML内容(内容包含网络图片) -电脑资料...

    android中的Html.fromHtml可以用来加载HTML的内容,fromHtml有三个参数需要设置,第一个是要显示的html内容,第二个就是要说的重点,ImageGetter,用来处理图片加载 ...

最新文章

  1. Git bash 终止git log 命令
  2. 发现check_nginx.sh 里的一个小bug~~~
  3. 为什么要学习 Markdown?究竟有什么用?怎么用?
  4. centos7搭建SVN+Apache+IF.svnadmin支持https实现web管理SVN
  5. 基于java的餐饮管理系统_基于java的餐饮管理系统
  6. jzoj6316-djq的朋友圈【状压dp】
  7. node.js 和 HTML5-Canvas 结合实现截图上传交互
  8. UVa 297 - Quadtrees
  9. Launch和Shut Off操作详解 - 每天5分钟玩转 OpenStack(30)
  10. L2-014. 列车调度-PAT团体程序设计天梯赛GPLT
  11. 一文读懂C++程序的结构、执行与编译
  12. 大多数元素python_学Python必知的20个技巧,掌握它们,准没错
  13. 邮件里直接显示图片_Python自动化:自动化发送邮件之SMTP
  14. 网站开发之HTML基础表格Table和表单Form(三)
  15. JS敏感信息泄露:不容忽视的WEB漏洞
  16. ant-desigh+prolayout布局,修改面包屑的分隔符号,百度搜遍了都找不到办法,csdn解决了
  17. JavaWeb登陆界面
  18. 班级网站的设计与实现
  19. IntelliJ IDEA运行内存设置
  20. php网页加入音乐和歌词,怎么给视频加歌词,给mv加歌词,视频加歌词字幕

热门文章

  1. 走出浮躁的泥沼:浮躁的社会原因 控制好自己的物欲
  2. 线程让出实验【RT-Thread学习笔记 4】
  3. netbeans搭建安卓开发环境
  4. Lync Server 2010迁移至Lync Server 2013故障排错 Part3 :内外网共享PPT提示证书问
  5. java中的多线程有什么意义_Java多线程与并发面试题(小结)
  6. python中other_Python other
  7. Python 内置模块之 ConfigParser - 解析 ini 文件
  8. 清华大学《操作系统》(六):非连续内存分配 段式、页式、段页式存储管理
  9. python中的魔术方法
  10. *args, **kwargs的用法