1.新建目录/mnt/nand, 用于挂载内部虚拟sd卡,并将/mnt/sdcard 和 /sdcard 链接到 /mnt/nand。
2.Memory.java 中实现内外sdcard切换功能,切换时,把/sdcard链接到相应的内外挂载点上。
3.简单流程:
Memory.java-->MountService.java
发送命令自定义"changeVolumeLink"-->CommandListener.cpp
-->VolumeManager.cpp 根据上层传来的参数执行/system/etc/to_ext_sdcard.sh
或 /system/etc/to_sdcard.sh
to_sdcard.sh:
#!/system/bin/sh
rm sdcard
ln -s /mnt/nand/ sdcard
rm /mnt/sdcard
ln -s /mnt/nand/ /mnt/sdcard
to_ext_sdcard.sh:
#!/system/bin/sh
rm sdcard
ln -s /mnt/ext_sdcard/ sdcard
rm /mnt/sdcard
ln -s /mnt/ext_sdcard/ /mnt/sdcard
-->MountService.java
发送命令changeVolumeLink 到 CommandListener.cpp 处理。当然,要在IMountService.java中添加远程接口。
private int doChangeVolumeLink(String choiceValue) {
int rc = StorageResultCode.OperationSucceeded;
if (DEBUG_EVENTS) Slog.i(TAG, "doChangeVolumeLink : choiceValue " + choiceValue);
try {
mConnector.doCommand(String.format("volume changeVolumeLink %s", choiceValue));
} catch (NativeDaemonConnectorException e) {
}
return rc;
}
-->VolumeManager.cpp
注意脚本可执行权限问题
int VolumeManager::changeVolumeLink(char *choiceValue) {
if (!strcmp(choiceValue, "1")) {
system("/system/etc/to_ext_sdcard.sh");
} else if (!strcmp(choiceValue, "0")) {
system("/system/etc/to_sdcard.sh");
}
return 0;
}