文章

adb shell dumpsys audio使用

文章目录

前言

工作中也常用到

adb shell dumpsys audio

至于这个命令能做啥,接下来我们简单的讲解一下

PS : 本文在Android 9.0上测试的,4.2时dumpsys audio不一定有这么多信息。

正文

dumpsys audio出来的信息有很多,比如查看各类型的音量值,当前焦点的持有者,以及焦点申请记录等等。

一、查看各类型的音量值

dumpsys后包含如下信息(节选,各种类型的值都有)

下面我们以STREAM_MUSIC类型说明

Stream volumes (device: index)
...
- STREAM_MUSIC:
   Muted: false  # 是否在静音状态
   Min: 0   # 支持的最小音量
   Max: 15  # 支持的最大音量
   streamVolume:0  # 当前的音量值
   Current: 2 (speaker): 0, 4000000 (usb_headset): 3, 40000000 (default): 5
   Devices: speaker 
...

这一句的意思是;多媒体分为扬声器(speaker)和耳机音量(usb_headset)。

冒号后面跟的是当前的音量值。

 Current: 2 (speaker): 0, 4000000 (usb_headset): 3, 40000000 (default): 5
二、查看当前焦点的持有者
Audio Focus stack entries (last is top of stack):
  source:android.os.BinderProxy@5569875 -- pack: com.la.audiotoolstwo -- client: android.media.AudioManager@4dcf949com.la.audiotoolstwo.MainActivity@75781fa -- gain: GAIN_TRANSIENT -- flags:  -- loss: LOSS_TRANSIENT -- notified: true -- uid: 10142 -- attr: AudioAttributes: usage=USAGE_MEDIA content=CONTENT_TYPE_MOVIE flags=0x800 tags= bundle=null -- sdk:29
  source:android.os.BinderProxy@7dbd174 -- pack: com.la.audiotoolsthree -- client: android.media.AudioManager@4dcf949com.la.audiotoolsthree.MainActivity@75781fa -- gain: GAIN_TRANSIENT -- flags: DELAY_OK -- loss: none -- notified: true -- uid: 10143 -- attr: AudioAttributes: usage=USAGE_MEDIA content=CONTENT_TYPE_MOVIE flags=0x800 tags= bundle=null -- sdk:29

上面是两个当前焦点队列中的申请信息。

我们以最新(也就是第二条)的简单的分析一下

gain: GAIN_TRANSIENT  # 申请临时获取焦点
flags: DELAY_OK     #申请添加的flag,这里是允许延迟获取焦点
loss: none   # 当前焦点状态,none表示没有丢失
attr: AudioAttributes: usage=USAGE_MEDIA content=CONTENT_TYPE_MOVIE flags=0x800  # 表示申请的场景和用途
扩展一下

焦点的队列中被移除有如下几种情况

  1. 丢失永久焦点
  2. app主动abandon焦点
  3. app异常退出,系统会主动移除

PS:关于第三点的日志打印

MediaFocusControl( 2001): AudioFocus  removeFocusStackEntryOnDeath(): removing entry for android.os.BinderProxy@595e126
三、查看焦点申请记录

记录开机后到当前有谁requestAudioFocus和abandonAudioFocus的信息。

当然,这不是很准确的,只记忆主动申请和主动释放的状态。

Audio event log: focus commands as seen by MediaFocusControl
01-02 08:04:03:898 requestAudioFocus() from uid/pid 10141/5453 clientId=android.media.AudioManager@4dcf949com.la.audiotools.MainActivity@75781fa callingPack=com.la.audiotools req=1 flags=0x1 sdk=29
01-02 08:04:47:680 abandonAudioFocus() from uid/pid 10141/5453 clientId=android.media.AudioManager@4dcf949com.la.audiotools.MainActivity@75781fa
01-02 08:23:16:811 requestAudioFocus() from uid/pid 10142/6151 clientId=android.media.AudioManager@4dcf949com.la.audiotoolstwo.MainActivity@75781fa callingPack=com.la.audiotoolstwo req=2 flags=0x0 sdk=29
01-02 08:25:24:476 requestAudioFocus() from uid/pid 10143/6221 clientId=android.media.AudioManager@4dcf949com.la.audiotoolsthree.MainActivity@75781fa callingPack=com.la.audiotoolsthree req=2 flags=0x1 sdk=29
01-02 08:33:14:696 requestAudioFocus() from uid/pid 10144/6420 clientId=android.media.AudioManager@4dcf949com.la.audiotoolsfour.MainActivity@75781fa callingPack=com.la.audiotoolsfour req=1 flags=0x1 sdk=29
01-02 08:37:32:071 requestAudioFocus() from uid/pid 10143/6581 clientId=android.media.AudioManager@4dcf949com.la.audiotoolsthree.MainActivity@75781fa callingPack=com.la.audiotoolsthree req=2 flags=0x1 sdk=29

从上面看最后申请焦点的com.la.audiotoolsthree,但是最后焦点不一定在他那,所以这个需要结合上面(二、查看当前焦点的持有者)一起结合分析。

参考文章

  1. 通过dumpsys audio查看当前系统音量状态
  2. 音频焦点 AudioFocus与Audio Log分析
发表评论