有没有办法编写一个脚本,使用run-as从ADB shell复制文件?
我知道在adb shell中复制的唯一方法是使用cat源代码
例如,这项工作:
adb shell“cat源代码”
但这并不是:
adb shell作为“cat源”运行
这也不是:
adb外壳“作为cat源运行”\
我甚至尝试创建一个小脚本并将其上传到设备上,但我似乎无法从adb shell运行该脚本-它告诉我“权限被拒绝”。我也不能修改脚本。
我想这样做的原因是将文件复制到应用程序的私有存储区域——具体来说,我使用脚本来修改共享首选项,并将修改后的首选项放回原处。然而,只有应用程序本身或根可以写入我想要的文件。
此场景中的用例是将文件复制到设备上受保护的位置,而不是检索它;对于检索,这个问题已经有了很好的答案。
您只需更改目录的权限,然后将所有文件拉出即可。但对我来说,我只是在寻找一个共享首选项文件,我能够获得如下数据:
PACKAGE='com.mypackage.cool'
SHAREDPREF_FILE="${PACKAGE}_preferences.xml"
adb shell "run-as $PACKAGE cat /data/data/$PACKAGE/shared_prefs/$SHAREDPREF_FILE">$SHAREDPREF_FILE
现在,我们有了存储在同名文件中的share d首选项文件的数据。
按照Chris Stratton的建议,我最终实现此功能的方法如下(用于将共享首选项复制回设备):
adb push shared_prefs.xml /sdcard/temp_prefs.xml
cat <<EOF | adb shell
run-as com.example.app
cat /sdcard/temp_prefs.xml > /data/data/com.example.app/shared_prefs/com.example.app_preferences.xml
exit
exit
EOF
直接连接到adb外壳的管道作为
运行不起作用,我也不知道为什么,但连接到adb外壳的管道起作用。诀窍是从交互式shell调用runas,然后它继续接受来自管道的输入。
HERE文档让我可以轻松地将换行符嵌入到单独的命令中,并且通常只是使其可读;我在分号方面运气不好,但这可能是因为我做事的方式。我相信它可能与其他管道多个命令/换行的方法一起工作;一旦我最终使实验成功,我就停止了。
两个出口是防止挂壳所必需的(可通过CTRL-C终止);一个用于
作为
运行,另一个用于adb外壳
本身。Adb的shell对文件结尾的响应似乎不是很好。
OP尝试将以下3个命令(在交互式shell会话中,他可以一个接一个地执行)组合成一个非交互式命令:
adb shell
run-as com.example.app
cat /sdcard/temp_prefs.xml > shared_prefs/com.example.app_preferences.xml
为了简单起见,让我们从交互式adb shell
会话开始。如果我们只是尝试将最后两个命令组合成一行:
run-as com.example.app cat /sdcard/temp_prefs.xml > shared_prefs/com.example.app_preferences.xml
这将不起作用,因为shell重定向是如何工作的-只有cat/sdcard/temp_prefs。xml
命令的一部分将与com一起运行。实例应用程序
UID
许多人“知道”将重定向周围的命令部分放入引号中:
run-as com.example.app "cat /sdcard/temp_prefs.xml > shared_prefs/com.example.app_preferences.xml"
这不起作用,因为run as
命令不够智能,无法解析整个命令。它需要一个可执行文件作为下一个参数。正确的方法是使用sh
:
run-as com.example.app sh -c "cat /sdcard/temp_prefs.xml > shared_prefs/com.example.app_preferences.xml"
那么,我们是否可以在命令前面加上adb shell并使用它呢?不一定。通过从PC运行该命令,您还可以添加另一个本地shell及其解析器。具体的转义要求取决于您的操作系统。在Linux或OSX中(如果您的命令尚未包含任何”
),很容易对整个命令进行单引号引用,如下所示:
adb shell 'run-as com.example.app sh -c "cat /sdcard/temp_prefs.xml > shared_prefs/com.example.app_preferences.xml"'
但有时使用(-out或更少)引号的替代解决方案更容易:
adb shell run-as com.example.app cp /sdcard/temp_prefs.xml shared_prefs/com.example.app_preferences.xml
或者如果您的设备没有cp
命令:
adb shell run-as com.example.app dd if=/sdcard/temp_prefs.xml of=shared_prefs/com.example.app_preferences.xml
还要注意我是如何使用shared\u prefs/com的。实例app_首选项。xml
而不是完整的/data/data/com。实例app/shared_prefs/com。实例app_首选项。xml
-通常在运行方式
命令中,当前目录是包的主目录。
提前谢了。
使用Java8。 为了获得最佳性能,我尝试用复制文件,但很快发现它不支持汉字。例如: 代码打算从jar复制一个文件,但它抛出了一个异常(a“我的" 文件夹已提前创建): 问题是鎴戠殑" 甚至连一个中国人都看不懂,所以我正在寻找一个解决办法来处理汉字。 我也尝试了FileChannel,但失败了,意识到它用于直接文件,而不是在一个jar中的文件。我该怎么做?
本文向大家介绍php不使用copy()函数复制文件的方法,包括了php不使用copy()函数复制文件的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php不使用copy()函数复制文件的方法。分享给大家供大家参考。具体如下: 下面的代码不使用php内置的copy函数,直接通过文件读取写入的操作方式复制文件 希望本文所述对大家的php程序设计有所帮助。
我有一个docker映像,它有所有需要的文件,当我说docker运行时,我希望它将docker映像中的文件夹的内容复制到主机目录。之后不再需要docker并停止
问题内容: 我想使用Python制作netcdf文件的副本。 关于如何读取或写入netcdf文件,有很多很好的示例,但是也许还有一个很好的方法,可以进行变量的输入,然后输出到另一个文件。 一个好的方法很不错,以便以最低的成本获得尺寸和尺寸变量到输出文件。 问题答案: 我在python netcdf上 找到了此问题的答案:制作了所有变量和属性的一个副本,但一个副本,但我需要对其进行更改以使其与我的p