通过 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
之前和整个命令之后的引号,而且每个 "
都必须使用 \
.
进行转义
我正在尝试通过 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
之前和整个命令之后的引号,而且每个 "
都必须使用 \
.