OS:Android 6.0
在设备上访问一个SharedPreference,文件路径没有问题,对应的文件也存在,访问权限也设置成了777,但是每次用getSharedPreferences访问文件时,总是会报错:
W/SharedPreferencesImpl: getSharedPreferences java.io.FileNotFoundException: /data/user/0/com.coffee.test/shared_prefs/system_config_prefs.xml: open failed: EACCES (Permission denied) at libcore.io.IoBridge.open(IoBridge.java:452) at java.io.FileInputStream.<init>(FileInputStream.java:76) at android.app.SharedPreferencesImpl.loadFromDiskLocked(SharedPreferencesImpl.java:119) at android.app.SharedPreferencesImpl.-wrap1(SharedPreferencesImpl.java) at android.app.SharedPreferencesImpl$1.run(SharedPreferencesImpl.java:91) Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied) at libcore.io.Posix.open(Native Method)
at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186) at libcore.io.IoBridge.open(IoBridge.java:438) at java.io.FileInputStream.<init>(FileInputStream.java:76)
at android.app.SharedPreferencesImpl.loadFromDiskLocked(SharedPreferencesImpl.java:119)
at android.app.SharedPreferencesImpl.-wrap1(SharedPreferencesImpl.java)
at android.app.SharedPreferencesImpl$1.run(SharedPreferencesImpl.java:91)
找了半天也没发现的问题所在。最后忽然想起了android5.0以后开始使用了selinux的机制,使用getenforce命令查询当前的selinux 是否打开:
# getenforce
Enforcing
果然是selinux的原因,使用命令
setenforce 0
关闭selinux。
服务器的运维人员在做服务器配置时,经常会把selinux给关掉,但是在Android开发中,selinux的原因不太容易被想到,这个机制却能导致很多方面的问题。