【问题标题】:is it possible to see application data from adb shell the same way I see it mounting SD card?是否可以像我看到它安装 SD 卡一样从 adb shell 查看应用程序数据?
【发布时间】:2012-02-19 11:38:00
【问题描述】:

我正在测试一个 Android 应用程序。
我想关注一下

的内容
/sdcard/Android/data/com.myapplication   

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

ls /sdcard/Android/data/com.myapplication  
/sdcard/Android/data/com.myapplication: Permission denied

查看 Stack Overflow,我发现这种方式可以通过 adb shell 查看应用程序数据:

run-as com.myapplication

然后我发现自己在文件夹中

/data/data/com.myapplication

我感到困惑的是,我在这里看到的数据与我通过 PC 浏览 sdcard 内容时看到的数据不同。

$ ls
ls
files
databases
shared_prefs
lib

我在 sdcard Android/data/com.myapplication 文件夹下的文件下看到了一些东西,但不是我想要的。此外,所有其他文件夹都不同。
这之间有关联吗

/data/data/com.myapplication

可通过 adb 访问的文件夹和

/sdcard/Android/data/com.myapplication 

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

【问题讨论】:

  • @MisterSmith 不,它没有植根
  • 那我想只有你的应用可以访问那个目录。

标签: android adb


【解决方案1】:

作为一般规则,Internal storage 上并由您的应用程序存储的文件(默认情况下不是 WORLD_READABLE)只能供您的应用程序读取。当您尝试使用adb pull pull 这些文件时,您将在未植根的设备上获得权限被拒绝。有一种方法可以解决这个问题,我稍后会解释。另一方面,External storage 中的文件可供用户和所有其他应用程序阅读。所以这取决于你追求什么。

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

adb shell "run-as com.yourappName cat /data/data/com.yourappName/files/myfile.txt > /sdcard/Downloads/myfile.txt"

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

adb pull /sdcard/Downloads/myfile.txt

如果您不确定哪个文件或者您想浏览所有文件,请使用 shell 浏览您的所有应用文件。

adb shell
run-as yourappPackageName
cd /data/data/youappPackageName
ls -all

【讨论】:

  • 它显示“权限被拒绝”错误。 sh:无法创建/sdcard/Download/syncadapter.txt:权限被拒绝
  • 无需在/sdcard 上创建中间文件——只需cat 原始文件并将adb 的输出重定向到本地文件。
  • 这仅适用于可调试的应用程序。在答案中可能值得一提。
  • @Timo 即使在有多个文件的情况下,您也不需要中间存储。就做adb shell 'run-as com.yourappName tar cf - /data/data/com.yourappName_files/' | tar xvf -
【解决方案2】:

您可以通过之前在博客中发布的实用程序访问它。 它是一个 java 实用程序,通过它,您只需提供应用程序的包名称即可获取应用程序数据文件夹中的所有文件夹。 只是应用程序需要可调试。

Extract Android Files

确实有效

【讨论】:

  • 您好,抱歉,答案中提供的链接存在问题。我已经更新了新链接,看看。
【解决方案3】:

我已经能够通过这个 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

其中 xxx.xxx.xxx.xxx 是您的 Android App 的 bundleId,databasefile.db 是 Sqlite DB 的名称

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

【讨论】:

  • 您可以在这里使用相对路径..在您的示例中它将是 databases/databasefile.db 。谢谢
猜你喜欢
  • 1970-01-01
  • 2013-06-26
  • 2017-10-19
  • 1970-01-01
  • 2015-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-02
相关资源
最近更新 更多