《ZeroTier教程》02-使用docker部署自建PLANET和controller 二次开发ztncui控制面板
2025/12/17 22:58:35
packages/modules这是一个非常专业且深刻的问题。Audio 系统的模块化确实是 Android 架构演进中的一个特殊案例。
frameworks/av/:frameworks/av/ ├── services/audiopolicy/ # 音频策略服务 ├── media/ # 媒体框架 └── camera/ # 摄像头(共用部分基础设施)hardware/:hardware/interfaces/audio/ └── HIDL/AIDL 接口定义packages/modules/:packages/modules/Bluetooth/audio/ # 蓝牙音频相关对比示例:
| 场景 | 模块化音频延迟 | 当前架构延迟 |
|---|---|---|
| 游戏音频 | 20-30ms | 5-10ms |
| VoIP 通话 | 15-25ms | 8-12ms |
| 媒体播放 | 可接受 | 可接受 |
// 不同厂商的 HAL 差异巨大// 高通:audio.primary.msm8996.so// 三星:audio.primary.exynos.so// 联发科:audio.primary.mtk.soAudio 系统依赖网络: ├── 电源管理 (Power HAL) ├── 设备管理器 (DeviceManager) ├── 传感器 (Sensor HAL) # 用于自动音量调整 ├── 相机 (Camera HAL) # 视频录制同步 ├── 蓝牙 (Bluetooth) # A2DP/HFP ├── USB (USB HAL) # USB 音频 └── DRM 框架 # 受保护内容播放| 组件 | 位置 | 状态 | 原因 |
|---|---|---|---|
| 蓝牙音频 | packages/modules/Bluetooth/audio | 已模块化 | 相对独立 |
| AudioFlinger插件 | 部分 HIDL 化 | 部分 | 新功能实验 |
| 空间音频 | 考虑中 | 规划 | 算法独立 |
// 当前的直接调用路径app → AudioFlinger → HAL → Driver// 延迟:~5ms// 模块化后的路径app →AudioService(APEX)→ AudioFlinger → HAL → Driver// 增加延迟:+3-5ms// 当前:直接内存共享audio_buffer=malloc_shared(SHARED_BUFFER);// 模块化:需要进程间复制audio_buffer=binder_allocate_copy(SHARED_BUFFER);// 额外开销:内存复制 + 同步延迟# 当前:直接链接 LOCAL_SHARED_LIBRARIES := libaudiohal # 模块化:版本化管理 LOCAL_APEX_LIBRARIES := \ com.android.audio@1.0 \ com.android.audio@2.0 # 问题:旧版 HAL 需要新版模块支持| 系统 | 音频架构 | 更新策略 |
|---|---|---|
| Android | 半模块化 | 大版本更新 + 部分 Mainline |
| Windows | 驱动模型 | Windows Update |
| iOS | 完全集成 | 系统更新 |
| Linux 桌面 | PulseAudio 独立 | 包管理器更新 |
// 好消息:API 保持稳定AudioManageram=(AudioManager)getSystemService(AUDIO_SERVICE);am.setStreamVolume(...);// 接口不变// 坏消息:底层差异仍需处理if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.TIRAMISU){// 新音频功能可能依赖系统版本}Audio 没有完全移到packages/modules是权衡的结果,而非技术不足:
| 因素 | 重要性 | 模块化障碍 |
|---|---|---|
| 实时性 | 🔴 极高 | 主要障碍 |
| 硬件集成 | 🔴 高 | 碎片化严重 |
| 启动顺序 | 🟡 中 | 可解决 |
| 安全更新 | 🟢 可接受 | 非主要问题 |
根本矛盾:模块化的解耦优势vs 音频系统的集成需求
目前 Google 采取的是渐进式、选择性模块化策略,优先模块化那些:
这种务实做法确保了 Android 音频在保持性能的同时,逐步获得模块化的部分好处。