如何防止应用卸载时删除符号链接指向的共享文件夹内容?
解决Android卸载应用时误删共享文件夹文件的问题
问题根源
你当前是将/data/media/0/Android/data/<package name>整个目录软链接到共享文件夹,Android卸载应用时,系统会递归清理该包名目录——由于是软链接,系统会直接删除**目标路径(共享文件夹)**内的所有内容,chmod -R 777无效是因为系统删除操作的权限不受普通文件权限限制,且软链接本身的权限不影响目标文件。
可行解决方案
方案1:仅对文件/子目录创建软链接(推荐)
不要将整个包名目录设为软链接,而是保留应用默认的Android/data/<package name>目录,仅将共享文件夹内的文件/子目录单独链接到该目录下:
- 创建应用默认的目录(如果不存在):
adb shell mkdir -p /data/media/0/Android/data/<package name> - 获取应用对应的用户ID(确保权限匹配):
adb shell dumpsys package <package name> | grep userId - 给目录设置正确的权限:
adb shell chown -R <获取到的userId>:<获取到的userId> /data/media/0/Android/data/<package name> - 逐个链接共享文件夹内的内容:
# 链接单个文件 adb shell ln -s /mnt/shared/<package name>/example.txt /data/media/0/Android/data/<package name>/example.txt # 链接子目录 adb shell ln -s /mnt/shared/<package name>/cache /data/media/0/Android/data/<package name>/cache
卸载应用时,系统只会删除Android/data/<package name>下的软链接文件,不会触及共享文件夹内的原始内容。
方案2:使用Bind Mount替代软链接
Bind Mount是将目录挂载到另一个位置,和软链接的本质区别是:系统删除挂载点的内容时,不会影响原目录的文件:
- 删除原软链接:
adb shell rm /data/media/0/Android/data/<package name> - 创建空的挂载目标目录:
adb shell mkdir -p /data/media/0/Android/data/<package name> - 执行挂载命令:
adb shell mount --bind /mnt/shared/<package name> /data/media/0/Android/data/<package name>
注意:Bind Mount重启后会失效,若需持久化,可将挂载命令添加到开机脚本(如
/etc/init.d/),或通过Magisk模块实现自动挂载。
方案3:限制应用卸载清理权限(需Root/Xposed)
通过Xposed模块(如AppOps)禁止应用卸载时的外部存储清理权限,此方法操作复杂,仅推荐前两种方案无法实现时使用。
内容的提问来源于stack exchange,提问作者Yune
相关产品推荐
相关产品推荐

