【问题标题】:Android getExternalStorageDirectory() returns invalid directoryAndroid getExternalStorageDirectory() 返回无效目录
【发布时间】:2014-12-09 22:03:43
【问题描述】:

我正在尝试添加 OBB 文件支持,但遇到了一个奇怪的情况。当我调用getExternalStorageDirectory() 时,它返回的路径在我的设备上不存在。

我在我的应用程序开始时调用它:

Log.i( LOG_ID, "XXXXXXXXXXXXXXXX <--- "+Environment.getExternalStorageDirectory().getAbsolutePath() );

返回:

XXXXXXXXXXXXXXXX <--- /storage/emulated/0

但是当我通过adb -d shell 连接并运行ls -al /storage/emulated 时,我得到:

lrwxrwxrwx root     root              2013-12-04 15:17 legacy -> /mnt/shell/emulated/0

如您所见,返回的路径 getExternalStorageDirectory() 在我的设备上无效。知道为什么会这样以及如何在不进行硬编码/mnt/sdcard/ 的情况下找到 OBB 文件吗?

编辑:

我刚刚进行了一些进一步的测试:

Works - stat( "/sdcard/Android/obb" );
Fails - stat( "/sdcard/Android/obb/uk.co.mycomp.myapp" );

shell@android:/mnt/shell $ ls -ald /sdcard/Android/obb/                        
drwxrwxr-x root     sdcard_rw          2013-12-18 16:42 
shell@android:/mnt/shell $ ls -ald  /sdcard/Android/obb/uk.co.mycomp.myapp
drwxrwxr-x root     sdcard_rw          2013-12-18 18:36

如您所见,这两个目录是相同的,但我只能访问父目录。这可能与我的问题有任何关系,也可能没有任何关系......

【问题讨论】:

  • 您是否在清单中声明了所需的权限?
  • 您是否真的尝试过使用代码访问文件?或者你只是假设它不起作用
  • 我认为我有正确的权限,但要明确我应该寻找哪个?
  • 是的,我已经尝试访问这些文件,但我得到了一个找不到文件的错误,这就是我意识到这个问题的方式......

标签: android


【解决方案1】:

在最近的 Android 版本中,不同用户 ID 的挂载实际上是不同的,这使您尝试调查此问题的方式无效。

最近的 Android 版本利用 Linux 内核的“每进程命名空间”功能为不同的进程祖先提供不同的挂载集,这让您对调查存储路径的尝试感到失望。这可能与支持多个(人类)用户帐户的努力有关,包括外部存储的唯一和共享子部分。

当您运行 adb shell 时,您会得到一组从 adbd 继承的挂载。

但相比之下,应用程序运行的代码(无论是在其进程中,还是在子进程中)会获得一组不同的挂载,显然要么是从 zygote 继承的,要么是在其后不久由进程差异化配置的将新萌芽的 zygote 转化为应用进程的代码。

要了解您的应用看到什么挂载,请安装类似connectbot 的东西,您可以使用它来获取应用程序进程的本地 shell,然后运行 ​​mount 命令或任何其他感兴趣的调查。例如:

u0_a99@build:/ $ mount

/dev/fuse /storage/emulated/0 fuse rw....
/dev/fuse /storage/emulated/legacy fuse rw.....

相比之下,从 adb shell 检查:

shell@build:/mnt $ mount

/dev/fuse /mnt/shell/emulated fuse rw.....

令人困惑,因为挂载是由进程的祖先而不是用户ID决定的,使用来自adb的run-as工具不会为您提供与应用程序进程或其子进程相同的视图,而是为您提供 adb 的视图。

但是,如果您有正在运行的应用程序进程的 pid,则可以使用 run-as 来查看它的 /proc/pid##/mounts 文件,而无需实际获取应用程序的 shell。

【讨论】:

  • 这完美地解释了正在发生的事情,并且安装了一个 shell 应用程序我可以看到该路径确实存在于应用程序空间中。但是我上面关于访问 OBB 子目录的编辑仍然存在。这有什么关系吗?
  • 原来是同样的问题。 adb -d push 看到与 shell 相同的挂载空间,这与应用程序不同。所以 OBB 推送正在上传到错误的位置。感谢您的帮助...
  • 是的,我希望您会为所有 adb 命令获得相同的挂载。我没有意识到您正在尝试模拟 OBB。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
相关资源
最近更新 更多