在 /data 上创建文件时 AOSP 权限被拒绝
AOSP Permission denied when creating file on /data
在 Android 6.0 中,我试图在 /data 分区的 sample
文件夹中创建一个空文件:/data/sample/emptyfile
.
代码 运行 来自 /external
中安装的库
File file = new File(/data/sample/emptyfile);
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
我已经为位于 /system/core/libcutils/fs_config.c
source
的 sample
文件夹分配了适当的权限
我尝试添加以下代码变体:
/* Rules for directories.
** These rules are applied based on "first match", so they
** should start with the most specific path and work their
** way up to the root.
*/
static const struct fs_path_config android_dirs[] = {
{ 00777, AID_ROOT, AID_ROOT, 0, "data/sample" },
{ 00770, AID_SYSTEM, AID_CACHE, 0, "cache" },
... etc.
并在:
/* Rules for files.
** These rules are applied based on "first match", so they
** should start with the most specific path and work their
** way up to the root. Prefixes ending in * denotes wildcard
** and will allow partial matches.
*/
static const char conf_dir[] = "/system/etc/fs_config_dirs";
static const char conf_file[] = "/system/etc/fs_config_files";
static const struct fs_path_config android_files[] = {
{ 00777, AID_ROOT, AID_ROOT, 0, "data/sample/*" },
{ 00440, AID_ROOT, AID_SHELL, 0, "system/etc/init.goldfish.rc" },
... etc.
我尝试同时使用 AID_ROOT, AID_ROOT
和 AID_SYSTEM, AID_SYSTEM
文件夹sample
在编译时创建成功,权限为:drw-rw-rw-
根据文件资源管理器(虽然我分配了777但没有执行权限)
仍然,当尝试创建文件时 logcat 打印:
02-27 17:33:30.097: W/System.err(1939): java.io.IOException: open failed: EACCES (Permission denied)
02-27 17:33:30.097: W/System.err(1939): at java.io.File.createNewFile(File.java:939)
02-27 17:33:30.097: W/System.err(1939): at com.android.incallui.InCallPresenter (...)
02-27 17:33:30.097: W/System.err(1939): at com.android.incallui.CallList.notifyGenericListeners(CallList.java:541)
02-27 17:33:30.097: W/System.err(1939): at com.android.incallui.CallList.onUpdate(CallList.java:188)
02-27 17:33:30.098: W/System.err(1939): at com.android.incallui.Call.update(Call.java:311)
02-27 17:33:30.098: W/System.err(1939): at com.android.incallui.Call.-wrap0(Call.java)
02-27 17:33:30.098: W/System.err(1939): at com.android.incallui.Call.onDetailsChanged(Call.java:208)
02-27 17:33:30.098: W/System.err(1939): at android.telecom.Call.run(Call.java:1156)
02-27 17:33:30.098: W/System.err(1939): at android.os.Handler.handleCallback(Handler.java:739)
02-27 17:33:30.098: W/System.err(1939): at android.os.Handler.dispatchMessage(Handler.java:95)
02-27 17:33:30.098: W/System.err(1939): at android.os.Looper.loop(Looper.java:148)
02-27 17:33:30.098: W/System.err(1939): at android.app.ActivityThread.main(ActivityThread.java:5417)
02-27 17:33:30.098: W/System.err(1939): at java.lang.reflect.Method.invoke(Native Method)
02-27 17:33:30.098: W/System.err(1939): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
02-27 17:33:30.098: W/System.err(1939): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
02-27 17:33:30.098: W/System.err(1939): Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
02-27 17:33:30.098: W/System.err(1939): at libcore.io.Posix.open(Native Method)
02-27 17:33:30.098: W/System.err(1939): at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
02-27 17:33:30.098: W/System.err(1939): at java.io.File.createNewFile(File.java:932)
02-27 17:33:30.098: W/System.err(1939): ... 16 more
仅仅因为您在 Android 中拥有 DAC (rwx) 权限,并不意味着您拥有相应的 SELinux 权限。由于您得到的是 EACCES,并且如果您的文件确实是 777,我猜您在尝试访问它时会遇到 SELinux 拒绝。 Logcat 或 dmesg 应该有一个 avc 拒绝,如果你被拒绝。
可能在 AOSP 的某处设置了保护措施以防止世界可写或世界可读的目录或文件。尝试降低对目录的 00771 和文件的 00644 等合理权限。
使文件对所有人都可读或对所有人都可写是一个糟糕的想法,而且通常是不必要的。
在 Android 6.0 中,我试图在 /data 分区的 sample
文件夹中创建一个空文件:/data/sample/emptyfile
.
代码 运行 来自 /external
File file = new File(/data/sample/emptyfile);
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
我已经为位于 /system/core/libcutils/fs_config.c
source
sample
文件夹分配了适当的权限
我尝试添加以下代码变体:
/* Rules for directories.
** These rules are applied based on "first match", so they
** should start with the most specific path and work their
** way up to the root.
*/
static const struct fs_path_config android_dirs[] = {
{ 00777, AID_ROOT, AID_ROOT, 0, "data/sample" },
{ 00770, AID_SYSTEM, AID_CACHE, 0, "cache" },
... etc.
并在:
/* Rules for files.
** These rules are applied based on "first match", so they
** should start with the most specific path and work their
** way up to the root. Prefixes ending in * denotes wildcard
** and will allow partial matches.
*/
static const char conf_dir[] = "/system/etc/fs_config_dirs";
static const char conf_file[] = "/system/etc/fs_config_files";
static const struct fs_path_config android_files[] = {
{ 00777, AID_ROOT, AID_ROOT, 0, "data/sample/*" },
{ 00440, AID_ROOT, AID_SHELL, 0, "system/etc/init.goldfish.rc" },
... etc.
我尝试同时使用 AID_ROOT, AID_ROOT
和 AID_SYSTEM, AID_SYSTEM
文件夹sample
在编译时创建成功,权限为:drw-rw-rw-
根据文件资源管理器(虽然我分配了777但没有执行权限)
仍然,当尝试创建文件时 logcat 打印:
02-27 17:33:30.097: W/System.err(1939): java.io.IOException: open failed: EACCES (Permission denied)
02-27 17:33:30.097: W/System.err(1939): at java.io.File.createNewFile(File.java:939)
02-27 17:33:30.097: W/System.err(1939): at com.android.incallui.InCallPresenter (...)
02-27 17:33:30.097: W/System.err(1939): at com.android.incallui.CallList.notifyGenericListeners(CallList.java:541)
02-27 17:33:30.097: W/System.err(1939): at com.android.incallui.CallList.onUpdate(CallList.java:188)
02-27 17:33:30.098: W/System.err(1939): at com.android.incallui.Call.update(Call.java:311)
02-27 17:33:30.098: W/System.err(1939): at com.android.incallui.Call.-wrap0(Call.java)
02-27 17:33:30.098: W/System.err(1939): at com.android.incallui.Call.onDetailsChanged(Call.java:208)
02-27 17:33:30.098: W/System.err(1939): at android.telecom.Call.run(Call.java:1156)
02-27 17:33:30.098: W/System.err(1939): at android.os.Handler.handleCallback(Handler.java:739)
02-27 17:33:30.098: W/System.err(1939): at android.os.Handler.dispatchMessage(Handler.java:95)
02-27 17:33:30.098: W/System.err(1939): at android.os.Looper.loop(Looper.java:148)
02-27 17:33:30.098: W/System.err(1939): at android.app.ActivityThread.main(ActivityThread.java:5417)
02-27 17:33:30.098: W/System.err(1939): at java.lang.reflect.Method.invoke(Native Method)
02-27 17:33:30.098: W/System.err(1939): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
02-27 17:33:30.098: W/System.err(1939): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
02-27 17:33:30.098: W/System.err(1939): Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
02-27 17:33:30.098: W/System.err(1939): at libcore.io.Posix.open(Native Method)
02-27 17:33:30.098: W/System.err(1939): at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
02-27 17:33:30.098: W/System.err(1939): at java.io.File.createNewFile(File.java:932)
02-27 17:33:30.098: W/System.err(1939): ... 16 more
仅仅因为您在 Android 中拥有 DAC (rwx) 权限,并不意味着您拥有相应的 SELinux 权限。由于您得到的是 EACCES,并且如果您的文件确实是 777,我猜您在尝试访问它时会遇到 SELinux 拒绝。 Logcat 或 dmesg 应该有一个 avc 拒绝,如果你被拒绝。
可能在 AOSP 的某处设置了保护措施以防止世界可写或世界可读的目录或文件。尝试降低对目录的 00771 和文件的 00644 等合理权限。
使文件对所有人都可读或对所有人都可写是一个糟糕的想法,而且通常是不必要的。