gpt4 book ai didi

Android getExternalStorageDirectory() 返回无效目录

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:26:42 26 4
gpt4 key购买 nike

我正在尝试添加 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 版本中,对于不同的用户 ID,挂载实际上是不同的,这使您尝试调查此问题的方式无效。

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

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

但相比之下,应用程序运行的代码(无论是在它的进程中还是在子进程中)得到一组不同的挂载,显然是从 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 决定的,使用 run-as 来自 adb 的工具不会为您提供与应用程序进程或其子进程相同的 View ,而是为您提供 adb 的 View 。

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

关于Android getExternalStorageDirectory() 返回无效目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20663220/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com