1.AudioServer初始化

AudioServer 是 Android 音频系统的核心服务,负责管理音频硬件资源、音频策略调度、跨进程音频通信等核心功能。它由 Init 进程启动,是系统核心服务之一,直接影响音频播放、录音、音效处理等功能的正常运行。

1.1AudioServer服务创建过程

Init 进程通过解析/system/bin/audioserver/audioserver.rc配置文件,完成 AudioServer 的服务定义与启动参数配置。
请添加图片描述

service audioserver /system/bin/audioserver  class core  user audioserver  # media gid needed for /dev/fm (radio) and for /data/misc/media (tee)  group audio camera drmrpc media mediadrm net_bt net_bt_admin net_bw_acct wakelock  capabilities BLOCK_SUSPEND  # match rtprio cur / max with sensor service as we handle AR/VR HID sensor data.  rlimit rtprio 10 10  ioprio rt 4  task_profiles ProcessCapacityHigh HighPerformance  onrestart restart vendor.audio-hal  onrestart restart vendor.audio-hal-aidl  onrestart restart vendor.audio-effect-hal-aidl  onrestart restart vendor.audio-hal-4-0-msd  onrestart restart audio_proxy_service  
​  
on property:vts.native_server.on=1  stop audioserver  
on property:vts.native_server.on=0  start audioserver  
​  
on property:init.svc.audioserver=stopped  stop vendor.audio-hal  stop vendor.audio-hal-aidl  stop vendor.audio-effect-hal-aidl  stop vendor.audio-hal-4-0-msd  stop audio_proxy_service  # See b/155364397. Need to have HAL service running for VTS.  # Can't use 'restart' because then HAL service would restart  # audioserver bringing it back into running state.  start vendor.audio-hal  start vendor.audio-hal-aidl  start vendor.audio-effect-hal-aidl  start vendor.audio-hal-4-0-msd  start audio_proxy_service  
​  
on property:init.svc.audioserver=running && property:vts.native_server.on=1  # See b/378773354. To ensure the audioserver disable when  # running test suite, this would cover the double start  # request from init that caused test flaky.  stop audioserver  
​  
on property:init.svc.audioserver=running  start vendor.audio-hal  start vendor.audio-hal-aidl  start vendor.audio-effect-hal-aidl  start vendor.audio-hal-4-0-msd  start audio_proxy_service  
​  
on property:sys.audio.restart.hal=1  # See b/159966243. Avoid restart loop between audioserver and HAL.  # Keep the original service names for backward compatibility  stop vendor.audio-hal  stop vendor.audio-hal-aidl  stop vendor.audio-effect-hal-aidl  stop vendor.audio-hal-4-0-msd  stop audio_proxy_service  start vendor.audio-hal  start vendor.audio-hal-aidl  start vendor.audio-effect-hal-aidl  start vendor.audio-hal-4-0-msd  start audio_proxy_service  # reset the property  setprop sys.audio.restart.hal 0  on init  mkdir /dev/socket/audioserver 0775 audioserver audioserver
  1. 服务定义

    service audioserver /system/bin/audioserver

    class core

    user audioserver

    • 定义了 audioserver 服务的启动路径 /system/bin/audioserver

    • class core 表示该服务属于核心服务类。

    • user audioserver 指定该服务以 audioserver 用户身份运行,确保权限隔离。

  2. 权限组

    group audio camera drmrpc media mediadrm net_bt net_bt_admin net_bw_acct wakelock

    • 指定了服务所属的权限组,允许它访问音频设备、摄像头、蓝牙功能、网络带宽计费等资源。
  3. 能力与资源限制

    capabilities BLOCK_SUSPEND

    rlimit rtprio 10 10

    ioprio rt 4

    task_profiles ProcessCapacityHigh HighPerformance

    • BLOCK_SUSPEND:允许服务阻止设备进入休眠状态。

    • rlimit rtprioioprio rt:设置实时优先级和 I/O 优先级,确保服务在处理音频任务时具有较高的性能。

    • task_profiles:定义任务性能配置文件,优化服务的运行效率。

  4. 重启行为

    onrestart restart vendor.audio-hal

    onrestart restart vendor.audio-hal-aidl

    onrestart restart vendor.audio-effect-hal-aidl

    onrestart restart vendor.audio-hal-4-0-msd

    onrestart restart audio_proxy_service

    • audioserver 服务重启时,相关的音频 HAL(硬件抽象层)服务也会被重启,确保音频功能的正常运行。
  5. 属性触发器

    on property:vts.native_server.on=1

    stop audioserver

    on property:vts.native_server.on=0

    start audioserver

    • 根据系统属性 vts.native_server.on 的值,控制 audioserver 的启动或停止。这通常用于测试场景。
  6. 停止与启动逻辑

    on property:init.svc.audioserver=stopped

    stop vendor.audio-hal

    stop vendor.audio-hal-aidl

    stop vendor.audio-effect-hal-aidl

    stop vendor.audio-hal-4-0-msd

    stop audio_proxy_service

    start vendor.audio-hal

    start vendor.audio-hal-aidl

    start vendor.audio-effect-hal-aidl

    start vendor.audio-hal-4-0-msd

    start audio_proxy_service

    • audioserver 停止时,相关 HAL 服务也会停止并重新启动,确保系统的稳定性。
  7. 初始化行为

    on init

    mkdir /dev/socket/audioserver 0775 audioserver audioserver

    • 在系统初始化时,创建 /dev/socket/audioserver 目录,并设置权限和所有者。

1.2.AudioServer启动流程

  • audioserver服务通过/system/bin/audioserver可执行文件启动,核心逻辑在main_audioserver.cppmain函数中,流程如下:

    1. 内存限制与信号处理
    • limitProcessMemory:通过audio.maxmem属性或默认值(512MB)限制进程最大内存,避免音频服务过度占用资源。

    • signal(SIGPIPE, SIG_IGN):忽略管道断裂信号(避免音频流中断时进程异常退出)。

    2. 进程分叉
    • 父进程:运行media.log日志服务,监控子进程状态并输出资源使用日志。

    • 子进程:执行音频服务初始化(核心流程),并通过prctl设置父进程死亡时自毁(避免孤儿进程)。

    3. 线程池初始化
    • configureRpcThreadpool(4, false):初始化 HIDL RPC 线程池(4 个线程),用于与音频 HAL(硬件抽象层)进行跨进程通信(HAL 通常运行在独立进程)。

    • ProcessState::self()->startThreadPool():启动 Binder 线程池,处理应用层或其他服务通过 Binder IPC 发起的音频请求(如播放、录音)。

    4. 核心服务创建与注册
    • 创建服务实例

      • sp<AudioFlinger>::make():创建AudioFlinger实例(负责音频硬件管理、混音、音量控制等核心功能)。

      • sp<AudioPolicyService>::make():创建AudioPolicyService实例(负责音频策略决策,如音量策略、设备切换逻辑)。

    • 注册服务

      1. 本地注册:通过AudioSystem::setLocalAudioFlingersetLocalAudioPolicyService将实例注册到进程内(供本地调用)。

      2. 系统服务注册:通过IServiceManager::addService将实例注册到系统服务管理器(servicemanager),供跨进程调用(服务名称分别为IAudioFlingerAudioPolicyService)。

    5. AAudioService 初始化(低延迟音频)
    • 查询系统 MMAP 策略(

      AudioSystem::getMmapPolicyInfos

      若策略为AUTO\ALWAYS(允许内存映射),则初始化AAudioService

      • AAudioService是 Android O 引入的低延迟音频服务,基于 MMAP(内存映射)机制,支持实时音频流(如游戏音效、乐器应用),仅在策略允许时启动。
    6. 完成初始化并进入线程池
    • 记录初始化耗时(startupFinished),通过IPCThreadState::self()->joinThreadPool()进入 Binder 线程池,等待并处理外部音频请求。

frameworks/av/media/audioserver/main_audioserver.cpp

 int main(int argc __unused, char **argv)  {  const auto startTime = std::chrono::steady_clock::now();  limitProcessMemory(  "audio.maxmem", /* "ro.audio.maxmem", property that defines limit */  (size_t)512 * (1 << 20), /* SIZE_MAX, upper limit in bytes */  20 /* upper limit as percentage of physical RAM */);  ​  signal(SIGPIPE, SIG_IGN);  ​  #if 1  const bool doLog = false;  #else  bool doLog = (bool) property_get_bool("ro.test_harness", 0);  #endif  pid_t childPid;  if (doLog && (childPid = fork()) != 0) {  strcpy(argv[0], "media.log");  sp<ProcessState> proc(ProcessState::self());  MediaLogService::instantiate();  ProcessState::self()->startThreadPool();  IPCThreadState::self()->joinThreadPool();  for (;;) {  siginfo_t info;  int ret = TEMP_FAILURE_RETRY(waitid(P_PID, childPid, &info,  WEXITED | WSTOPPED | WCONTINUED));  if (ret < 0) {  break;  }  char buffer[32];  const char *code;  struct rusage usage;  getrusage(RUSAGE_CHILDREN, &usage);  ALOG(LOG_ERROR, "media.log", "pid %d status %d code %s user %ld.%03lds sys %ld.%03lds",  info.si_pid, info.si_status, code,  usage.ru_utime.tv_sec, usage.ru_utime.tv_usec / 1000,  usage.ru_stime.tv_sec, usage.ru_stime.tv_usec / 1000);  sp<IServiceManager> sm = defaultServiceManager();  sp<IBinder> binder = sm->getService(String16("media.log"));  if (binder != 0) {  Vector<String16> args;  binder->dump(-1, args);  }  switch (info.si_code) {  case CLD_EXITED:  case CLD_KILLED:  case CLD_DUMPED: {  ALOG(LOG_INFO, "media.log", "exiting");  _exit(0);  // not reached  }  default:  break;  }  }  } else {  // all other services  if (doLog) {  prctl(PR_SET_PDEATHSIG, SIGKILL);   // if parent media.log dies before me, kill me also  setpgid(0, 0);                      // but if I die first, don't kill my parent  }  android::hardware::configureRpcThreadpool(4, false /*callerWillJoin*/);  ProcessState::self()->startThreadPool();  const auto af = sp<AudioFlinger>::make();  const auto afAdapter = sp<AudioFlingerServerAdapter>::make(af);  ALOGD("%s: AudioFlinger created", __func__);  ALOGW_IF(AudioSystem::setLocalAudioFlinger(af) != OK,  "%s: AudioSystem already has an AudioFlinger instance!", __func__);  const auto aps = sp<AudioPolicyService>::make();  af->initAudioPolicyLocal(aps);  ALOGD("%s: AudioPolicy created", __func__);  ALOGW_IF(AudioSystem::setLocalAudioPolicyService(aps) != OK,  "%s: AudioSystem already has an AudioPolicyService instance!", __func__);  ​  // Start initialization of internally managed audio objects such as Device Effects.  aps->onAudioSystemReady();  ​  // Add AudioFlinger and AudioPolicy to ServiceManager.  sp<IServiceManager> sm = defaultServiceManager();  sm->addService(String16(IAudioFlinger::DEFAULT_SERVICE_NAME), afAdapter,  false /* allowIsolated */, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT);  sm->addService(String16(AudioPolicyService::getServiceName()), aps,  false /* allowIsolated */, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT);  std::vector<AudioMMapPolicyInfo> policyInfos;  status_t status = AudioSystem::getMmapPolicyInfos(  AudioMMapPolicyType::DEFAULT, &policyInfos);  if (status == NO_ERROR &&  std::any_of(policyInfos.begin(), policyInfos.end(), [](const auto& info) {  return info.mmapPolicy == AudioMMapPolicy::AUTO ||  info.mmapPolicy == AudioMMapPolicy::ALWAYS;  })) {  AAudioService::instantiate();  } else {  ALOGD("%s: Do not init aaudio service, status %d, policy info size %zu",  __func__, status, policyInfos.size());  }  const auto endTime = std::chrono::steady_clock::now();  af->startupFinished();  using FloatMillis = std::chrono::duration<float, std::milli>;  const float timeTaken = std::chrono::duration_cast<FloatMillis>(  endTime - startTime).count();  ALOGI("%s: initialization done in %.3f ms, joining thread pool", __func__, timeTaken);  IPCThreadState::self()->joinThreadPool();  }  }  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/93342.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/93342.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/93342.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OSPF 协议(多区域)

1. OSPF 单区域存在的问题① LSDB庞大&#xff0c;占用内存大&#xff0c;SPF计算开销大&#xff1b;② LSA洪泛范围大&#xff0c;拓扑变化影响范围大&#xff1b;③ 路由不能被汇总&#xff0c;路由表庞大&#xff0c;查找路由开销大。2. OSPF 多区域优点① 每个区域独立存储…

R 语言绘制六种精美热图:转录组数据可视化实践(基于 pheatmap 包)

在转录组 Bulk 测序数据分析中&#xff0c;热图是展示基因表达模式、样本聚类关系的核心可视化工具。一张高质量的热图不仅能清晰呈现数据特征&#xff0c;更能提升研究成果的展示效果。本文基于 R 语言的pheatmap包&#xff0c;整理了六种适用于不同场景的热图绘制方法&#x…

图片PDF识别工具:扫描PDF文件批量OCR区域图识别改名,识别大量PDF区域内容一次性改名

以下是使用“咕嘎批量OCR识别图片PDF多区域内容重命名导出表格系统”进行操作的具体步骤&#xff1a;1. 打开工具并获取区域坐标打开软件后&#xff0c;选择“PDF识别模式”。导入一个PDF文件作为样本&#xff0c;框选需要提取文字的区域&#xff0c;并保存区域坐标。如果有多个…

中国汽车能源消耗量(2010-2024年)

1419中国汽车能源消耗量&#xff08;2010-2024年&#xff09;发文主题分布数据来源中华人民共和国工业和信息化部-中国汽车能源消耗量查询中国汽车能源消耗量查询 (miit.gov.cn)时间跨度2010-2024年数据范围全国汽车企业数据指标本数据集包含包含传统汽车能源消耗量数据以及新能…

Python 实现服务器自动故障处理工具:从监控到自愈的完整方案

在服务器运维过程中,80% 的故障都是重复性的简单问题(如磁盘空间不足、内存泄漏、服务进程挂掉等)。本文将介绍如何使用 Python 开发一款轻量级自动故障处理工具,通过状态监控、异常诊断、自动修复三个核心模块,实现服务器常见故障的无人值守处理。 核心依赖库 psutil:跨…

图片上传 el+node后端+数据库

模版部分&#xff1a;鼠标悬浮到头像的部分就出现下拉框显示可以修改头像&#xff0c;el-upload是隐藏的&#xff0c;可能只是为了实现on-change函数和before-upload函数吧这块做的确实有点马虎了。<div class"r-content"><el-dropdown><span class&q…

[java 常用类API] 新手小白的编程字典

目录 1.API 1.1定义: 2.Object类 2.1 toString() 方法 2.2 equals() 方法 3. Arrays 类 3.1 equals() 方法 3.2 sort() 方法 3.2.1排序 3.2.2 自定义对象排序 3.3 binarySearch() 方法 3.4 copyOf() 方法 3.5 fill() 方法 3.6 toString() 方法 4.基本数据类型包装类 4.…

去除视频字幕 2, 使用 PaddleOCR 选取图片中的字幕区域, 根据像素大小 + 形状轮廓

有人问我在搞什么&#xff1a;就是做这里的第2步。问题描述这里误导&#xff0c;误判&#xff0c;太严重了。如果我把这个区域当做是 mask ,那么真正的目标会被去除掉还有什么建议吗&#xff1f;比如我能否根据这个mask 的大致形状来判断它是不是字幕&#xff0c; 如果不是细长…

Ubuntu 连接Visual SVN

Windows服务器上的svn仓库为&#xff1a; https://ldw_online:8443/svn/OnlineRepository/LVC IP地址为192.168.8.8 4. 从 Ubuntu 测试连通性 在 Ubuntu 上可以用&#xff1a; bash 复制编辑 curl -vk https://192.168.8.8:8443/ 如果返回 HTTP 头或 SSL 握手成功&#xff…

JAVA:Spring Boot 集成 Protobuf 的技术指南

🚀 1、简述 在分布式服务通信中,数据序列化与反序列化的效率对系统性能影响极大。Protocol Buffers(Protobuf) 是由 Google 提出的一种高效的结构化数据序列化协议,具有: 🔥 高性能(远优于 JSON/XML) 📦 跨语言支持 📉 较小的体积 本篇将带你了解如何在 Spring…

SQLServer内存释放工具介绍:一款实用的数据库性能优化助手

SQLServer内存释放工具介绍&#xff1a;一款实用的数据库性能优化助手 去发现同类优质开源项目:https://gitcode.com/ 在数据库管理中&#xff0c;内存释放是优化服务器性能的重要环节。本文将为您详细介绍一款名为SQLServer内存释放工具的开源项目&#xff0c;帮助您轻松管理…

《蓝耘容器全栈技术指南:企业级云原生与异构计算实战大全》

&#x1f31f; 嗨&#xff0c;我是Lethehong&#xff01;&#x1f31f; &#x1f30d; 立志在坚不欲说&#xff0c;成功在久不在速&#x1f30d; &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞⬆️留言收藏&#x1f680; &#x1f340;欢迎使用&#xff1a;小智初学计…

计算器3.0:实现用户自定义组件

前言&#xff1a; 马总给我提出计算器3.0新需求&#xff1a;可以在页面上输入一个组件&#xff0c;用户的组件库里面就多一个组件&#xff0c;用户就可以使用 一、解决方法&#xff1a; 1. 新增成员变量和初始化 // 新增的输入框 private InputBox newInputBox; // 新增的组…

PIG AI 全新升级:全新 MCP 能力加持,让企业级 AI 开发效率翻倍!

你是否曾为 AI 应用的开发门槛而头疼?调试代码耗费数小时、集成外部工具需要复杂配置、想要快速构建智能系统却不知从何下手…别担心!PIG AI 最新版本带来的 MCP(Model Context Protocol)能力,正为这些问题提供一站式解决方案。本文将带你深入浅出地了解这一重磅升级,手把…

Springboot+vue超市管理系统的设计与实现

文章目录前言详细视频演示具体实现截图后端框架SpringBoot前端框架Vue持久层框架MyBaits成功系统案例&#xff1a;代码参考数据库源码获取前言 博主介绍:CSDN特邀作者、985高校计算机专业毕业、现任某互联网大厂高级全栈开发工程师、Gitee/掘金/华为云/阿里云/GitHub等平台持续…

一文快速了解Docker和命令详解

本文让你快速了解Docker是什么的东西&#xff0c;在我们程序开发的时候到底有什么作用&#xff0c;为什么需要去学习它。本文章只是做一个简单的概述配套黑马课程让你快速了解、使用Docker。 一、什么是Docker&#xff1f; Docker是一个开源的容器化平台&#xff0c;允许开发者…

【GaussDB】如何从GaussDB发布包中提取出内核二进制文件

【GaussDB】如何从GaussDB发布包中提取出内核二进制文件 背景 GaussDB 从505和506版本起&#xff08;前面的版本不清楚&#xff09;&#xff0c;华为官方不再提供用脚本安装GaussDB的方式&#xff08;应该是基于运维交付标准化的角度考虑&#xff09;&#xff0c;仅支持使用T…

ETH 交易流程深度技术详解

概述在前面对 PolkaVM 和 Revive 的文章中&#xff0c;我们介绍了很多技术细节&#xff0c;开发工具。还对比 EVM&#xff0c;知道了 PolkaVM 的优势。很多同学还是对 Polkadot SDK 为什么可以运行 EVM 兼容的智能合约&#xff0c;以及交易处理的整个流程不太清楚。这篇文章将会…

【算法训练营Day17】二叉树part7

文章目录二叉树的最近公共祖先二叉搜索树的最近公共祖先二叉搜索树中的插入操作删除二叉搜索树中的节点二叉树的最近公共祖先 题目链接&#xff1a;236. 二叉树的最近公共祖先 解题逻辑&#xff1a; 最近公共祖先的定义为&#xff1a;对于有根树 T 的两个节点 p、q&#xff0c…

Vue插件与组件核心区别详解

在 Vue 中&#xff0c;插件&#xff08;Plugin&#xff09; 和 组件&#xff08;Component&#xff09; 是两种不同层次的概念&#xff0c;它们的主要区别如下&#xff1a;1. 组件 (Component) 定义&#xff1a; Vue 应用的基本构建单元&#xff0c;是可复用的 Vue 实例&#x…