【问题标题】:Exception "open failed: EROFS (Read-only file system)" thrown by抛出异常“打开失败:EROFS(只读文件系统)”
【发布时间】: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 是一个可以放在&lt;manifest&gt; 上的属性。如果 2+ 应用程序具有相同的 sharedUserId 并由相同的签名密钥签名,则它们可以在内部存储上读取/写入彼此的文件。但是,如果您更改运输应用程序的sharedUserId 值(包括在最初没有它运输后添加一个),现有用户将被锁定在其内部存储文件之外。 Android 会切换应用运行的 Linux uid,但不会更改文件的所有权。
  • 我猜你没有改变android:sharedUserId。如果您只从一个用户和设备处获得此崩溃报告,则可能有人正在对您的应用程序进行逆向工程,并以某种方式破坏了文件所有权。或者,也许这是一个拥有根设备的用户,他们不小心更改了文件权限。
  • 非常感谢您的说明。您能否将您的 cmets 合并为我接受的答案?

标签: android


【解决方案1】:

android:sharedUserId 的变化可以解释这种情况。

android:sharedUserId 是一个可以放在&lt;manifest&gt; 上的属性。如果 2+ 个应用程序具有相同的sharedUserId 并使用相同的签名密钥进行签名,则它们可以在内部存储上读取/写入彼此的文件。

但是,如果您更改配送应用的 sharedUserId 值(包括在最初没有配送应用后添加一个),现有用户将无法访问其内部存储文件。 Android 会切换应用程序运行的 Linux uid,但不会更改文件的所有权。因此,该应用程序不再拥有对其文件的权限。这是我希望在这种情况下看到的例外情况。

正是这类问题导致谷歌最终在 Android Q 中弃用 android:sharedUserId,并计划在未来的版本中正式停止使用它。

在你的情况下,我猜你没有设置或更改android:sharedUserId


这是我所知道的唯一一种情况,您的应用程序的内部存储会被报告为只读,而您作为开发人员会导致该问题。

我能想到的其他一切都超出你的控制范围:

  • 可能是用户 root 了他们的设备并意外更改了您文件的文件所有权或文件权限

  • 也许用户是一个脚本小子,他正在对您的应用程序进行逆向工程,并且对android:sharedUserId 大惊小怪

  • 可能用户被勒索软件攻击,部分攻击是通过一些安全漏洞更改应用文件的权限

【讨论】:

    猜你喜欢
    • 2014-06-01
    • 2015-01-22
    • 1970-01-01
    • 2014-04-19
    • 2019-09-30
    • 2012-12-08
    • 1970-01-01
    • 2016-01-23
    • 2015-06-08
    相关资源
    最近更新 更多