夜雨聆风学习资料网

ARTICLE · 1312972

一个电视 App 占了 400M, 拆开发现它在替别人打工

一个电视 App 占了 400M, 拆开发现它在替别人打工

一个电视 App 占了 400M,
拆开发现它在替别人打工

Android TV · root · chattr +i · 附一键脚本

给盒子清理存储的时候,发现一个很扎眼的数字:一个叫「xingheTV」的影视 App,总共占了 412MB。

拆开看构成:安装包 68MB,外部缓存 42MB,剩下 302MB 全在一个叫 app_plugins 的目录里。

一个看片软件,插件目录比它自己还大四倍。这里面装的是什么?

一、先别急着删,先看清楚它在干什么

第一反应是"安装包里塞了挖矿代码"。于是把 APK 解开,927 个文件,逐个查了一遍。

结论有点意外:APK 本身是干净的,一个挖矿组件都没有。

那 302MB 是从哪来的?继续往下查,在插件目录里找到了两个大块头:

miner.plugin-btvdp.ipk
 —— 59MB,名字里就写着 miner;
wxedge_storage/ —— 80MB,某心云的 PCDN 存储目录。

某心云是某雷系的边缘计算产品,玩法是:把你的上行带宽和存储空间租出去,给别人做 CDN 加速,你拿一点点积分。放在手机、NAS 上,用户是知情的;但一个电视 App 在后台悄悄开这个东西,性质就不一样了。

也正因为 APK 里干净,说明这些组件是运行时联网下载的。这一点很关键,它直接决定了处理方式:

改 APK 没有意义。你改得再干净,它跑起来第一件事还是去下载。

二、为什么「删掉」不够

第一次处理很简单:停掉进程,把 app_plugins/2/bin 和 app_plugins/cacheDirectory9 整个删掉,外部缓存清空。302MB 掉到 44MB,一次性回收差不多 300MB。

然后打开 App 看了十分钟,播放正常,以为完事了。

第二天再看,目录又长回来了。

原因不难猜:App 每次启动都会检查插件完整性,缺了就重新下。这是它的正常业务逻辑,你删一次,它下一次。所以真正要解决的不是"删掉",而是"让它下不进来"。

三、从「删除」到「锁死」

常规想法是改权限,chmod 000 不让写。但对这个场景没用——App 对自己的私有目录有写权限,它可以先 rm -rf 把整个目录删掉,再重建一个权限正常的。删目录这个动作,chmod 拦不住。

真正管用的是文件系统层的不可变属性:

toybox chattr +i /data/data/org.xinghe.tv/app_plugins/2/bin

+i(immutable)加上之后,这个目录连同里面的东西:不能写、不能删、不能改名、不能改权限,连 root 都动不了。实测验证过:加锁之后用 root 往里写文件,直接 Permission denied。

具体做法是把目标目录清空、重建为空目录,再加锁——App 看到目录还在(不会报错重建),但往里写就失败:

rm -rf "$d" && mkdir -p "$d" && toybox chattr +i "$d"

处理完三个目录,App 再启动,插件下不下来,但播放、选集、投屏全都正常——因为留着的那部分才是它真正干活的组件。顺带说一句:目录里还有 2.tgz、3M02Hardened.jar 这类正常播放插件,别一起清了,清了会真的播不了。

四、脚本

手动敲一遍命令容易漏,所以写成了两个脚本:一个在电脑上跑,一个在盒子上跑。

xinghe_clean.bat —— 放在 Windows 上双击,自动连盒子、检查 root、推送并执行:

@echo off rem ============================================================ rem  xingheTV 去挖矿/PCDN 一键清理  (需设备已root且ADB可用) rem  用法1: xinghe_clean.bat 192.168.88.31:5555 rem  用法2: 双击运行, 按提示输入盒子IP (盒子上 adb over WiFi 已开) rem ============================================================ setlocal enabledelayedexpansion chcp 65001 >nul  set ADB=%~dp0platform-tools\adb.exe if not exist "%ADB%" set ADB=adb  if "%~1"=="" (     set /p TARGET=请输入盒子地址[IP:5555,回车默认192.168.88.31:5555]:     if "!TARGET!"=="" set TARGET=192.168.88.31:5555 ) else (     set TARGET=%~1 )  echo. echo [*] 连接 %TARGET% ... "%ADB%" connect %TARGET% "%ADB%" -s %TARGET% shell echo ok >nul 2>&1 if errorlevel 1 (     echo [FAIL] 连不上 %TARGET%,确认: 1)盒子与电脑同一网络 2)ADB已开 3)IP正确     pause & exit /b 1 )  echo [*] 检查root... "%ADB%" -s %TARGET% shell "su 0 id" | findstr /i "uid=0" >nul if errorlevel 1 (     echo [FAIL] 设备没有root权限,无法执行     pause & exit /b 1 )  echo [*] 推送清理脚本... "%ADB%" -s %TARGET% push "%~dp0xinghe_clean.sh" /data/local/tmp/xinghe_clean.sh >nul  echo [*] 执行清理... echo. "%ADB%" -s %TARGET% shell "su 0 sh /data/local/tmp/xinghe_clean.sh" echo. echo [*] 完成。请在盒子上打开xingheTV验证播放。 echo     如需恢复原状: "%ADB%" -s %TARGET% shell "su 0 sh /data/local/tmp/xinghe_clean.sh revert" pause

xinghe_clean.sh —— 真正干活的,自动找包名、清目录、上锁,也支持 revert 回滚:

#!/system/bin/sh # xinghe_clean.sh - 清除xingheTV的挖矿插件与PCDN存储,并锁定目录防再生 # 用法(在设备上): su 0 sh /data/local/tmp/xinghe_clean.sh # 回滚: su 0 sh /data/local/tmp/xinghe_clean.sh revert  PKG=$(pm list packages 2>/dev/null | grep -i "xinghe" | head -1 | sed 's/^package://') if [ -z "$PKG" ]; then     echo "[FAIL] 未找到星河TV包名(packages里没有xinghe)"     exit 1 fi echo "[OK] 包名: $PKG"  P=/data/data/$PKG/app_plugins  if [ "$1" = "revert" ]; then     for d in $P/*/bin $P/cacheDirectory* /storage/emulated/0/Android/data/$PKG/cache /data/media/0/Android/data/$PKG/cache; do         [ -d "$d" ] && toybox chattr -i "$d" 2>/dev/null     done     echo "[OK] 已解锁,App重启后插件可重新下载"     exit 0 fi  # 1. 停App am force-stop $PKG 2>/dev/null sleep 1 echo "[OK] 已停止 $PKG"  if [ ! -d "$P" ]; then     echo "[FAIL] 插件目录不存在: $P (可能从未运行过,先打开一次App再执行)"     exit 1 fi  # 2. 删除前记录大小 BEFORE=$(du -sk $P 2>/dev/null | awk '{print $1}')  # 3. 删挖矿/PCDN目录,重建空目录后锁死 LOCKED=0 for d in $P/*/bin $P/cacheDirectory*; do     [ -d "$d" ] || continue     rm -rf "$d"     mkdir -p "$d"     if toybox chattr +i "$d" 2>/dev/null; then         echo "[LOCK] $d"         LOCKED=$((LOCKED+1))     else         echo "[WARN] 本机不支持chattr, 无法锁定: $d (会被App重新下载)"     fi done  # 4. 外部播放缓存: 清空并锁目录 for base in /storage/emulated/0/Android/data /data/media/0/Android/data; do     C=$base/$PKG/cache     if [ -d "$C" ]; then         rm -rf "$C"/* 2>/dev/null         toybox chattr +i "$C" 2>/dev/null && echo "[LOCK] $C"     fi done  # 5. 顺带清理同类的 wxedge 残留(如在其他路径) find /data/media/0/Android -maxdepth 4 -name "wxedge_storage" -type d 2>/dev/null | while read w; do     echo "[FOUND] 外部wxedge残留: $w (如需删除请手动 rm -rf)" done  sync AFTER=$(du -sk $P 2>/dev/null | awk '{print $1}') echo "==========================================" echo "app_plugins: ${BEFORE}KB -> ${AFTER}KB (释放约 $(( (BEFORE-AFTER)/1024 ))MB)" echo "锁定目录数: $LOCKED" echo "[DONE] 完成。打开App验证播放是否正常。"

脚本里有几处是踩坑后加的:

· 包名不写死,用 pm list packages | grep xinghe 现查,换版本也不怕;

· 清之前先 du 记一次大小,结束时打印"释放了多少",不然你没法确认它到底干了什么;

· chattr 失败只警告不中断——有些老盒子文件系统不支持;

· 内外部两个路径都清(/storage/emulated/0 和 /data/media/0 指向同一个地方,但不同机型挂载方式不一样)。

五、效果和退路

清理前后:

app_plugins: 302MB -> 44MB 外部缓存:     42MB -> 0 App 总占用:  412MB -> 112MB(安装包 68MB + 插件 44MB)

盒子 /data 的占用从 2.2G 降到 1.9G 左右。跑了一天多,播放、选集、清晰度切换全部正常,也没有出现"插件加载失败"的弹窗。

但如果你的机器上偏偏出问题了,一条命令退回原状:

su 0 sh /data/local/tmp/xinghe_clean.sh revert

revert 做的事就是把 chattr +i 去掉,App 重启后自己会把插件下回来。这是这套方案里唯一必须记住的一条命令。

六、这套方法能套在别的 App 上吗

能,而且不止电视 App。判断标准很简单,三个特征凑齐就值得查一查:

· 私有目录里有一个体积异常的子目录(占 App 总大小的 60% 以上);

· 目录名里带 plugin、miner、storage、edge 这类词;

· 删掉之后过一段时间自己长回来。

第三条是核心。会长回来,说明它在主动下载;主动下载的东西,才是真正要处理的。对应到别的 App,改一行就行:

提醒一:别一次全删。先把最大的那个移走(mv 到别处而不是 rm),跑一天,确认 App 还能正常用,再决定删不删。这次留下 2.tgz 和 3M02Hardened.jar 就是这么判断出来的。

提醒二:chattr 是有代价的。上了锁的目录,App 升级、重装、甚至卸载都可能失败(卸载时删不掉不可变目录)。真遇到卸不掉的情况,先 revert 再操作。

写在最后

我并不过敏于"挖矿"这两个字。PCDN 本身是个正经生意,问题不在技术,在知情权。

一个电视 App,用你的上行带宽、占你的存储,在你完全不知道的情况下——这不是技术问题,是把你当成了免费资源。

而且这类东西有个共同特点:它不会让你立刻察觉。播放照常,界面照常,只是盒子越来越热、网越来越卡、存储越来越少。等你发现的时候,它已经在你家跑了大半年。

所以这篇的重点其实不是"怎么删",而是"去看一眼"。如果你家也有用了两三年、总提示存储不足的电视盒子,不妨打开 ADB,敲一句:

du -sh /data/data/*/ 2>/dev/null | sort -rh | head -10

排在最前面的那一个,进去看看它的子目录。大概率会有惊喜。

注:脚本涉及 root 权限与文件系统属性修改,操作前请确认设备可回滚;不同机型、不同 App 版本目录结构不同,请先 mv 备份再删,不要直接照搬路径。

回首页,搜索你想要的文档

在首页搜索框输入关键词,快速定位资料

文库首页搜索指引 立即搜索

相关学习资料