【发布时间】:2019-07-16 23:24:28
【问题描述】:
首先,我确实仔细阅读了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)
谁能指出发生这种情况的可能情况?
【问题讨论】:
-
这是在生产代码中发生的吗?我知道发生这种情况的唯一生产场景是如果您更改了
android:sharedUserId值。 -
是的,它由分析报告。我无法在我的测试设备上重现它。这是我第一次听到 android:sharedUserId。怎么会这样?
-
android:sharedUserId是一个可以放在<manifest>上的属性。如果 2+ 应用程序具有相同的sharedUserId并由相同的签名密钥签名,则它们可以在内部存储上读取/写入彼此的文件。但是,如果您更改运输应用程序的sharedUserId值(包括在最初没有它运输后添加一个),现有用户将被锁定在其内部存储文件之外。 Android 会切换应用运行的 Linux uid,但不会更改文件的所有权。 -
我猜你没有改变
android:sharedUserId。如果您只从一个用户和设备处获得此崩溃报告,则可能有人正在对您的应用程序进行逆向工程,并以某种方式破坏了文件所有权。或者,也许这是一个拥有根设备的用户,他们不小心更改了文件权限。 -
非常感谢您的说明。您能否将您的 cmets 合并为我接受的答案?
标签: android