报告口径本页直接渲染本地报告真源;静态能力、动态观察、推断和线上未验证项不得互相替代。
Clean Sweep Master v1.2.0 保活恢复、通知召回与产品族群逆向报告#
包名:
com.cleansweepmaster.clsm
样本:Google Play 当前安装包,versionName 1.2.0,versionCode 1200
测试设备:Pixel 6a,Android 16 / API 36
报告日期:2026-08-31
范围:保活与恢复、通知召回、产品族群;不展开清理功能页面。
1. 一页结论#
- [静态 + 动态确认] 正常打开后确实运行常驻前台服务。
CoreTaskExecutor为dataSyncFGS,通知 ID3、渠道resident,返回START_STICKY;本机启动后 PID27015,服务为isForeground=true。 - [静态确认] 它使用三层周期机会,但职责并不相同。 Job ID
100约每 30 秒执行并续排自己;WorkManager 唯一任务WorkerServiceUnique使用系统最低的 15 分钟周期;START_STICKY负责系统回收后的服务重建请求。 - [重要边界] 30 秒 Job 本身没有直接启动主 FGS。
StreamlinedJobScheduler的已还原逻辑主要是续排 Job;不能把“Job 每 30 秒运行”写成“每 30 秒一定拉活服务”。 - [静态确认] Manifest 中的
SolarMonitor看似监听开机、亮屏、灭屏和解锁,但它继承的onReceive()在当前 DEX 中为空。 开机时进程仍会因广播被创建,随后Application.onCreate()尝试启动 FGS;这和接收器自身完成拉活不是一回事。 - [动态确认] 本次 Android 16 重启后没有建立成功的 FGS。 系统确实为
SolarMonitor创建进程,但日志明确记录startForegroundService() not allowed;最终CoreTaskExecutor的 ServiceRecord 为app=null、startForegroundCount=0,不能写成“开机恢复成功”。 - [动态确认] Force Stop 是硬边界。 单独强停后 1 秒和 16 秒均无 PID,包为
stopped=true。 - [静态确认] 通知召回由 Remote Config 控制。 覆盖安装/卸载、充电开始/结束/低电量和 FCM;配置模型包含总开关、活动弹窗开关、功能/应用/充电日上限,以及首条/第 2 条/第 3 条间隔。
- [族群结论] 当前没有证据把它归入另外五个白标样本的同一技术底座。 它的组件名、业务代码、通知配置模型、签名和恢复链均不同,应作为独立技术族处理。
2. 样本身份与边界#
| 项目 | 值 |
|---|---|
| 应用名 | Clean Sweep Master |
| applicationId | com.cleansweepmaster.clsm |
| 版本 | 1.2.0(versionCode 1200) |
| minSdk / targetSdk | 24 / 35 |
| base APK 大小 | 35,875,794 bytes |
| base APK SHA-256 | e8655ab0550a159f8f03018f82d7c3f93f35fd8d99f959d4f1194675b0687700 |
| 签名 SHA-256 | 5cb3448e4200add077d811aba9a5ca4b266816bb0c1ac09ea11d05f56f01933c |
| 安装来源 | 测试机 Google Play,installer=com.android.vending,base + split 已拉取 |
证据标签:
- 静态确认:Manifest、DEX、资源中直接可见。
- 动态确认:本次设备实际 PID、Service、Job、Notification、Package stopped 状态或系统日志。
- 合理推断:多条事实共同支持,但没有服务端或多设备验证。
- 待验证:当前观察窗不足。
JADX 已完成源码和资源还原,但存在反编译错误;关键结论同时回查了父类、Manifest 和真机状态。Remote Config 本地默认值不等于线上最终值。
3. 保活与恢复结构#
正常启动 / Application.onCreate
│
▼
CoreTaskExecutor(dataSync FGS)
通知 ID 3 / START_STICKY
并行后台机会:
Job ID 100:约 30 秒后运行 → 续排自身
WorkManager:WorkerServiceUnique → 15 分钟周期
SolarMonitor:Boot/屏幕/解锁广播,但当前 onReceive 为空
| 组件 | 当前行为 | 结论 |
|---|---|---|
CoreTaskExecutor |
继承常驻 Service 父类;启动前台通知;onStartCommand=START_STICKY |
主常驻载体 |
StreamlinedJobScheduler |
Job ID 100;最小延迟 30 秒;执行后续排自身 |
周期执行机会,不是已证明的 FGS 拉起器 |
WorkerServiceUnique |
WorkManager 周期任务,构造最终落为 15 分钟 | 长周期后台机会 |
SolarMonitor |
Manifest 监听 Boot/Screen/User Present;父类当前 onReceive() 为空 |
更接近触发进程初始化的壳,不应写成完整 Boot 拉活逻辑 |
FCMService |
自定义 FirebaseMessagingService;代码包含消息到达和展示日志 | Push 入口;未获得服务端发送策略 |
AppMonitorReceiver |
动态监听包安装/卸载 | 应用变更召回入口 |
ChargeReceiver |
监听充电开始、结束、低电量 | 电池召回入口 |
3.1 动态结果#
| 场景 | 结果 | 证据解释 |
|---|---|---|
| 正常打开 10 秒 | PID 27015;CoreTaskExecutor 为 FGS;ID 3;types=dataSync;startCommandResult=1 |
常驻服务真实存在 |
| Job | cmd jobscheduler get-job-state ... 100 返回 waiting |
Job 已注册,不代表准点执行 |
| 非 Force Stop 进程死亡 | 无 Root 测试机无法杀掉受 FGS 保护的应用 UID;am kill 不回收 |
本轮未动态证明冷进程恢复 |
| 单独 Force Stop | 1 秒、16 秒无 PID;stopped=true |
硬边界成立 |
| 重启约 45 秒 | 进程因 SolarMonitor 广播创建;FGS 启动被系统拒绝;ServiceRecord app=null |
有尝试,无成功常驻 |
系统日志关键事实:
Start proc ... for broadcast {com.cleansweepmaster.clsm/...SolarMonitor}startForegroundService() not allowed due to mAllowStartForeground falseApp ... became active but still in NEVER bucket
因此本包在 Android 16 上的真实结论是:前台打开后能常驻;开机后台拉 FGS 本轮失败;Force Stop 无法突破。
4. 通知召回#
4.1 常驻通知#
| 项目 | 值 |
|---|---|
| 通知 ID | 3 |
| 渠道 | resident |
| flags | `ONGOING_EVENT |
| 展示 | 自定义 RemoteViews,timeout 72 小时 |
该通知的目的首先是维持 FGS 可见性,不应计为营销召回曝光。
4.2 业务召回入口#
| 入口 | 静态行为 | 配置边界 |
|---|---|---|
| 安装其他 App | 后台时生成安装提醒;Android 29+ 主要走通知回退 | 总开关、应用类上限、场景间隔、总通知数 |
| 卸载其他 App | 后台时生成卸载残留提醒 | 同上 |
| 充电开始/结束/低电量 | 进入 Charge 提醒链 | Charge 开关、日上限、间隔 |
| FCM | 自定义 Service 接收;SDK 仍可能处理 notification payload 自动展示 | 服务端人群、TTL、优先级、频控未知 |
| Remote Config | 下发通知开关、上限、首条/后续间隔和文案 | 本地默认不代表线上值 |
代码中可见两组默认上限构造:一组约为功能 18、充电 3、应用 3,另一组约为 3/1/1;但各状态默认关闭并可被 Remote Config 覆盖,所以只能写为“内置候选默认”,不能写成当前线上日上限。
5. 产品族群#
| 维度 | Clean Sweep Master | 五包白标核心 |
|---|---|---|
| 主 FGS | CoreTaskExecutor,dataSync |
混淆类,specialUse/quick entry |
| 恢复任务 | 30 秒 Job + 15 分钟 Work | 2–7 秒恢复 Job + 21–25 分钟持久化 Job + 8 小时 Alarm |
| Boot | SolarMonitor 当前接收逻辑为空 |
自定义 Boot Receiver 进入恢复 helper |
| 通知模型 | Remote Config 的 function/app/charge 模型 | A/B/D/网络/截图等事件码模型 |
| 签名 | 5cb3448e… |
各自不同;CleanMas/CleanLoom 同签名 |
| 代码根 | com.cleansweepmaster.clsm |
三组不同业务根,但核心混淆框架同构 |
结论:Clean Sweep Master 是独立产品/代码族,不能因为同为 Cleaner 就并入另外五包。
6. 风险与未验证项#
dataSync类型从 Boot 启动在新 Android 版本受更强限制,本次已观察到后台 FGS 启动拒绝。- Job 每 30 秒续排属于高频后台调度诉求,系统并不承诺严格执行,也可能触发配额和电量限制。
- 未动态等待完整 15 分钟 WorkManager 窗口。
- 未拿到 Remote Config 当前线上值、FCM 服务端策略和实际到达率。
- 未在其他 ROM、通知权限关闭、长期 Doze、系统回收进程条件下验证。
7. 证据位置#
- APK:
Clean/cleaner-7-pack-2026-08-31/clean-sweep-master/apk/ - JADX:
Clean/cleaner-7-pack-2026-08-31/clean-sweep-master/jadx/ - Manifest:
Clean/cleaner-7-pack-2026-08-31/clean-sweep-master/jadx/resources/AndroidManifest.xml - 关键源码:
CoreTaskExecutor.java、StreamlinedJobScheduler.java、SolarMonitor.java、PhoneCleanFinderManagerPro.java、AppMonitorReceiver.java、ChargeReceiver.java、FCMService.java - 动态证据索引:
Clean/cleaner-7-pack-2026-08-31/clean-sweep-master/evidence/证据索引.md