前言
众所周知或不周知,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通用权限也可正常使用,只不过结果自然是无法全面管理存储空间了。
苏柚具体以三个部分来解决存储方面的各个难题的:整理、清理、重定向。
整理,顾名思义,将各类文件整理分类。具体实现是配置多个路径组作为监听对象,可以以后缀或文件名称作为分类依据,分类进对应的类别文件夹,同时也可以以文件来源、修改时间为依据进行多次分类。值得一提的是,整理方案采取了Linux的内核特性inotify,它可以监听到文件系统上的各个操作事件,苏柚便以它的文件关闭事件、文件移动事件监听实现了高效、即时的监听,以便于更及时更准确地整理文件。但由于是简单的文件移动,整理后文件就不在原来的位置了,但是有时候文件仍然需要给软件使用,这种情况下就有点“既要还要”了,所以重定向部分弥补了这点。
清理,同样是顾名思义,清理冗余文件。可以清理缓存文件、隐藏文件或是垃圾文件等,采取的方案是定时循环递归查找存储空间内的文件或目录。可以清理软件缓存,前提是权限足够。按“人之常情”来讲,以点开头的路径被称为隐藏路径,在通常的Linux系统上常被用于放置程序自己的配置文件等内容,但在Android这一移动端系统上却常常是以缓存或垃圾文件的形式存在。“垃圾文件”这一名称,实际上定义并不准确,它的实际范围是比较广泛的,有可能是软件不会清理的缓存文件,也有可能是一些软件在版本更新中遗留的无用文件,或是单纯无用途的摆设文件。总之,在Android这一大“公交”上,垃圾文件是普遍存在的,但是在Android有一个较为特殊隐藏文件,它的名称是“.nomedia”,字面上来看就是“无媒体”,有这个隐藏文件的目录中的音视频等文件往往不会被相册等软件所展示,它存在的目的就是告诉其他软件“不该看的别来看”,所以苏柚不会清理这个有特殊用途的隐藏文件。其他的有特殊用途的隐藏文件比如说“.database_uuid”,用于定义当前目录的UUID,不过这个的特殊性倒是没那么强,还有隐藏目录“.thumbnails”用于存放当前目录的缩略图。这种约定俗成或是说“人之常情”的有特殊用途的隐藏目录也是有一些的。所以苏柚也会尽可能比较合理地清理掉一些隐藏文件,然后也会解决掉垃圾文件以释放空间。虽然很多时候清理掉的文件大小并不大,但积少成多嘛,“蚊子腿再小也是肉”,总不能留着这些文件“过年”吧?再提一些,苏柚也能清理掉空目录、空文件什么的,但是有些时候并不是很安全,也许软件正在用这个目录或文件呢?或者软件拿它作为特殊标识?但总归是能让存储空间干净整洁一点点的,那就恳请酌情考虑了吧?
重定向,依旧采取顾名思义的方法来看,就是将一个路径重定向到另一个路径。重定向采取了Linux内核中的mount特性,但是普通用户权限以及调试权限均不可使用mount,所以在这方面是有一定局限性的。不过重定向的优势有不少,因为不是简单的移动或复制文件,不会存在软件不能再使用原本文件或者两份文件占两份空间的情况。而且苏柚的重定向比常见的重定向多了一个特别之处,苏柚的重定向实现了通过Zygisk使得可以在软件启动的时候修改其命名空间以挂载特定的重定向规则。命名空间是Linux里一个比较复杂的概念,简单来讲,一个进程可以和其他进程一起共用同一个命名空间也就是全局命名空间,通过修改全局命名空间就可以实现所有软件都生效的重定向规则,这就是大部分重定向模块所实现的。但是,一个进程也可以有私有的命名空间,在这个私有的命名空间所进行的修改不会影响到其他命名空间,包括全局命名空间。所以就可以依此玩一些花操作,可以让一个路径在指定软件的命名空间里是一个路径,在另一些指定软件的命名空间里是另外一个路径。针对私有命名空间的修改可以让重定向的玩法上限更高,也能实现更优雅地挂载,只让重定向规则生效于需要重定向的软件。并且呢,虽然重定向使用到了Zygisk,但只是修改了命名空间,没有任何注入行为。所以在使用过程中也不必担心会被软件检测到,请放心“食用”吧!
结语
不论说轻松点,说复杂点,总归来说,苏柚能做到的,只能是缓解这一现状,终究是无法根治的。因为Android的混乱局面以前没法解决,现在虽然稍有缓解,但以后也不会解决。在大家实际接触到的Android中,主要受谷歌、设备厂商以及软件厂商所影响,有时也会受国内环境、政策所影响。谷歌在Android中推出的某些新功能设备厂商不一定跟进,设备厂商自己弄出来的新特性其他厂商也不一定有,这就已经造成了极其混乱的局面了。软件厂商为适配各家系统往往要付出更多精力,有时还不一定能完美适配,导致错误频出。更不用说一个大厂所推出的一个大型软件往往是由多个团队共同编写的,个人与个人之间、团队与团队之间的协作往往并不如意,这种情况也在谷歌、设备厂商的环节中有所体现。莫名其妙的系统设计,再加上稀烂的运营团队,往往让用户饱受磨难。虽然这并不是造成存储空间混乱的根本原因,但Android的混乱局面也使得存储空间这一看似好优化的点变得难以优化,让许多很好修复的小问题变得根深蒂固,在设备里“买房”,让众多小细节、小功能永远都是那么难用。这一难以调和的混乱局面是受大环境所影响的,Android不像iOS一家独大,在iOS上往往能更方便地适配系统,几乎不必为兼容性而担心。但Android属于是大小厂众多厂商竞争,谷歌在Android大版本所做出的各种破坏性变动以及各家厂商所客制化的内容都会使得“Android非Android”。特殊的系统、特殊的硬件都会使得软件兼容性大打折扣,让软件的正常运行变得“自求多福”,这就是因环境而导致的结果。但实际上,一个不够优秀的软硬件厂商,就算是实现了一家独大也是无济于事,只有真正的“六边形战士”才能在国内乃至全球中站稳脚跟。所以,就目前而言,大家只能忍气受累了。