You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android用户空间写入AT24 EEPROM遇FileNotFoundException求助

解决Android用户空间写入AT24 EEPROM时的FileNotFoundException问题

根据你的描述,命令行和Linux应用能正常读写该EEPROM节点,但Android App抛出文件找不到的异常,结合你的代码和Android的权限机制,我整理了几个可能的原因及对应的排查/解决方法:

1. SELinux 权限限制

这是Android系统中最常见的原因之一。即使文件系统权限允许访问,Android的SELinux安全策略可能会阻止普通App访问sysfs节点:

  • 命令行(一般是root或shell用户)和Linux应用通常运行在不受SELinux严格限制的域中,而普通Android App的域(比如untrusted_app)默认没有访问这类sysfs节点的权限。
  • 验证方法:在adb shell中执行setenforce 0临时关闭SELinux,然后重新运行App测试。如果此时能正常写入,就确认是SELinux的问题。
  • 解决方法:
    • 临时测试:可以用chcon u:object_r:system_file:s0 /sys/devices/soc.0/78ba000.i2c/i2c-6/6-0050/eeprom修改节点的SELinux上下文(重启后失效)。
    • 永久解决:需要在设备的SEPolicy中添加允许App访问该节点的规则,比如添加类似allow untrusted_app sysfs_i2c:eeprom_file rw_file_perms;的规则,然后重新编译SEPolicy并刷入设备。

2. Android App的沙箱与权限限制

普通Android App运行在沙箱环境中,默认无法直接访问系统级的sysfs节点,除非满足以下条件之一:

  • App是系统应用:将App放入系统的/system/priv-app目录,并使用系统签名签名。系统应用拥有更高的权限,通常可以访问这类节点。
  • App获取Root权限:通过su命令切换到root用户后执行写入操作,比如在代码中调用Runtime.exec执行echo "xxx" > /sys/xxx/eeprom命令(注意需要处理root权限的授权)。

3. 代码中的路径硬编码问题

你代码中硬编码了EEPROM节点的路径:

final File permFile = new File("/sys/devices/soc.0/78ba000.i2c/i2c-6/6-0050/eeprom");

虽然你说命令行能访问该路径,但要注意:

  • 不同设备的sysfs路径可能因SoC型号、内核版本不同而变化,比如i2c总线号可能不是i2c-6,设备地址也可能有差异。
  • 排查方法:在App中打印该路径的绝对路径,确认和命令行中使用的完全一致;或者尝试使用更通用的路径,比如/sys/class/i2c-dev/i2c-6/device/6-0050/eeprom(部分设备的sysfs结构可能有这个软链接)。

4. 代码逻辑的潜在错误(虽不是当前异常原因,但需注意)

你的写入代码存在一个逻辑错误,会导致写入位置不正确:

fileOutputStream.write(b, max_data.length + offset, data.length());

这里的第二个参数是byte数组b的偏移量,而不是EEPROM的偏移地址。如果你想写入EEPROM的指定偏移位置,应该使用RandomAccessFile来定位到目标偏移后再写入,示例代码如下:

try {
    RandomAccessFile raf = new RandomAccessFile(permFile, "rw");
    raf.seek(offset); // 定位到EEPROM的目标偏移位置
    raf.write(data.getBytes(), 0, length);
    raf.close();
} catch (Exception e) {
    e.printStackTrace();
}

否则你当前的代码会从byte数组的max_data.length + offset位置开始写入(大概率超出数组长度,后续会抛出IndexOutOfBoundsException),而不是写入EEPROM的指定偏移。

5. Manifest权限的遗漏

虽然你说已经添加了相应权限,但要确认是否添加了正确的权限:

  • 对于访问系统级节点,普通的WRITE_EXTERNAL_STORAGE权限是无效的,如果你是系统应用,可能需要添加android.permission.WRITE_SETTINGS或其他系统级权限;如果是Root权限方式,不需要额外Manifest权限,但需要处理Root授权。

内容的提问来源于stack exchange,提问作者manstud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:37:07