解决方案:在Android设备上更改外部存储挂载点
工作环境设置
- Android版本:4.2.2及更高版本(本文以7.1及以后的Android版本为准)
- 设备类型:所有支持外部存储的Android设备,如智能手机、平板电脑等。
- 系统版本:CM 7.1或AOSP
背景
当使用某些文件管理器时,在将应用程序数据移动至外部存储后发现程序无法启动。这通常是因为外部SD卡的挂载点在Android系统中是只读且不能执行程序的特殊设置所导致的。
解决方案步骤:
1. 修改init.rc
配置
- 背景:对于ROM如CM 7.1和AOSP,它们确实采用了不同于普通Linux系统的做法来管理设备文件。在这些发行版中,挂载点通常不是由
/etc/vold.fstab
控制的。 - 步骤:
- 进入设备内部以获取
init.rc
的可写权限(注意:这是针对已经root过的设备)。 - 使用一个工具如
adb pull
从RAM磁盘中提取init.rc
文件到电脑上进行修改,通常在安装Rom时会包含此类工具。命令如下:
bash
adb shell cat /proc/cmdline | grep -qw ramdisk && zcat /dev/block/mapper/ramdisk > init.rc - 编辑
init.rc
文件中有关挂载设备的部分,以改变外部SD卡的挂载点。例如添加或修改以下内容:
ini
mount --bind /mnt/sdcard /sdcard - 此例将挂载点从默认的
/sdcard
指向自定义路径(根据实际情况更改)。
2. 调整启动文件
- 背景:为了使改动在设备重新启动后仍然可应用,需要进一步修改启动代码。通常可以通过重写init进程实现。
- 步骤:
- 由于CM 7.1有
/fstab.p1c
文件,这可能会被自定义的vold程序覆盖,在每次重启时都进行调整以保留改动。 - 全面了解和修改相关启动脚本、init函数等。
3. 挂载可读写且支持执行
- 背景:将外部SD卡重新格式化为可执行文件(如
ext2
或ext4
)可以帮助访问数据。 - 步骤:
bash
# 格式化
busybox mkfs.ext2 /dev/sdcard_partition - 但这种方法会导致Android系统在下次启动时拒绝使用格式化的外部SD卡。可以通过直接修改文件系统(如通过
adb
操作)来跳过这些限制或尝试其他策略绕过这些机制。
4. 使用执行模式重新挂载
- 背景:对于某些情况,仅使外部存储可写且能执行文件可能足够了。
- 步骤:
- 首先卸载当前的
/mnt/sdcard
设备:
bash
mount -o remount, rw /mnt/sdcard - 这命令会移除
noexec
,nosuid
和nodev
flags,从而允许对文件执行操作。不过仍需注意这只是暂时调整。
5. 验证结果
- 步骤:重新启动设备并验证应用能够在新挂载点下正常运行。
- 特别是当更改了初始化过程或者直接修改了系统文件(如
init.rc
)后,必须确保重启不恢复原有设置以保证更改效果。
注意事项:
- 上述方法可能因不同Android ROM而异。CM 7.1和其他Android版本的处理方式可能会有所不同。
- 这些步骤仅适用于已经root了设备的用户。
- 使用
busybox
工具确保其在运行过程中可访问必要功能(如格式化等操作)。
正文完