必学音频干货调试技巧:命令dumpsys audio相关信息剖析

背景:

前面一些文章我们大部分audio信息调试都是使用的如下两个命令:
dump media.audio_flinger
即输出AudioFlinger相关的信息,主要关注音频数据流和混合过程的细节

dump media.audio_policy
即输出AudioPolicyService相关的信息,音频策略的具体实施与设备路由

其实在audio的开发中另一个命令dumpsys audio 也是非常常见的的,特别是在音频焦点,音量调节部分的调试,音频设备连接等等,那么下面就重点聊一下dumpsys audio这个命令。

dumpsys audio命令代码部分

dumpsys audio命令其实就是让名字为“audio”服务进行相关的dump方法执行输出,这里名为“audio”的服务其实就是AudioService。

在system_server启动运行startOtherService方法时候,会启动AudioService
在这里插入图片描述
这里就会调用到AudioService的相关启动方法:
frameworks/base/services/core/java/com/android/server/audio/AudioService.java
在这里插入图片描述就会发布这个“audio”的服务,实体就是AudioService对象。

所以AudioService其实是属于system_server的一个服务,而且是Java代码的实现,和两个AudioFlinger,AudioPolicyService两个在audioserver进程的不一样哈。
具体AudioService的相关的内容这里不过多介绍了,在audio子系统专题课程中也有详细讲解

这里重点关注AudioService的dump方法相关信息:
对应方法如下:
在这里插入图片描述可以看到dump输出的信息也是非常多的,dumpsys audio的输出结果部分截图:

在这里插入图片描述
因为输出的信息很多,我们只对重要的,常用的几个部分进行讲解,比如音频音量相关,音频焦点相关,其他部分大家也完全可以自己去AudioService的dump方法中追一些既可以。

dumpsys audio输出重要信息

1、查看音量相关信息

当前平台所有Stream类型的音量情况
在这里插入图片描述这里拿出STREAM_SYSTEM为案例进行详细说明既可以

- STREAM_SYSTEM (aliased to: STREAM_RING):
// 当前stream名字,aliased表示自己没有独立音量,是和STREAM_RING一样
   Muted: false 
   // mute状态
   Muted Internally: false
   // AudioService内部mute状态
   Min: 0
   Max: 7
   //一般会有index来表音量大小,简单说就是进度,进度要有一个最大最小值,这里音量为0-7
   streamVolume:5
   //当前音量index的大小为5
   Current: 2 (speaker): 4, 4 (headset): 5, 8000 (remote_submix): 3, 20000 (line): 5, 40000000 (default): 5
   //Current这里会列出一个个的设备对应的音量,因为很可能不同设备音量值不一样
   Devices: headset(4)
   //当前的设备
   Volume Group: AUDIO_STREAM_SYSTEM
//代表对应的音量组

音量组

VolumeGroupState一个实例就是一个volume group
显示所有的音量组,以及各个音量组当前被哪些stream使用
在这里插入图片描述这里也以AUDIO_STREAM_SYSTEM为案例:

- VOLUME GROUP AUDIO_STREAM_SYSTEM:
   Muted: false
   Min: 0
   Max: 7
   Current: 2 (speaker): 4, 8000 (remote_submix): 3, 40000000 (default): 5
   Devices: headset
   Streams: STREAM_SYSTEM 

基本上和上面的Stream类型的音量输出没啥差别,这里也就不重复解释了。

音量变化的相关Event log

Events log: volume changes (logged when command received by AudioService)
03-17 01:23:26:546 adjustSuggestedStreamVolume(sugg:USE_DEFAULT_STREAM_TYPE dir:ADJUST_RAISE flags:0x1011) from android/android uid:1000
03-17 01:23:26:594 adjustSuggestedStreamVolume(sugg:USE_DEFAULT_STREAM_TYPE dir:ADJUST_RAISE flags:0x1011) from android/android uid:1000
03-17 01:23:26:648 adjustSuggestedStreamVolume(sugg:USE_DEFAULT_STREAM_TYPE dir:ADJUST_RAISE flags:0x1011) from android/android uid:1000
03-17 01:23:26:695 adjustSuggestedStreamVolume(sugg:USE_DEFAULT_STREAM_TYPE dir:ADJUST_RAISE flags:0x1011) from android/android uid:1000
03-17 01:23:26:747 adjustSuggestedStreamVolume(sugg:USE_DEFAULT_STREAM_TYPE dir:ADJUST_RAISE flags:0x1011) from android/android uid:1000


Event日志详细记录了音量变化的操作记录,经常可以用于音量不知道被谁改变的一个依据,比如是音量键操作还是说设置的音量条滑动操作。

2、查看音频焦点相关信息

音频焦点当前持有者

Audio Focus stack entries (last is top of stack):
  source:android.os.BinderProxy@a816261 -- pack: com.android.music 
  -- client: android.media.AudioManager@3cd6174com.android.music.AudioPreview$2@5dc069d
   -- gain: GAIN_TRANSIENT 
   -- flags:  -- loss: LOSS_TRANSIENT 
   -- notified: true -- limbofalse -- uid: 10107 -- attr: AudioAttributes: usage=USAGE_MEDIA content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null -- sdk:30
  source:android.os.BinderProxy@d16a186 -- pack: com.example.android.translate
   -- client: android.media.AudioManager@bfc14c5com.example.android.translate.PhrasesActivity$2@e070e1a 
   -- gain: GAIN_TRANSIENT -- flags:  
   -- loss: none -- notified: true -- limbofalse -- uid: 10156 -- attr: AudioAttributes: usage=USAGE_MEDIA content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null -- sdk:32



这底部top就是当前音频焦点,主要的核心信息有如下几个
– pack :代表具体哪个app包名获取的焦点
– gain :代表焦点申请的类型
– loss :如果丢失焦点,也会展示丢失类型
– attr :代表相关的音频播放的属性

查看音频焦点申请记录

主要展示音频焦点有哪些申请requestAudioFocus记录,和abandonAudioFocus记录,这样就可以清晰恢复出整个音频焦点的变化原因,方便调试相关音频焦点异常问题定位。


Events log: 
focus commands as seen by MediaFocusControl
10-31 10:12:46:673 requestAudioFocus() from uid/pid 10107/2542 AA=USAGE_MEDIA/CONTENT_TYPE_UNKNOWN clientId=android.media.AudioManager@16de0b4com.android.music.AudioPreview$2@577b4dd callingPack=com.android.music req=2 flags=0x0 sdk=30
10-31 10:54:13:729 abandonAudioFocus() from uid/pid 10107/2542 clientId=android.media.AudioManager@16de0b4com.android.music.AudioPreview$2@577b4dd
10-31 10:54:48:215 requestAudioFocus() from uid/pid 10107/2542 AA=USAGE_MEDIA/CONTENT_TYPE_UNKNOWN clientId=android.media.AudioManager@3cd6174com.android.music.AudioPreview$2@5dc069d callingPack=com.android.music req=2 flags=0x0 sdk=30
10-31 10:54:53:248 requestAudioFocus() from uid/pid 10156/2811 AA=USAGE_MEDIA/CONTENT_TYPE_UNKNOWN clientId=android.media.AudioManager@bfc14c5com.example.android.translate.PhrasesActivity$2@e070e1a callingPack=com.example.android.translate req=2 flags=0x0 sdk=32
Multi Audio Focus enabled :false

3、当前链接的设备

比如耳机等设备插入后,会在Connected devices这里展示出相关的DeviceInfo。

AudioDeviceBroker:
  Message handler (watch for unhandled messages):
    Handler (com.android.server.audio.AudioDeviceBroker$BrokerHandler) {6fe10c1} @ 88143163
      Looper (AudioDeviceBroker, tid 125) {cbaeac9}
        (MessageQueue is using Legacy implementation)
        (Total messages: 0, polling=true, quitting=false)

  BECOMING_NOISY_INTENT_DEVICES_SET=
 0x400 0x800 0x8000000 0x20000000 0x80 0x100 0x200 0x2000 0x4000 0x4000000 0x20000001 0x20000 0x20000002 0x4 0x8
  Preferred devices for strategy:

  Non-default devices for strategy:

  Connected devices:
    [DeviceInfo: type:0x4 (headset) name:h2w addr: identity addr: codec: 0 group:-1 peer addr: peer identity addr: disabled modes: {}]
    [DeviceInfo: type:0x80000010 (headset) name:h2w addr: identity addr: codec: 0 group:-1 peer addr: peer identity addr: disabled modes: {}]

原文参考:
https://mp.weixin.qq.com/s/KNSyR1H9JmJoCFVoXrYURQ

更多framework实战开发干货,请关注下面“千里马学框架”

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值