Android在rootdir根目录创建自定义目录和挂载点的方法

本文详细介绍了在Android ROM制作过程中如何在根文件系统下创建/factory/bin目录。通过修改Android.mk文件,利用LOCAL_POST_INSTALL_CMD在编译安装后执行命令,创建并挂载所需目录。具体步骤包括在Android.mk文件中添加mkdir命令,然后编译构建系统将自动执行这些命令,最终实现在ramdisk.img中创建/factory/bin及其子目录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.需求描述

在制作ROM时,经常需要创建自己的根目录下的挂载点,比如本文,需要在Android的根文件系统,即ramdisk.img,系统运行时的根路径下,创建一个/factory/bin目录,如下详细介绍做法。
在这里插入图片描述

创建后效果如下图

szhou@bcsrv01:~/Disk4t/szhou/mt9269_works/android/out/target/product/mt5862_bga_1g/root$ tree -L 2
.
├── acct
├── bin
├── bugreports -> /data/user_de/0/com.android.shell/files/bugreports
├── cache
├── charger -> /sbin/charger
├── config
├── d -> /sys/kernel/debug
├── data
├── default.prop -> system/etc/prop.default
├── dev
├── etc -> /system/etc
├── factory              <----------------  创建 /factory/bin
│   └── bin              <----------------
├── init
├── init.environ.rc
├── init.rc
├── init.recovery.mt5862.rc
├── init.usb.configfs.rc
├── init.usb.rc
├── init.zygote32.rc
├── mnt
├── odm
├── oem
├── proc
├── product -> /system/product
├── sbin
├── sdcard -> /storage/self/primary
├── storage
├── sys
├── system
├── ueventd.rc
└── vendor

18 directories, 31 files
szhou@bcsrv01:~/Disk4t/szhou/mt9269_works/android/out/target/product/mt5862_bga_1g/root$ 

2. 思路及实现方法

  • 需创建的目录是在编译过程中创建的,之后才进一步打包成img分区镜像文件,所以需要到mk文件中去查找合适的位置和方法。如下很容易就找到了一个Android.mk。

  • 在LOCAL_POST_INSTALL_CMD 末尾添加 mkdir -p $(TARGET_ROOT_OUT)/factory/bin;

文件路径:android\device\mediatek\mt5862\fusion\Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := make_apollo_dir_symlink
LOCAL_MODULE_CLASS := FAKE
LOCAL_MODULE_TAGS := optional

# preload rootfs tv folders
LOCAL_POST_INSTALL_CMD += \
    mkdir -p $(TARGET_OUT_VENDOR)/bin; \
    ln -sf /mnt/vendor/linux_rootfs/lib/ld-linux.so.3 $(TARGET_OUT_VENDOR)/bin/linker; \
    ln -sf /vendor/tvconfig/config $(TARGET_OUT_VENDOR)/config; \
    mkdir -p $(TARGET_OUT_ETC); \
    ln -sf /data/vendor/tmp/resolv.conf $(TARGET_OUT_ETC)/resolv.conf; \
    mkdir -p $(PRODUCT_OUT)/root/bin; \
    ln -sf /sbin/mksh $(PRODUCT_OUT)/root/bin/sh; \
    ln -sf /system/bin/rm $(PRODUCT_OUT)/root/bin/rm; \
    ln -sf /system/bin/true $(PRODUCT_OUT)/root/bin/true; \
    mkdir -p $(TARGET_ROOT_OUT)/factory/bin;

……省略……

include $(BUILD_SYSTEM)/base_rules.mk

$(LOCAL_BUILT_MODULE):
	$(hide) echo "Fake: $@"
	$(hide) mkdir -p $(dir $@)
	$(hide) touch $@
PACKAGES.$(LOCAL_MODULE).OVERRIDES := $(strip $(LOCAL_OVERRIDES_PACKAGES))

从此mk文件可知,此文件及时为部署而做的一个伪module,用于创建链接和目录

LOCAL_MODULE := make_apollo_dir_symlink
LOCAL_MODULE_CLASS := FAKE
LOCAL_MODULE_TAGS := optional

3.关于LOCAL_POST_INSTALL_CMD

可以在系统完成源码编译,以及INSTALL部署后,继续执行此CMD包含的命令语句

4. 其他:rootdir

文件:android\system\core\rootdir\Android.mk
对于非本文所涉及的MTK平台,可以在此文件中追加修改,或者自己创建一个mk文件

5.最终效果图

在这里插入图片描述

<think>好的,我现在需要帮助用户解决在Android系统根目录创建文件夹的问题。根据用户提供的引用内容,我需要仔细分析这些信息,并结合自己的知识给出正确的步骤。 首先,用户提到他们尝试在根目录创建CAT_IMG文件夹,但没成功。他们添加了权限,但可能没考虑到Android高版本的限制。根据引用[1],用户可能直接尝试通过代码创建,但可能路径不正确或者权限不足。 接下来,引用[2]提到根目录下的目录通常是在编译过程中通过mk文件创建的,之后打包成镜像。这说明普通应用无法在运行时修改系统根目录,需要系统级权限或者定制ROM。所以用户可能需要系统签名或root权限。 引用[3]指出用户尝试在根目录而非sdcard创建文件夹,但普通应用没有权限写入系统分区。可能需要使用系统应用权限或者修改系统镜像。 综合这些信息,用户可能需要以下步骤:首先确认是否有root权限或系统签名;其次,使用正确的路径,比如/system或/data目录;然后通过Runtime执行shell命令,如mkdir,并使用su获取权限。此外,可能需要修改Android.mk文件在编译时创建目录,如引用[2]所述。 另外,需要考虑Android版本的限制,比如Scoped Storage在Android 10及以上限制了访问根目录的能力。用户可能需要降级目标版本或声明MANAGE_EXTERNAL_STORAGE权限,但这可能需要Google Play的批准。 最后,如果用户只是想存储应用数据,建议使用内部存储或外部存储的公共目录,而不是系统根目录,以避免权限问题。</think>在Android系统根目录创建文件夹需要特殊权限特定方法,以下是具体步骤注意事项: ### 方法1:通过系统签名应用实现 1. **添加系统权限** ```xml <uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> ``` 需要系统签名才能生效[^1][^2] 2. **使用root权限执行命令** ```java try { Process process = Runtime.getRuntime().exec("su"); DataOutputStream os = new DataOutputStream(process.getOutputStream()); os.writeBytes("mkdir /CAT_IMG\n"); os.writeBytes("exit\n"); os.flush(); process.waitFor(); } catch (Exception e) { e.printStackTrace(); } ``` 需设备已root且应用获得root授权[^3] ### 方法2:编译系统时创建(推荐可靠方案) 1. 在Android源码目录找到`system/core/rootdir/Android.mk` 2. 添加创建目录指令: ```makefile LOCAL_POST_INSTALL_CMD += ; mkdir -p $(TARGET_ROOT_OUT)/CAT_IMG ``` 3. 重新编译系统镜像并刷入设备 ### 注意事项: 1. Android 10+系统启用Scoped Storage后,普通应用无法直接访问根目录 2. 需要区分物理根目录虚拟文件系统: - 真实物理路径:`/system`、`/data` - 虚拟挂载:`/sdcard`(实际指向`/storage/emulated/0`) 3. 建议优先使用标准存储目录: ```java File appDir = new File(Environment.getExternalStorageDirectory(), "CAT_IMG"); if (!appDir.exists()) { appDir.mkdirs(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿迷创客

感谢!您的支持是我写作的动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值