新人下载app,立即提现现金 您的好友 送你现金 去提现

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

zyffreedom2 03-17 01:22 关注

小编注:此篇文章来自#原创新人#活动,成功参与活动将获得额外50金币奖励。

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

现在的手机基本都带有了垃圾清理功能,但是垃圾清理功能往往会连带着把缓存等内容一并清理,这样下次启动大部分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 的补充工具使用。



展开阅读全文

查看更多好文内容,新用户限时领现金
全部评论 (12)
zyffreedom2
0
04-25 21:16
supergogod: 啥时候讲下Root Android 手机如何阻止 App 生成垃圾文件,我root也只是把系统app给X了 1

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

supergogod
0
04-24 08:36

啥时候讲下Root Android 手机如何阻止 App 生成垃圾文件,我root也只是把系统app给X了

zyffreedom2
0
03-17 14:08
Who_Am_I: 有办法得到一个汇总吗?这样我知道哪些该删掉 1

App的数据文件可以分为两部分,一部分是私有的用户数据,这部分不 Root 无法访问,你可以在 设置-所有应用 或类似的选单中看到应用私有数据占据的空间,可以备份以后清空应用数据腾空间。至于App放在手机内部存储目录下的东西,除了 Android/data 下的内容是按包名分隔的,其它是完全没有规则的,最多就是看名字猜,比如tencent开头的是腾讯系的,毕竟App有存储权限就可以任意添加和删除存储目录下的内容,可以装个 ES文件浏览器,看一下各个目录实际占用的大小。

Who_Am_I
0
03-17 13:41

有办法得到一个汇总吗?这样我知道哪些该删掉

tbtdt
0
03-17 11:39

写得很好,就是看不懂

Frankxingu
0
03-17 10:49
yalong1983: 这个软件在谷歌商店争议不小 1

为啥,我觉得还挺好用

神使者66
0
03-17 10:31
Who_Am_I: 请教:华为手机,64G的emmc用到只剩下2g,但是在文件管理器下只能看到17g文件。也就是除去系统有30多g不知道去哪了。有没有不重置恢复容量的办法。安卓9.0,未root 1

最好的方式就是重装系统

yalong1983
0
03-17 10:27

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

今天的平民窟
0
03-17 10:16

写得真好呀

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

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

打开App,查看更多好文和评论
猜你喜欢
查看更多
相关好价
相关商品
查看更多热门商品
社区主页 文章详情
13
45
12
你已经点过赞了
新浪微博 QQ空间 微信好友 豆瓣
当前为触屏版
热门搜索