前言
工作中也常用到
至于这个命令能做啥,接下来我们简单的讲解一下
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 # 表示申请的场景和用途
扩展一下
焦点的队列中被移除有如下几种情况
丢失永久焦点
app主动abandon焦点
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,但是最后焦点不一定在他那,所以这个需要结合上面(二、查看当前焦点的持有者)一起结合分析。
参考文章