引发的异常“打开失败:EROFS(只读文件系统)”

时间:2019-07-16 23:24:28

标签: android

首先,我确实仔细阅读了this post的有关此异常的信息,但是答案无法解释我的情况。我认为这里的许可不是问题。

代码:

Serializer serializer = new Persister();
File fFoo= new File(context.getFilesDir(), "foo.xml");
serializer.write(fooObject, fFoo);

serializer.write()偶尔会抛出以下异常:

 Stack trace: java.io.FileNotFoundException: /data/data/net.foo.appfoo/files/foo.xml: open failed: EROFS (Read-only file system)
    at libcore.io.IoBridge.open(IoBridge.java:460)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:88)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:73)
    at org.simpleframework.xml.core.Persister.write(SourceFile:1198)

有人能指出发生这种情况的可能情况吗?

1 个答案:

答案 0 :(得分:1)

可以解释这一点的一种情况是android:sharedUserId中的变化。

android:sharedUserId是可以放在<manifest>上的属性。如果2个以上的应用具有相同的sharedUserId并使用相同的签名密钥签名,则它们可以在内部存储设备上互相读写文件。

但是,如果您为运输应用程序更改了sharedUserId的值(包括在最初没有运输应用程序的情况下添加一个),则现有用户将被锁定在其内部存储文件之外。 Android切换了应用程序运行时所使用的Linux uid,但它不会更改文件的所有权。因此,该应用程序不再具有对其文件的权限。在这种情况下,这是我所希望看到的例外。

正是这种问题导致Google在Android Q中最终最终弃用了android:sharedUserId,并计划在将来的版本中正式停用它。

就您而言,我猜您没有设置或更改android:sharedUserId


这是我所知道的唯一一种情况,即您的应用程序内部存储在哪里报告为只读,而您作为开发人员在哪里引起了问题。

我能想到的所有其他东西都在您的控制范围之外:

  • 用户可能已扎根设备并意外更改了文件的文件所有权或文件权限

  • 该用户也许是脚本小子,正在对您的应用程序进行反向工程,并且忙于android:sharedUserId

  • 也许用户受到勒索软件的攻击,其攻击的一部分是通过一些安全漏洞来更改应用程序文件的权限