Documentation Index
Fetch the complete documentation index at: https://oom-wg.dev/llms.txt
Use this file to discover all available pages before exploring further.
此文案并非以文章为目的而编写
前言
众所周知或不周知,Android 的存储空间长期以来都处于非常开放的状态。为什么呢?以前没考虑到的到后面都成了技术债。 众所又周知或不周知,Android 本身会依据软件设置的目标 SDK 版本进行一定的兼容运行,这种设计在某些方面很好,但是也会导致技术债越来越多。 这就导致了存储空间的开放性难以克制,只能在 Android 的长期更新中逐渐填上这个大坑。 直到 Android 13 这个大坑才算是填满了,Android 13 废弃了长期以来使用的存储空间读写权限,改成了媒体文件的读写权限,虽然 Android 10 开始就有了分区存储这一特性,不过远远不如 Android 13 这次变更来得彻底。 由于部分系统特性以及存储空间的“奔放性”,在大部分人的设备上存储空间成了各类软件的垃圾场。 有些可能为了方便自家应用联动而把文件塞进存储空间,有些可能为了方便用户在外部调用而塞了进去,有些甚至可能只是单纯不想放在私有目录。 反正因为各种千奇百怪的原因,Android 系统的技术债与软件的技术债日积月累,让存储空间成为了各类软件寄居处之一,使得存储空间变得目录、文件繁多,各种无用文件永远躺在某一个小角落,在用户的使用过程中静悄悄地蚕食剩余的存储空间。 归根结底就是因为 Android 没有在一开始就用铁腕手段来好好“调教”各路开发者。 怎么办呢怎么办呢?Android 没有“调教”好开发者,总不能自己“调教”好自己直接自适应吧? 当然不用,面对各路“神仙”给用户留下的难题,当然要“以 Android 制 Android”。 虽然 Android 有分区存储还废弃了存储空间读写权限,但它并没有只给了个媒体文件读写权限就当“甩手掌柜”了,还给了个更“名正言顺”的权限:管理存储空间权限。 顾名思义,有了这个权限就能照样正常读写存储空间啦。依此就可以开启“以 Android 制 Android”的计划。 当然,也有更好的选择,比如说调试权限,不过自 Android 11 起就被限制读取软件私有目录了,所以在低于 Android 11 的系统还是比较好用的。 话虽如此,最好用的还是当属超级用户权限了,可以更方便、更彻底地管理存储空间。想要更全面地管理存储空间,超级用户权限是别无他选的。 有了权限,该怎么样把它发挥出来呢?用什么工具呢?当然要使用“回忆溢出工作组”所写的招牌软件“苏柚”了。 所谓“苏柚”,英文全名“Super User Utils”,翻译成中文就是“超级用户工具”,简写为“SUU”,中文名就自然而然成了“苏柚”了,不过虽以“超级用户”名义,但实际上用 Android 通用权限也可正常使用,只不过结果自然是无法全面管理存储空间了。由于开发规划,SSU 与 SUU 实行同源计划,SUU 因此更名为 ShiroSU Utils, 但其简写仍为 SUU 而非 SSUU(当然想这么叫也可以)
具体实现
苏柚具体以三个部分来解决存储方面的各个难题的: 整理、清理、重定向整理
顾名思义,将各类文件整理分类。 具体实现是配置多个路径组作为监听对象,可以以后缀或文件名称作为分类依据,分类进对应的类别文件夹,同时也可以以文件来源、修改时间为依据进行多次分类。 值得一提的是,整理方案采取了 Linux 的内核特性inotify,它可以监听到文件系统上的各个操作事件,苏柚便以它的文件关闭事件、文件移动事件监听实现了高效、即时的监听,以便于更及时更准确地整理文件。
但由于是简单的文件移动,整理后文件就不在原来的位置了,但是有时候文件仍然需要给软件使用,这种情况下就有点“既要还要”了,所以重定向部分弥补了这点。
清理
同样是顾名思义,清理冗余文件。 可以清理缓存文件、隐藏文件或是垃圾文件等,采取的方案是定时循环递归查找存储空间内的文件或目录。可以清理软件缓存,前提是权限足够。 按“人之常情”来讲,以点开头的路径被称为隐藏路径,在通常的 Linux 系统上常被用于放置程序自己的配置文件等内容,但在 Android 这一移动端系统上却常常是以缓存或垃圾文件的形式存在。 “垃圾文件”这一名称,实际上定义并不准确,它的实际范围是比较广泛的,有可能是软件不会清理的缓存文件,也有可能是一些软件在版本更新中遗留的无用文件,或是单纯无用途的摆设文件。总之,在 Android 这一大“公交”上,垃圾文件是普遍存在的。 但是在 Android 有一个较为特殊的隐藏文件,它的名称是“.nomedia”,字面上来看就是“无媒体”,有这个隐藏文件的目录中的音视频等文件往往不会被相册等软件所展示,它存在的目的就是告诉其他软件“不该看的别来看”,所以苏柚不会清理这个有特殊用途的隐藏文件。
其他的有特殊用途的隐藏文件比如说“.database_uuid”,用于定义当前目录的 UUID,不过这个的特殊性倒是没那么强,还有隐藏目录“.thumbnails”用于存放当前目录的缩略图。
这种约定俗成或是说“人之常情”的有特殊用途的隐藏目录也是有一些的。所以苏柚也会尽可能比较合理地清理掉一些隐藏文件,然后也会解决掉垃圾文件以释放空间。虽然很多时候清理掉的文件大小并不大,但积少成多嘛,“蚊子腿再小也是肉”,总不能留着这些文件“过年”吧?再提一些,苏柚也能清理掉空目录、空文件什么的,但是有些时候并不是很安全,也许软件正在用这个目录或文件呢?或者软件拿它作为特殊标识?但总归是能让存储空间干净整洁一点点的,那就恳请酌情考虑了吧?
重定向
依旧采取顾名思义的方法来看,就是将一个路径重定向到另一个路径。 重定向采取了 Linux 内核中的mount 特性,但是普通用户权限以及调试权限均不可使用 mount,所以在这方面是有一定局限性的。
不过重定向的优势有不少,因为不是简单的移动或复制文件,不会存在软件不能再使用原本文件或者两份文件占两份空间的情况。
而且苏柚的重定向比常见的重定向多了一个特别之处,苏柚的重定向实现了通过 Zygisk 使得可以在软件启动的时候修改其命名空间以挂载特定的重定向规则。
命名空间是 Linux 里一个比较复杂的概念,简单来讲,一个进程可以和其他进程一起共用同一个命名空间也就是全局命名空间,通过修改全局命名空间就可以实现所有软件都生效的重定向规则,这就是大部分重定向模块所实现的。
但是,一个进程也可以有私有的命名空间,在这个私有的命名空间所进行的修改不会影响到其他命名空间,包括全局命名空间。
所以就可以依此玩一些花操作,可以让一个路径在指定软件的命名空间里是一个路径,在另一些指定软件的命名空间里是另外一个路径。针对私有命名空间的修改可以让重定向的玩法上限更高,也能实现更优雅地挂载,只让重定向规则生效于需要重定向的软件。并且呢,虽然重定向使用到了 Zygisk,但只是修改了命名空间,没有任何注入行为。所以在使用过程中也不必担心会被软件检测到,请放心“食用”吧!
