插上 U 盘就自动冒出 Android、Music、Pictures 文件夹?一个 LSPosed 模块彻底解决

先说结论:如果你也有”手机一插 OTG U 盘 / SD 卡,根目录就自动多出一堆 AndroidMusicPicturesDCIMMovies 文件夹,删了下次还冒出来”的毛病,这篇文章能帮你根治。

我先把这个痛点的”前世今生”讲清楚,再给你一个真正管用的东西。文末有下载链接,赶时间可以直接滑到底。


这破事有多烦人,懂的都懂

想象一下这个场景:

你高高兴兴插上一个 U 盘,想把它当个干净的移动硬盘用。结果一插上去,系统”贴心”地给你建好了一堆空文件夹,整整齐齐排在那里——AndroidMusicPicturesDCIMMovies……

你一脸嫌弃,手动删掉。拔了 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 完全不受影响。

展开说,拦截判定的三个条件:

  1. 路径前缀是 /storage//mnt/media_rw//mnt/secure/ 这三者之一(外置卷的标准挂载点);
  2. 且排除了 emulated(也就是手机自带存储);
  3. 且这个目录名里,卷 ID 之后只有一层(即”根目录正下方那一层”)。

命中就返回”成功”,但实际上不创建

这样带来的好处是:

  • 零遗漏:不依赖目录名,系统爱加啥目录都拦得住,AndroidMusicPicturesDCIM,随便它发明新的,通杀。
  • 精准:只影响真正的可移动存储(OTG / SD 卡 / U 盘),手机内部文件不受一丁点影响。
  • 不会误伤子目录:只拦第一层,U 盘里 Music/我的歌/xxx.mp3 这种深层路径随便建,不管。
  • 不会死循环:这是很多人担心的——“系统发现目录没了,反复创建怎么办”?答案是不会。因为 mkdir 返回”成功”本身就是一个终止信号,系统收到”成功”就以为建好了,不会重试。只有返回”失败”才会反复重试,而我们是”假装成功”,正好卡在这个点上。

那 native 层怎么 Hook?

这才是真正的技术活。既然目录是 MediaProvider 用 native 代码调用 libc 的 mkdir/mkdirat 建的,那我就直接 Hook 这两个 native 符号

用的是字节跳动的 ShadowHook(inline hook 库),精准钩住 libc.so 里的 mkdirmkdirat,然后在回调里做上面的”位置判定 + 假装成功”。

这套方案我在自己的 ColorOS V16.1(基于 Android 16 / SDK 36) 手机上做了完整的端到端验证:插入 U 盘后,根目录一个文件夹都没新建,唯一的 Pictures 还是插盘之前的历史残留。亲测有效。


安装与使用

  1. 先确认你手机已 Root,并装好了 LSPosed(Zygisk 版);
  2. 下载文末的 app-release.apk 并安装;
  3. 打开 LSPosed,勾选 BlockDirs 模块(模块已经内置了作用域推荐,会自动帮你预选好 MediaProvider,不用手搜包名);
  4. 作用域确认勾上 系统框架com.android.providers.media.module
  5. 重启手机(或软重启,让 Zygote 注入生效);
  6. 插上 OTG U 盘 / SD 卡,世界清静了 ✌️。

小提示:如果你之前装过别的 no_otg_media_folders 之类旧模块,建议先卸载,免得两台模块打架,干扰你验证效果。


下载地址 & 源码


写在最后

这个问题的确很普遍——随便一搜就是一堆人抱怨 U 盘文件夹删不掉,但真正把它”从根上解决”的轮子却少得可怜。我做这个模块的初衷,就是被这个破事逼的:一个 U 盘,非要给我塞几个空文件夹,凭什么?

如果你也被这个”打地鼠”折磨过,不妨试试 BlockDirs。有用的话,去 GitHub 点个 Star 支持一下;遇到问题也欢迎提 Issue,我看到了会处理。

https://yixiangren.top


关键词回顾(方便你/别人搜到这篇):
OTG U盘自动创建文件夹、SD卡自动创建文件夹、安卓阻止自动创建目录、ColorOS 外置存储、Android 16、LSPosed 模块、Xposed 模块、MediaProvider、外置存储根目录、删除又自动生成文件夹