在Android上自定义外部存储挂载点

7次阅读
没有评论

解决方案:在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卡重新格式化为可执行文件(如ext2ext4)可以帮助访问数据。
  • 步骤
    bash
    # 格式化
    busybox mkfs.ext2 /dev/sdcard_partition
  • 但这种方法会导致Android系统在下次启动时拒绝使用格式化的外部SD卡。可以通过直接修改文件系统(如通过adb操作)来跳过这些限制或尝试其他策略绕过这些机制。
4. 使用执行模式重新挂载
  • 背景:对于某些情况,仅使外部存储可写且能执行文件可能足够了。
  • 步骤
  • 首先卸载当前的/mnt/sdcard设备:
    bash
    mount -o remount, rw /mnt/sdcard
  • 这命令会移除noexec, nosuidnodev flags,从而允许对文件执行操作。不过仍需注意这只是暂时调整。
5. 验证结果
  • 步骤:重新启动设备并验证应用能够在新挂载点下正常运行。
  • 特别是当更改了初始化过程或者直接修改了系统文件(如init.rc)后,必须确保重启不恢复原有设置以保证更改效果。

注意事项:

  1. 上述方法可能因不同Android ROM而异。CM 7.1和其他Android版本的处理方式可能会有所不同。
  2. 这些步骤仅适用于已经root了设备的用户。
  3. 使用busybox工具确保其在运行过程中可访问必要功能(如格式化等操作)。
正文完