插上U盘就自动冒出Android、Music、Pictures文件夹?一个LSPosed模块彻底解决(ColorOS/安卓16实测)
插上 U 盘就自动冒出 Android、Music、Pictures 文件夹?一个 LSPosed 模块彻底解决
先说结论:如果你也有”手机一插 OTG U 盘 / SD 卡,根目录就自动多出一堆 Android、Music、Pictures、DCIM、Movies 文件夹,删了下次还冒出来”的毛病,这篇文章能帮你根治。
我先把这个痛点的”前世今生”讲清楚,再给你一个真正管用的东西。文末有下载链接,赶时间可以直接滑到底。
这破事有多烦人,懂的都懂
想象一下这个场景:
你高高兴兴插上一个 U 盘,想把它当个干净的移动硬盘用。结果一插上去,系统”贴心”地给你建好了一堆空文件夹,整整齐齐排在那里——Android、Music、Pictures、DCIM、Movies……
你一脸嫌弃,手动删掉。拔了 U 盘,下次再插——
又冒出来了。
删了又建,建了又删,仿佛在跟你玩打地鼠。这玩意儿在 ColorOS、MIUI、Funtouch 等一众国产系统上尤其明显,网上搜”U盘自动创建文件夹””SD卡自动创建目录”,抱怨一大堆,却几乎没有一个真正好用的解决办法。
为什么这么难解决?因为大部分人想的方向就错了。
为什么”看着简单”,其实特别难搞
很多人第一反应是:这还不简单?删掉不就行了?要么就是装个”禁用目录”的工具。
但你很快会发现,这问题有三个坑:
坑一:这些文件夹是系统”必须”建的
创建这些目录的元凶,是 Android 的媒体数据库服务 MediaProvider(包名 com.android.providers.media.module)。它认为「每个存储卷都应该有一套标准的媒体目录结构」,于是在你插上外置存储的那一刻,就”尽职尽责”地帮你初始化好。
这不是 bug,是特性——但显然是个挺讨厌的特性。
坑二:它不是走普通 Java 代码创建的
关键来了。这些目录的创建,根本没过 Java 层的 File.mkdir(),而是 MediaProvider 通过 native 层 FUSE 直接调用了系统 C 库的 mkdir / mkdirat 函数。
这意味着:你用常规的 Xposed 模块去 Hook Java 方法,完全拦不住。网上很多所谓的”禁止创建目录”模块之所以失效,根子就在这里——它们 Hook 错了层。
坑三:硬编码目录名 = 永远有漏网之鱼
就算你 Hook 对了层,如果还是用”黑名单”思路——列一个 {"Android", "Music", "Pictures", "DCIM", "Movies"} 的清单去拦截,那这清单就永远追不上系统的变化。今天加个 Podcasts,明天加个 Ringtones,后天又冒出个 Alarms,你永远改不完。
我的解法:从”名字”转向”位置”
所以我做了一个 LSPosed 模块,叫 BlockDirs,思路跟别人正好反过来:
不纠结目录叫什么名字,只看它在哪一层、在什么位置。
它的核心逻辑就一句话:凡是”外置存储卷根目录下的第一层目录”,一律拦住,不让它创建。 手机内部的 /storage/emulated 完全不受影响。
展开说,拦截判定的三个条件:
- 路径前缀是
/storage/、/mnt/media_rw/、/mnt/secure/这三者之一(外置卷的标准挂载点); - 且排除了
emulated(也就是手机自带存储); - 且这个目录名里,卷 ID 之后只有一层(即”根目录正下方那一层”)。
命中就返回”成功”,但实际上不创建。
这样带来的好处是:
- ✅ 零遗漏:不依赖目录名,系统爱加啥目录都拦得住,
Android、Music、Pictures、DCIM,随便它发明新的,通杀。 - ✅ 精准:只影响真正的可移动存储(OTG / SD 卡 / U 盘),手机内部文件不受一丁点影响。
- ✅ 不会误伤子目录:只拦第一层,U 盘里
Music/我的歌/xxx.mp3这种深层路径随便建,不管。 - ✅ 不会死循环:这是很多人担心的——“系统发现目录没了,反复创建怎么办”?答案是不会。因为
mkdir返回”成功”本身就是一个终止信号,系统收到”成功”就以为建好了,不会重试。只有返回”失败”才会反复重试,而我们是”假装成功”,正好卡在这个点上。
那 native 层怎么 Hook?
这才是真正的技术活。既然目录是 MediaProvider 用 native 代码调用 libc 的 mkdir/mkdirat 建的,那我就直接 Hook 这两个 native 符号。
用的是字节跳动的 ShadowHook(inline hook 库),精准钩住 libc.so 里的 mkdir 和 mkdirat,然后在回调里做上面的”位置判定 + 假装成功”。
这套方案我在自己的 ColorOS V16.1(基于 Android 16 / SDK 36) 手机上做了完整的端到端验证:插入 U 盘后,根目录一个文件夹都没新建,唯一的 Pictures 还是插盘之前的历史残留。亲测有效。
安装与使用
- 先确认你手机已 Root,并装好了 LSPosed(Zygisk 版);
- 下载文末的
app-release.apk并安装; - 打开 LSPosed,勾选 BlockDirs 模块(模块已经内置了作用域推荐,会自动帮你预选好 MediaProvider,不用手搜包名);
- 作用域确认勾上 系统框架 和 com.android.providers.media.module;
- 重启手机(或软重启,让 Zygote 注入生效);
- 插上 OTG U 盘 / SD 卡,世界清静了 ✌️。
小提示:如果你之前装过别的
no_otg_media_folders之类旧模块,建议先卸载,免得两台模块打架,干扰你验证效果。
下载地址 & 源码
- 🗂️ 项目仓库 / 源码 / Release APK:github.com/yixiangdebufengren/top.yixiangren.blockdirs
- 🧩 依赖的 Hook 库:ShadowHook(bytedance/android-inline-hook)
写在最后
这个问题的确很普遍——随便一搜就是一堆人抱怨 U 盘文件夹删不掉,但真正把它”从根上解决”的轮子却少得可怜。我做这个模块的初衷,就是被这个破事逼的:一个 U 盘,非要给我塞几个空文件夹,凭什么?
如果你也被这个”打地鼠”折磨过,不妨试试 BlockDirs。有用的话,去 GitHub 点个 Star 支持一下;遇到问题也欢迎提 Issue,我看到了会处理。
关键词回顾(方便你/别人搜到这篇):
OTG U盘自动创建文件夹、SD卡自动创建文件夹、安卓阻止自动创建目录、ColorOS 外置存储、Android 16、LSPosed 模块、Xposed 模块、MediaProvider、外置存储根目录、删除又自动生成文件夹




