是否有可能看到来自adb shell的应用程序数据与我看到它安装SD卡的方式相同?

Ele*_*Ele 31 android adb

我正在测试Android应用程序.
我想留意一下内容

/sdcard/Android/data/com.myapplication   
Run Code Online (Sandbox Code Playgroud)

当应用程序运行时.
但是如果SD卡作为磁盘驱动器安装在PC上(访问图片和视频),我的应用程序无法正常工作.
所以我以为我可以使用adb shell.但是它不允许我访问同一个文件夹:

ls /sdcard/Android/data/com.myapplication  
/sdcard/Android/data/com.myapplication: Permission denied
Run Code Online (Sandbox Code Playgroud)

看看Stack Overflow,我发现通过adb shell查看应用程序数据的方法:

run-as com.myapplication
Run Code Online (Sandbox Code Playgroud)

这样做我发现自己在文件夹中

/data/data/com.myapplication
Run Code Online (Sandbox Code Playgroud)

令我困惑的是,我在这里看到的数据与我通过PC浏览SD卡内容的数据不同.

$ ls
ls
files
databases
shared_prefs
lib
Run Code Online (Sandbox Code Playgroud)

我在文件下看到的东西也在sdcard的Android/data/com.myapplication文件夹下,但不是我想要的东西.此外,所有其他文件夹是不同的.
这之间是否存在相关性

/data/data/com.myapplication
Run Code Online (Sandbox Code Playgroud)

文件夹可通过adb和

/sdcard/Android/data/com.myapplication 
Run Code Online (Sandbox Code Playgroud)

文件夹可通过PC访问?
有没有办法在adb shell中看到后者中存在的文件?

Has*_*iar 72

作为一般规则,Internal storage您的应用程序上存储和存储的文件(默认情况下不是WORLD_READABLE)将仅供您的应用程序读取.当您尝试使用pull这些文件时adb pull,将在NOT rooted设备上获得权限被拒绝.有办法绕过这个,我稍后会解释.在文件中External storage,另一方面,是提供给用户和所有其他应用程序来读取.所以这取决于你追求的是什么.

现在,为了读取内部存储(/data/data/com.app.name)中的文件,您无法直接读取这些文件,但您可以做的是将它们移动到外部存储,然后从那里读取它们.

adb shell "run-as com.yourappName cat /data/data/com.yourappName/files/myfile.txt > /sdcard/Downloads/myfile.txt"
Run Code Online (Sandbox Code Playgroud)

然后,您可以从外部存储中提取文件,而不会出现任何权限问题.

adb pull /sdcard/Downloads/myfile.txt
Run Code Online (Sandbox Code Playgroud)

如果您不确定要浏览哪个文件或要浏览所有文件,请使用shell浏览所有应用程序文件.

adb shell
run-as yourappPackageName
cd /data/data/youappPackageName
ls -all
Run Code Online (Sandbox Code Playgroud)

  • 这仅适用于可调试的应用程序。在答案中可能值得一提。 (9认同)
  • 它显示"权限被拒绝"错误.sh:无法创建/sdcard/Download/syncadapter.txt:权限被拒绝 (4认同)
  • 无需在“/sdcard”上创建中间文件 - 只需“cat”原始文件并将“adb”的输出重定向到本地文件。 (3认同)

rtr*_*lor 7

我已经能够通过此 Adb 命令获取应用程序正在使用的 Sqlite DB:

adb exec-out run-as xxx.xxx.xxx.xxx cat "/data/data/xxx.xxx.xxx.xxx/databases/databasefile.db" > %userprofile%\Desktop\databasefile.db
Run Code Online (Sandbox Code Playgroud)

其中xxx.xxx.xxx.xxx是你的Android App的bundleId,databasefile.db是Sqlite DB的名字

所以我想你可以获得应用程序的任何现有文件,知道它在哪里,并使用 adb exec-out run-as xxx.xxx.xxx.xxx命令