通过 ADB 在 android 广播中将 JSON 作为额外数据发送时格式不正确

Sending JSON as extra data in an android broadcast via ADB gets incorrectly formatted

我正在尝试通过 ADB 将 JSON 数据作为额外发送到设备的 Android 广播。但是看起来到达设备的数据并不像预期的那样。

我执行的是:

adb shell am broadcast -a com.test.android.ACTION_TEST_FEATURE -n com.test.android/.receivers.TestsReceiver -e "notify" '{"debug": false, "title": "Application update!"}'

我期望的额外数据:

{"debug": false, "title": "Application update!"}

我得到的额外数据:

"debug": false

如果我发送 {"debug": false "title": "Application update!"} 作为额外数据,那么我会得到 {"debug": false "title": "Application update!"} 作为额外数据(注意缺少的逗号)。所以我假设它与我的 bash 的大括号扩展有关,但关闭它并不能解决问题,转义大括号或逗号不起作用。

我做错了什么?

好的,我刚刚找到了解决方案。我首先必须通过 adb shell 输入设备 shell 然后执行 am broadcast -a com.test.android.ACTION_TEST_FEATURE -n com.test.android/.receivers.TestsReceiver --es "notify" '{"debug": false, "title": "Application update!"}'

您的解决方法帮了大忙!

说明问题出在通过两个shell引用(host加Android)。 Shell 引用是一个可怕的 tarpit,但这里有严重的额外怪异。

在尝试使用 "echo" 命令后,我发现 adb shell 的参数必须作为本地 shell 和 JSON 负载的单个参数引用必须作为 Android shell.

的单个参数引用

这是一个通用的解决方案(它不需要散布 \-引用 "!{} 字符在 JSON 文本中):

adb shell "am broadcast -a com.test.android.ACTION_TEST_FEATURE -n com.test.android/.receivers.TestsReceiver -e notify '"'{"debug": false, "title": "Application update!"}'"'"

模式:adb shell "am broadcast ... '"'JSON_TEXT'"'"

内部一对 ' 标记在本地引用 JSON_TEXT,而外部一对远程引用它。外对又被 " 引用。

我知道这是旧的post,但我有一些想法。

在尝试通过 cmd 和 bash args 或程序中的子进程传递数据后,我发现使用 base64 编码 json 转储数据非常方便,只需 base64 解码然后 json 加载,不用担心引号、space、制表符、任何东西。

这应该是adb命令的结构。

adb shell "am broadcast -a YOUR_BROADCAST_INTENT_ACTION -n YOUR_APP_PACKAGE/.PATH_TO_BROADCAST_RECIEVER_CLASS.BROADCAST_RECEIVER_CLASS -e 'STRING_KEY' 'DATA HERE'"

即使字符串中有空格,上述命令也将确保将意图传递给接收者。

adb shell "am broadcast -a wingoku.custom.invoking.event -n com.wingoku.root/.broadcastReceivers.MyReceiver-e 'shellCommand' 'hello world. My name is umer'"

当我在这里使用示例时,我总是在最终字符串中丢失 ",所以我得到的不是 "{"a":"b"}",而是 "{a:b}"。对我有用的是:

adb shell "am broadcast -a myaction -e myextra '''[{\"a\":\"b\"}]'''"

重要的是 am broadcast 之前和整个命令之后的引号,而且每个 " 都必须使用 \.

进行转义