[RK3568 Android13]系统根目录的文件夹下创建文件夹或文件

平台:RK3568

系统:Android 13

1、需求描述

为了实现系统内置的APP在系统中某些用户无法看到的目录下创建文件夹或文件,需要系统创建文件夹,内置的系统APP具有读写权限,以及系统源码也可以读写该目录或文件。

比如:我们需要在系统根目录data或mnt文件夹下创建一个文件夹mcuhot,需要按照如下操作。

1)在init.rc文件中实现创建目录指令

2)在系统代码中实现某些读写逻辑

3)SELlinux限制添加所需的权限

2、功能实现

1)在init.rc文件中实现创建目录指令

在init.rc添加如下指令实现在目录data下创建文件夹mcuhot.

添加:

mkdir /data/mcuhot
chown system system /data/mcuhot
chmod 0777 /data/mcuhot

文件路径:system/core/rootdir/init.rc

on property:sys.boot_completed=1
    bootchart stop
    # Setup per_boot directory so other .rc could start to use it on boot_completed
    exec - system system -- /bin/rm -rf /data/per_boot
    mkdir /data/per_boot 0700 system system encryption=Require key=per_boot_ref
    
    mkdir /data/sdady
    chown system system /data/sdady
    chmod 0777 /data/sdady

# system server cannot write to /proc/sys files,
# and chown/chmod does not work for /proc/sys/ entries.
# So proxy writes through init.
on property:sys.sysctl.extra_free_kbytes=*
    exec -- /system/bin/extra_free_kbytes.sh ${sys.sysctl.extra_free_kbytes}

2)在系统代码中实现某些读写逻辑

系统代码实现逻辑功能代码此处忽略。主要介绍编写完成后编译,下载更新系统后,并没有实现预期功能,抓取日志进行分析。

从日志分析来看,创建的mcuhot,系统APP没有打开权限,也就是我们frameworks实现的逻辑代码,没有打开目录权限,从后续的日志分析来看,也没有读取权限,因此我们这里需要简单了解SELinux安全模块。

安全增强型linux(Security-Enhanced Linux)简称 SELinux,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统。SELinux 主要由美国国家安全局开发。2.6 及以上版本的 Linux 内核都已经集成了 SELinux 模块。SELinux 的结构及配置非常复杂,而且有大量概念性的东西,要学精难度较大。很多 Linux 系统管理员嫌麻烦都把 SELinux 关闭了。

关于SELinux我们不过多介绍,网络上有详细介绍和使用。目前只解决如何处理我们的问题。刚才提到我们系统APP没有打开和读取权限,由于SELinux限制了在对根目录下的文件夹及文件的打开,读取,写入等各种操作。

如何添加权限呢?从日志分析可知,mcuhot没有读取被限制,后续日志发现也没有打开权限,日志关键部分如下:

---------------------------------------------------------------------------------------------------------------------------------

auditd  : type=1400 audit(0.0:562): avc: denied { read } for comm="DefaultDispatch" name="mcuhot" dev="dm-8" ino=1391 scontext=u:r:system_app:s0 tcontext=u:object_r:system_data_file:s0 tclass=dir permissive=1

... ...

DefaultDispatch: type=1400 audit(0.0:563): avc: denied { open } for path="/data/sdady" dev="dm-8" ino=1391 scontext=u:r:system_app:s0 tcontext=u:object_r:system_data_file:s0 tclass=dir permissive=1

---------------------------------------------------------------------------------------------------------------------------------

SELinux添加权限格式:

allow 源类型 目标类型:访问类型 操作权限

实现代码:

allow system_app system_data_file:dir { read open };

3)SELlinux限制添加所需的权限

在system_app.te添加权限打开和读取权限,各平台芯片system_app.te文件,所处目录各不相同。在文件最后添加如下代码:

allow system_app system_data_file:dir { read open };
 

路径:device/rockchip/common/sepolicy/vendor/system_app.te

dontaudit system_app mnt_vendor_file:dir search;
#for gpu
allow system_app sysfs_usb:file rw_file_perms;
#for ota
allow system_app selinuxfs:file { read open };
allow system_app mnt_media_rw_file:dir { getattr };
#for hdmi
allow system_app sysfs_hdmi:file rw_file_perms;
allow system_app sysfs_zram:dir r_dir_perms;
allow system_app sysfs_zram:file rw_file_perms;
allow system_app proc_stat:file { read open getattr };
#for samba
allow system_app metadata_file:dir {getattr};
allow system_app block_device:dir {search};
#for devicetest
#allow system_app system_app_data_file:file { execute execute_no_trans };
allow system_app system_data_file:file { read };
allow system_app { sysfs_leds metadata_file }:dir { search };

#TODO removed for Q
#allow system_app vendor_file:file { read open };
allow system_app unlabeled:filesystem { getattr };
allow system_app unlabeled:file { getattr open read write unlink rename };
allow system_app unlabeled:dir { open search read getattr write remove_name add_name };
allow system_app cache_file:lnk_file { read };
allow system_app cache_recovery_file:dir {search create read write open add_name getattr remove_name};
allow system_app cache_recovery_file:file {rw_file_perms create unlink setattr};

#TODO removed for Q
#allow system_app vendor_file:file { getattr };
allow system_app cache_file:dir search;
#set_prop(system_app,exported_system_prop)
set_prop(system_app,powerctl_prop)

allow system_app abc_data_file:file { read getattr };
allow system_app abc_data_file:dir { open getattr read search };

set_prop(system_app, debug_prop)

rw_rockchip_graphic_device(system_app)

allow system_app block_device:dir { search read open getattr };
allow system_app mnt_media_rw_file:dir { search read open getattr };
allow system_app asec_apk_file:dir { search read open getattr };

hal_client_domain(system_app, hal_light)
hal_client_domain(system_app, hal_power)
hal_client_domain(system_app, hal_health)
binder_call(system_app, hal_keymint_default)
binder_call(system_app, hal_usb_impl)
binder_call(system_app, update_engine)
allow system_app proc_pagetypeinfo:file r_file_perms;

allow system_app mnt_sdcard_file:lnk_file r_file_perms;
allow system_app mnt_pass_through_file:dir r_file_perms;
allow system_app system_data_file:dir { read open };

<think>在Android系统中,当根目录(/)为只读时,创建文件夹需要特殊处理。根据用户之前的报错(“/system/bin/sh: ./aiot_rk: No such file or directory”),他已尝试在Android中运行Linux编译的程序,但未成功。现在他转向在只读文件系统创建文件夹的问题。 结合引用内容和用户需求,我将重点解决如何在Android只读文件系统创建文件夹的问题。以下是分步解决方案: --- ### 📂 **如何在Android只读根目录创建文件夹?** #### 🔧 **根本原因分析** Android系统分区(如`/system`、`/vendor`)默认挂载为**只读**(ro),这是出于系统安全性和稳定性的考虑。普通应用甚至ADB用户(非root)无法直接修改这些分区。 #### ️ **解决方案:重新挂载为可读写(rw)** 需要**root权限**并执行以下步骤: 1. **通过ADB获取root权限**(前提:设备已解锁并root) ```bash adb root # 重启adbd以root权限运行 adb remount # 尝试重新挂载分区(可能不适用于所有设备) adb shell # 进入设备shell ``` 2. **手动重新挂载目标分区为可读写** ```bash mount -o rw,remount /system # 挂载/system为可读写(推荐路径) # 尝试挂载根目录(风险较高,可能导致系统不稳定) mount -o rw,remount / ``` 3. **创建目标文件夹** ```bash mkdir /system/your_folder # 在/system下创建(推荐,重启后可能保留) mkdir /data/your_folder # 在/data下创建(无需remount,通常可写) ``` 4. **恢复只读属性(操作完成后)** ```bash mount -o ro,remount /system # 重新挂载为只读 ``` > ️ **注意** > - `/system`分区空间有限,创建文件可能导致系统异常 > - 修改系统分区可能触发SELinux限制(需关闭SELinux添加策略)[^3] --- ### 📍 **替代方案:使用可写分区** 若无需修改系统文件,优先使用**非系统分区**: ```java // 在App中创建文件夹(无需root) File dir = new File(Environment.getExternalStorageDirectory(), "YourFolder"); if (!dir.exists()) { dir.mkdirs(); // 在/sdcard/YourFolder创建 } ``` | **可用路径** | **权限要求** | **重启后保留** | |----------------------|-------------------|--------------| | `/data/local/tmp` | ADB shell可写 | ✅ 是 | | `/sdcard` | 读写存储权限[^2][^4] | ✅ 是 | | `/system` | 需root和remount | ✅ 是(但危险)| --- ### 🔐 **绕过SELinux限制** 若遇到`Permission denied`(即使已root),需调整SELinux策略: 1. **临时关闭SELinux**(测试用) ```bash setenforce 0 # 切换为Permissive模式 ``` 2. **永久修改策略**(需重新编译系统)[^3] 编辑`file_contexts`文件添加规则: ```bash /system/your_folder u:object_r:system_file:s0 ``` --- ### ❓ **相关问题** 1. 如何在不root的情况下向Android系统目录写入文件? 2. 修改`/system`分区后如何避免系统OTA更新失败? 3. Android 11的Scoped Storage如何影响外部存储访问?[^2][^4] 4. 如何为自定义文件夹添加SELinux安全上下文?[^3] > 操作前请备份数据,错误修改可能导致设备无法启动。 </think>在 Android 系统根目录为只读的情况下创建文件夹,需要通过特殊方法绕过文件系统限制。以下是详细解决方案: --- ### 📝 **Android 只读根目录创建文件夹方法** #### 1. **重新挂载文件系统为可读写(推荐)** 需要 **root 权限** 和 **ADB 调试**: ```bash adb root # 获取root权限 adb remount # 尝试默认remount(部分设备支持) # 若失败则手动挂载: adb shell mount -o rw,remount / # 将根目录挂载为可读写 ★ 关键步骤 mkdir /custom_folder # 创建目标文件夹 chmod 777 /custom_folder # 设置权限 mount -o ro,remount / # 完成后恢复只读 ``` **注意事项**: - 适用于 `/system` `/vendor` 等分区创建目录 [^1] - 部分设备需指定具体分区:`mount -o rw,remount /system` #### 2. **使用可写分区替代根目录** ```bash # 在用户可写区域创建(无需 root) adb shell mkdir /data/local/tmp/custom_folder # /data 分区通常可写 mkdir /sdcard/custom_folder # 外部存储(需存储权限) ``` #### 3. **SELinux 权限处理** 若出现 **Permission denied**: ```bash # 临时关闭 SELinux 强制模式 adb shell setenforce 0 # 创建目录后再恢复 adb shell setenforce 1 ``` 永久解决方案需修改 SELinux 策略文件(需系统编译权限)[^3]: 1. 编辑 `file_contexts` 文件 2. 添加:`/custom_folder u:object_r:system_file:s0` --- ### ⚠️ **关键注意事项** 1. **设备兼容性**: - MTK 设备:尝试 `adb shell mtk_mount_system` - 华为设备:可能需要解锁 bootloader 2. **目录持久性**: - `/system` 下目录在 OTA 更新后可能消失 - `/data` 下目录可永久保留 3. **权限问题**: ```bash adb shell ls -ld /custom_folder # 验证权限 drwxrwxrwx 2 root root 4096 2023-08-01 /custom_folder ``` --- ### 🔄 **操作流程图** ```mermaid graph TD A[连接ADB] --> B{是否root?} B --> |是| C[remount / 为 rw] B --> |否| D[使用 /data /sdcard] C --> E[创建目录] E --> F[恢复 ro 挂载] D --> G[验证权限] F --> H[检查SELinux] G --> I[完成] ``` --- ### ❓ **相关问题** 1. 如何在未 root 的 Android 设备上修改系统文件? 2. 修改 `/system` 分区后如何避免 OTA 更新失败? 3. Android 13 的受限分区挂载有哪些变化? 4. 如何为自定义目录添加 SELinux 安全上下文?[^3] 5. 外部存储(SD卡)创建文件夹的权限问题如何解决?[^2][^4] > **操作警告**:强行修改系统分区可能导致设备变砖,建议操作前备份数据。非开发需求优先使用 `/data` `/sdcard` 目录 [^2][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值