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
相关产品推荐
相关产品推荐

