首先,我确实仔细阅读了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)
有人能指出发生这种情况的可能情况吗?
答案 0 :(得分:1)
可以解释这一点的一种情况是android:sharedUserId
中的变化。
android:sharedUserId
是可以放在<manifest>
上的属性。如果2个以上的应用具有相同的sharedUserId
并使用相同的签名密钥签名,则它们可以在内部存储设备上互相读写文件。
但是,如果您为运输应用程序更改了sharedUserId
的值(包括在最初没有运输应用程序的情况下添加一个),则现有用户将被锁定在其内部存储文件之外。 Android切换了应用程序运行时所使用的Linux uid,但它不会更改文件的所有权。因此,该应用程序不再具有对其文件的权限。在这种情况下,这是我所希望看到的例外。
正是这种问题导致Google在Android Q中最终最终弃用了android:sharedUserId
,并计划在将来的版本中正式停用它。
就您而言,我猜您没有设置或更改android:sharedUserId
。
这是我所知道的唯一一种情况,即您的应用程序内部存储在哪里报告为只读,而您作为开发人员在哪里引起了问题。
我能想到的所有其他东西都在您的控制范围之外:
用户可能已扎根设备并意外更改了文件的文件所有权或文件权限
该用户也许是脚本小子,正在对您的应用程序进行反向工程,并且忙于android:sharedUserId
也许用户受到勒索软件的攻击,其攻击的一部分是通过一些安全漏洞来更改应用程序文件的权限