adb 动态更新参数:am broadcast 与全量更新语义
弱网运行中要换档位,不必停止再启动:一条广播指令就能原地改参数。这是 adb 接口里效率最高的一条,也是最容易踩语义坑的一条。
指令结构
adb shell am broadcast -a "qnet.boradcast.drive" --include-stopped-packages {--[类型] [key] [value]} com.tencent.qnet
- action 固定为 qnet.boradcast.drive(官方拼写如此,boradcast 为历史拼写,照抄即可);
--es "command" "update"表明这是一次参数更新;- 其余位置放要更新的参数三元组(--ei 整数 / --es 字符串)。
官方示例:原地切换为 TCP/UDP 100% 丢包
adb shell am broadcast -a "qnet.boradcast.drive" --include-stopped-packages --es "command" "update" --ei "in_rate" 100 --ei "out_rate" 100 --ei "protocol" 3 com.tencent.qnet
指令回执 Broadcast completed: result=0 即已送达;随后弱网立即按新参数执行,悬浮窗读数与被测应用表现会同步变化。
全量更新语义:没写的参数一律归默认
官方注意事项原文:更新弱网参数是全量更新,参数中没有设置的参数会被直接设置为默认值。
这意味着上面示例切换到 100% 丢包的同时,把延迟、带宽等所有未提及参数全部清零归默认。想在丢包基础上保留 200ms 延迟,正确写法是把两者都写上:
adb shell am broadcast -a "qnet.boradcast.drive" --include-stopped-packages --es "command" "update" --ei "in_rate" 100 --ei "out_rate" 100 --ei "in_delay" 200 --ei "out_delay" 200 --ei "protocol" 3 com.tencent.qnet
梯度遍历的标准写法
参数化跑延迟梯度时,每次更新都带全量参数,循环体形如:
for delay in 100 300 500:
adb shell am broadcast -a "qnet.boradcast.drive" --include-stopped-packages \
--es "command" "update" --ei "in_delay" {delay} --ei "out_delay" {delay} com.tencent.qnet
梯度间切换零停顿,比重新启动进程快得多,适合极限遍历场景。
更新不生效的排查顺序
- 回执是不是 Broadcast completed(没回执说明进程不在,弱网早已消失,先重新启动);
- 是否遗漏了 command=update(缺 command 的广播等于没说要求);
- 是否被全量语义「顺手」清掉了别的参数——把你以为还生效的参数也显式写上。
更新只改参数,不改变生范围与抓包状态;要改被测应用要重新走启动指令,见adb 启动弱网。