未 Root Android 手机如何阻止 App 生成垃圾文件

2020-03-17 01:22:00 18点赞 44收藏 13评论

为什么,以及阻止哪些垃圾文件的生成

现在的手机基本都带有了垃圾清理功能,但是垃圾清理功能往往会连带着把缓存等内容一并清理,这样下次启动大部分App都要重新下载需缓存的内容,拖慢了下次启动的速度。因此,如果能从根源上组织垃圾文件的生成,比起频繁的进行垃圾清理,显然是更理想的选择。

接下来的问题就是,我们可以阻止哪些垃圾文件的生成?

阻止日志文件的生成

国内App厂商一直会有一些匪夷所思的举动,比如,腾讯新闻/腾讯新闻极速版,在对应的数据文件夹下(比如,手机内部存储根目录/Android/data/com.tencent.news/files),你可以看到下面这些文件夹

'log4log', 'netlog', 'online', 'online_patch', 'onlinelog', 'runtimelog', 'online4Ad', 'onlinelog4Ad', 'online4Channel', 'onlinelog4Channel', 'online4video', 'onlinelog4video', 'online4JsApi'

这些全部都是对用户毫无用处的日志文件夹,就算我每天只是开腾讯新闻app领个红包,腾讯新闻APP也能每天给我生成5MB以上的日志(反正开屏就给你下一堆广告,顺便生成一堆日志)。

此外,腾讯系 App (以及用了腾讯系组件的APP)很喜欢创建的日志文件夹:xlog,tbs_log,tbs_live_log 等等,也都是能每天给手机多添几十乃至几百MB日志文件的坑爹货。

阻止其它垃圾文件的生成

支付宝App的程序员似乎很喜欢直接在MAC下打包资源,然后这些资源包到了用户的手机存储后再解压,就有了一堆无用的 __MACOSX 文件夹。比如支付宝本地缓存的 Moji 包,总是伴随着一堆垃圾文件:

阿里系App非常喜欢“赠送”的垃圾文件阿里系App非常喜欢“赠送”的垃圾文件

于是,支付宝缓存有多少表情,就有多少个垃圾文件被生成……结果就是我们的手机可能每天都要被写入几百个乃至上千个毫无作用的垃圾文件。

又比如,淘宝之类的APP总喜欢在后台下载更新放到/cache/apkupdate文件夹,更烦人的是类似腾讯新闻极速版 这类每次都不知道更新了什么鬼、但是就是要做到每周至少更新一次的 APP。


组织垃圾文件生成的手段

对付这类行为,一个比较有效的手段,就是替换法:把文件夹替换成文件,这样 APP 就无法创建文件夹进而也无法产生文件(当然,App 既然有读写存储的权限,也是可以把文件删掉后再创建文件夹的,只是一般 App 还不会这么干);或者把文件替换成文件夹,这样APP就无法创建或者写入文件。如果有 Root,可以额外通过文件权限设置,彻底阻止非 Root APP 删除替换后的文件/文件夹。

另外,在Root的情况下,我们可以通过禁止 APP 的 Service,比如禁止日志相关 Service 或者后台下载 Service,来阻止垃圾文件的生成。不过这类方法不在本文的讨论范畴。


已有工具—DIR

给予上述原理的清理工作,DIR应该是比较有名的一款APP,做的事用一句话来概括,就是

根据给定的规则,用空文件替换同名文件夹,阻止APP创建同名文件夹,进而组织在该文件夹下的文件创建。

DIR清理界面DIR清理界面

DIR用起来很方便,但是对于用户来说,也有一些麻烦的地方

1. 某些APP可能直接创建特定的垃圾文件(比如日志文件),这时候需要用文件替换文件夹,DIR并未提供此功能

2. DIR只能使用官方预定义的规则,没法添加自定义规则


基于 ADB 和 Powershell 的脚本工具

为了弥补 DIR 的不足,我简单实现了一个基于 Powershell 的脚本工具,通过 ADB 进行 Android 系统上的文件操作,进而实现类似 DIR,但是更为灵活的清理/替换工具。

工具功能

  • 删除给定文件夹,并替换为空/非空文件

  • 删除给定文件,并替换为空/非空文件夹

工具实现

实现基于Powershell,主要是三个脚本文件:

  1. Config-AdbEnvironment.ps1,配置 ADB 环境并检测手机是否已连接

  2. Get-AndroidPackageNames.ps1,把 APP 名字映射为包名,例如,'alipay' 映射为'com.eg.android.AlipayGphone',减少代码冗余

  3. New-AndroidFakeItems.ps1,根据用户给定规则,将文件夹替换为文件,将文件替换为文件夹

这些脚本文件可以在 这里 下载到。

外部依赖仅需要本地有 ADB 。

下面简单介绍各个脚本的内容。

Config-AdbEnvironment.ps1

代码很简单,如下所示,基本就是使能 adb 命令,然后设置手机内部存储的根目录,最后启动 adb 并检查是否已连接到手机。

因此,需要修改的配置的是 $adbPath ,其应该指向 ADB 可执行文件所在文件夹。同时,应该确认一下 $internalStorageRootPath 的值 '/storage/emulated/0' ,在 ADB 下是否指向手机内部存储的根目录。

$Global:adbPath = 'C:ToolsAndroidPlatformTools'

# enable `adb` command
$Global:adbAppName = "$adbPathadb.exe"
$Global:ExecutionContext.SessionState.Applications.Add($adbAppName)
Set-Alias -Name adb -Value $adbAppName -Scope Global

# export android and adb environments
[String]$Global:internalStorageRootPath = '/storage/emulated/0'
[String]$Global:internalStorageAndroidDataPath = '/storage/emulated/0/Android/Data'
[String]$Global:externalMediaStorageRootPath = '/storage/emulated/1'
[Boolean]$Global:isDebug = $true

adb start-server
return (adb get-state) -eq 'device'

Get-AndroidPackageNames.ps1

几个手动写的 HashMap,维护 APP Name 到 Package Name 之间的映射。

New-AndroidFakeItems.ps1

该脚本定义替换文件或者文件夹的规则,以及执行替换操作的代码。

对于下面两个数组中的路径,会删除所对应的文件夹,然后创建空文件/非空文件

[String[]]$fakeFiles
[String[]]$fakeNonEmptyFiles

对于下面两个数组中的路径,会删除所对应的文件,然后创建空文件夹/非空文件夹(即包含一个非空文件)

[String[]]$fakeDirectories
[String[]]$fakeNonEmptyDirectories

比如,对于支付宝,其数据文件下的 "files/MobileAiX/log" 为日志文件夹,我们可以写下面的规则,首先获取 Alipay 的包名,然后添加该文件夹的路径到 $fakeFiles 数组中,让脚本删除该文件夹,并替换为一个空文件,以阻止支付宝后续生成日志文件。

# Alipay
$alipayPackageName = $appToPackageNameMap['alipay']
$fakeFiles += "$internalStorageAndroidDataPath/$alipayPackageName/files/MobileAiX/log"

这里当然可以直接指定路径,也就是把包名直接写入到字符串中,但是为了可读性和可维护性,建议还是把包名和文件夹路径分开。


脚本执行

执行脚本最简单的方法,就是修改 New-AndroidFakeItems.ps1 文件中定义的规则后,在该脚本上右键然后选择 "用Powershell运行",不过此时脚本执行完毕就会关闭,无法看清输出(实际创建了那些空文件和文件夹),此时可以在末尾添一行 Read-Host 。

也可以双击在 Powershell ISE 中打开该脚本,然后按 F5 执行脚本。

执行结果执行结果


总结

在非 Root 环境下,我们唯一能做的一点反抗,也许就是使用替换方式来阻止垃圾文件和文件夹的创建。本文简单介绍了我自己写的工具,各位可以试着作为 DIR 的补充工具使用。



展开 收起

任天堂 Nintendo Switch《舞力全开 Just Dance》 游戏兑换卡

任天堂 Nintendo Switch《舞力全开 Just Dance》 游戏兑换卡

279元起

《Picsew》iOS数字版软件

《Picsew》iOS数字版软件

暂无报价

Endel 白噪声音频 手机软件

Endel 白噪声音频 手机软件

暂无报价

《kirakira+》 iOS软件

《kirakira+》 iOS软件

暂无报价

《国家地理 每日精选》iOS数字版软件

《国家地理 每日精选》iOS数字版软件

暂无报价

《扫描全能王付费版》iOS数字版软件

《扫描全能王付费版》iOS数字版软件

暂无报价

《Notability》限时折扣 22元/年

《Notability》限时折扣 22元/年

暂无报价

《记账·圈子账本(专业版)》iOS数字版中文软件

《记账·圈子账本(专业版)》iOS数字版中文软件

暂无报价

《航旅纵横PRO》iOS数字版应用

《航旅纵横PRO》iOS数字版应用

暂无报价

《3D绳结》iOS 生活技能类App

《3D绳结》iOS 生活技能类App

暂无报价

《鲨鱼记账本Pro》iOS软件

《鲨鱼记账本Pro》iOS软件

暂无报价

《彩云天气Pro》iOS数字版软件

《彩云天气Pro》iOS数字版软件

暂无报价

《APlayer》iOS视频播放类App

《APlayer》iOS视频播放类App

暂无报价

《CAR++》iOS模拟车辆改装App

《CAR++》iOS模拟车辆改装App

暂无报价

《Nice Notch》iOS壁纸App

《Nice Notch》iOS壁纸App

暂无报价

Ablo 即时通讯手机软件

Ablo 即时通讯手机软件

暂无报价
13评论

  • 精彩
  • 最新
  • 请教:华为手机,64G的emmc用到只剩下2g,但是在文件管理器下只能看到17g文件。也就是除去系统有30多g不知道去哪了。有没有不重置恢复容量的办法。安卓9.0,未root

    校验提示文案

    提交
    有可能是隐藏文件占用空间,也就是所有.开头的文件默认不会显示在文件管理器里,这个一般可以在设置里设为显示。另外就是系统文件和应用的私有文件,文件管理器也是看不到的,比如你查看app详情时,显示的app数据文件等,这部分可能很大,例如微信可能会占十几个g。最后就是系统缓存可能也会占用几个g。

    校验提示文案

    提交
    最好的方式就是重装系统

    校验提示文案

    提交
    还有3条回复
    收起所有回复
  • 啥时候讲下Root Android 手机如何阻止 App 生成垃圾文件,我root也只是把系统app给X了

    校验提示文案

    提交
    首先可以用MyAndroidTools之类的工具禁用App的某些服务,比如推送服务、App更新服务、Log服务等;其次是绿色守护可以按规则禁止应用在后台的运行,这样可以防止腾讯新闻之类的App在后台运行并且不断地更新数据。

    校验提示文案

    提交
    收起所有回复
  • 不错,打赏了 [赞一个]

    校验提示文案

    提交
  • 写得真好呀

    校验提示文案

    提交
  • 这个软件在谷歌商店争议不小

    校验提示文案

    提交
    为啥,我觉得还挺好用

    校验提示文案

    提交
    收起所有回复
  • 写得很好,就是看不懂

    校验提示文案

    提交
提示信息

取消
确认
评论举报

相关好价推荐
查看更多好价

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
44
扫一下,分享更方便,购买更轻松