Photo Recovery V1.0.3 竞品逆向分析统一总览#
更新时间:2026-08-13
竞品包名:com.files.photo.recovery.restore.pro
样本版本:V1.0.3(versionCode4)
文档用途:统一查看竞品逆向事实、动态证据、产品逻辑、通知机制、通知清理能力、商业化链路及 Deep Cleaner 参考方案。
说明:本文是整合阅读入口,不删除或覆盖任何原始报告;正文中的 S1~S7 均可点击并回查文末“参考原文”。
目录#
- 1. 阅读结论
- 2. 证据口径与可信度
- 3. 竞品基本信息
- 4. 整体产品与商业逻辑
- 5. 完整运行步骤
- 6. 通知系统逻辑
- 7. 通知触发与频控逻辑
- 8. 多语言文案逻辑
- 9. 通知点击与页面路由
- 10. Notification Cleaner 通知清理逻辑
- 11. 后台调度与恢复逻辑
- 12. 桌面小组件逻辑
- 13. 广告与商业化闭环
- 14. 已确认事实、合理推断与待验证项
- 15. Deep Cleaner 完整复刻范围
- 16. 高风险但仍进入复刻的设计
- 17. Deep Cleaner 完整复刻落地框架
- 18. 配置发布步骤
- 19. 验证清单
- 20. 参考原文
1. 阅读结论#
Photo Recovery V1.0.3 不是只靠“照片恢复”功能获得收入,它实际形成了一套完整循环:
工具功能吸引安装
→ 获取文件、通知等权限
→ Remote Config 下发通知和广告策略
→ Service / Job / WorkManager / Alarm / FCM 维持后台能力
→ 本地通知、FCM、小组件反复召回用户
→ 统一路由进入恢复、清理、通知管理等页面
→ 在启动、完成、退出等节点请求广告
→ 用埋点继续优化触达和变现
Deep Cleaner v1.0.3 的执行目标是全盘复刻这套系统结构及已确认的激进参数,不做“只参考结构、排除激进部分”的二次筛选:S1:摘要、第二至四章;S2:第4~8章
| 模块 | 核心作用 | 学习价值 |
|---|---|---|
| Remote Config | 远程控制通知、频率、素材和灰度策略 | 不发版即可调节运营策略 |
| 场景化通知 | 根据截图、大文件、待处理内容等状态选择通知 | 让通知与用户当前需求相关 |
| 多层频控 | 同时限制全局、场景、素材和通知栏数量 | 防止多个规则互相叠加失控 |
| 统一路由 | 所有通知先进入统一跳板,再转目标页 | 方便初始化、埋点和异常兜底 |
| 多路后台调度 | Service、Job、Work、Alarm、开机恢复、FCM 互补 | 提高任务恢复概率 |
| 通知清理 | 监听、隐藏并保存其他 App 通知 | 增加工具卖点与回访入口,但权限风险高 |
| 小组件 | 桌面快捷入口和长期曝光 | 增加主动回访和功能入口 |
| 广告场景 | 启动、完成、退出等节点请求广告 | 将召回转化为广告展示机会 |
准确结论应表述为:
V1.0.3 是一款具备激进通知召回、持续后台调度、通知管理和高密度广告变现能力的文件恢复/清理工具。代码和真机证据能够证明这些能力存在并有部分实际运行,但不能据此断言所有线上用户都采用最高频策略,也不能直接证明团队主观恶意。S2:第1、8、9章
2. 证据口径与可信度#
2.1 证据分级#
| 等级 | 含义 | 本文写法 |
|---|---|---|
| A:静态+动态确认 | 代码/配置存在,且测试机实际观察到 | 已确认运行 |
| B:静态确认 | Manifest、资源或明确调用链存在,但未完整动态触发 | 已确认能力 |
| C:合理推断 | 根据多处代码和产品链路推导用途 | 推断 |
| D:尚未验证 | 依赖服务端策略、厂商 ROM、长时间观察或专用测试 | 待验证 |
2.2 样本可靠性#
| 项目 | 结果 |
|---|---|
| 安装来源 | Google Play(安装来源 com.android.vending) |
| 测试设备 | Pixel 6a(bluejay) |
| 版本 | V1.0.3 / versionCode 4 |
| targetSdk | 35 |
| 反编译规模 | JADX 约 19,531 个类 |
| 反编译限制 | 存在 114 个局部错误,复杂混淆分支不能只依赖 Java 伪源码 |
来源:S2:第2章
2.3 阅读时必须保留的边界#
- APK 内置参数代表客户端具备的兜底能力,不等于线上 Remote Config 当前实际值。
updatePeriodMillis=24h代表向系统请求约24小时更新,不保证每天精确执行。- Service、Job、Alarm、WorkManager 并存会提高恢复概率,但不代表用户一定无法停止 App。
- FCM Service 与服务恢复入口存在;不同优先级消息的最终分支仍需真实推送验证。
- NotificationListener 的取消代码路径已确认,但不同系统和通知类型的实际效果仍需专用测试 App 交叉验证。
3. 竞品基本信息#
| 项目 | 内容 |
|---|---|
| 应用名 | Photo Recovery(文件恢复) |
| 包名 | com.files.photo.recovery.restore.pro |
| 当前复核版本 | V1.0.3 / versionCode 4 |
| 平台 | Android |
| minSdk / targetSdk | 24 / 35 |
| 主体功能 | 照片/文件恢复、垃圾清理、通知清理、桌面小组件 |
| 核心基础设施 | Firebase、FCM、Remote Config、JobScheduler、WorkManager、AlarmManager |
| 商业化 | AdMob、Meta、Pangle、Mintegral/MBridge、InMobi、Vungle、TopOn 等 |
| 归因与分析 | Adjust、Firebase Analytics |
3.1 关键敏感权限#
| 权限 | 作用 | 风险 |
|---|---|---|
MANAGE_EXTERNAL_STORAGE |
访问设备共享存储中的广泛文件 | 高敏感,必须有核心功能正当性 |
POST_NOTIFICATIONS |
展示本 App 通知 | Android 13+ 需运行时授权 |
| Notification access | 读取、控制其他 App 通知 | 高敏感,必须由用户主动进入系统设置授权 |
READ/WRITE_CONTACTS |
联系人相关功能 | 与恢复/备份能力相关,需单独解释 |
RECEIVE_BOOT_COMPLETED |
开机后恢复任务 | 容易形成后台运行审核压力 |
FOREGROUND_SERVICE_SPECIAL_USE |
运行特殊用途前台服务 | subtype 与真实用途必须一致 |
WAKE_LOCK |
保持 CPU 短时运行 | 需要控制耗电 |
4. 整体产品与商业逻辑#
4.1 七层结构#
| 层级 | 做什么 | 实际作用 |
|---|---|---|
| 权限层 | 获取文件、发通知、通知使用权等权限 | 获得功能运行基础 |
| 配置层 | Firebase Remote Config 下发参数 | 远程调整策略和灰度范围 |
| 数据层 | 扫描照片、视频、截图、通知和存储状态 | 为场景化提醒提供数据 |
| 调度层 | Service、Job、Work、Alarm、FCM | 周期检查并恢复后台任务 |
| 决策层 | 检查开关、条件、优先级、频控 | 决定何时发哪一条 |
| 展示层 | 本地通知、FCM、前台通知、小组件 | 触达并召回用户 |
| 转化层 | 页面跳转、清理/恢复、广告和埋点 | 完成使用行为与商业收益 |
4.2 核心商业闭环#
通知或小组件曝光
→ 用户点击
→ App 前台启动
→ 进入具体恢复/清理页面
→ 扫描或操作
→ 在启动、完成或退出节点请求广告
→ 记录通知点击、功能行为和广告数据
→ 调整下一轮策略
5. 完整运行步骤#
步骤1:启动与初始化#
App 启动后执行许可证检查,初始化 Firebase、广告 SDK、配置、数据库和后台调度,并获取 FCM Token。S1:1.3、1.4、2.1、4.2
**作用:**建立通知、广告、配置和调度系统运行所需的基础环境。
步骤2:读取权限状态#
检查文件访问、通知权限、通知使用权以及后台相关条件。S1:1.2;S2:第3章
**作用:**判断哪些功能可以运行,哪些页面需要引导授权。
步骤3:拉取并激活远程配置#
从 Firebase Remote Config 获取通知开关、间隔、上限、素材和路由;拉取失败时使用 APK 内置 Offline_A / Online_B 兜底值。S1:2.2;S2:5.2
**作用:**运营无需重新发布 APK 即可调整通知策略。
步骤4:注册后台任务#
启动前台 Service,并安排快速 Job、心跳 Job、WorkManager、Alarm、开机/更新恢复和 FCM 入口。S1:4.1~4.3;S2:第4章
**作用:**不同调度机制相互补位,提高后台任务继续运行或恢复的概率。
步骤5:周期检查通知条件#
在允许窗口内按周期尝试,依次检查权限、设备状态、全局上限、素材冷却、通知栏数量等。S1:2.1;S4:4.1、4.2
**作用:**通知不是无条件按点发送,而是先经过一套决策门槛。
步骤6:选择场景和素材#
从照片、视频、截图、文档、联系人、通知清理等场景中选择符合条件的通知,再按语言和素材规则生成标题、正文及样式。S1:2.2;S4:第4、5章
**作用:**尽量让通知与用户当前状态对应,并支持远程替换素材。
步骤7:展示通知#
根据类型生成普通通知、广告召回通知、大样式通知或前台服务常驻通知。S1:第二章;S4:4.3
**作用:**针对不同运营和系统目标采用不同通知形态。
步骤8:点击并统一跳转#
通知点击先进入 NotificationTempActivity,记录埋点、读取路由并启动主 Activity,再进入目标功能页。S1:2.1
**作用:**统一处理初始化、数据记录、路由兜底和广告生命周期。
步骤9:业务操作与广告请求#
用户执行扫描、恢复、删除、清理、通知管理等操作;启动、完成和退出节点可能请求广告。S2:第7章;S3:广告点位证据
**作用:**把召回转化为业务活跃和广告收益。
步骤10:继续调度与召回#
后台任务、FCM 和小组件继续提供下一次检查或回访入口。S1:第三、四章
**作用:**形成持续运营循环,而不是一次性功能使用。
6. 通知系统逻辑#
竞品同时具备四套通知相关能力:
| 层 | 类型 | 触发方 | 作用 | 证据 |
|---|---|---|---|---|
| A | 自研本地通知 | 周期协程、启动、前后台切换 | 场景化召回 | S1:第二章 |
| B | 前台服务通知 | Service / Job / Alarm 等 | 满足前台服务要求并维持核心能力 | S1:2.1、第四章;S2:4.2、5.1 |
| C | FCM 远程消息 | FirebaseMessagingService | 远程触达、配置或恢复入口 | S1:2.1、4.5;S2:5.4 |
| D | NotificationListener | 系统通知回调 | 读取、取消并保存其他 App 通知 | S1:2.1;S2:5.3 |
6.1 通知类型#
| 类型 | 竞品含义 | 主要用途 |
|---|---|---|
normal_ntf |
周期普通通知 | 清理、截图、大文件等召回 |
ad_ntf |
高优先级广告召回通知 | 提高运营通知曝光和点击 |
res_ntf |
大样式、残留式通知 | 展示更强的信息层级 |
filter_ntf |
ongoing 常驻过滤通知 | 通知过滤、前台服务或快捷入口 |
apk_ntf |
安装包/残留场景通知 | APK 或卸载残留清理召回 |
6.2 特殊通知属性#
| 属性 | 竞品行为 | 实际作用 | 证据边界 |
|---|---|---|---|
when |
非小米设备写入当前时间+365天 | 可能影响部分系统通知排序 | 代码确认;不保证所有 ROM 永久置顶 |
deleteIntent |
指向前台 Service 启动入口 | 用户清除通知后尝试恢复服务 | 静态确认 |
autoCancel=false |
点击后不自动消失 | 保持持续曝光 | 静态确认 |
| ongoing / no-clear | 前台服务通知常驻 | 满足服务运行并减少被清除 | 真机确认 |
| visibility public | 锁屏可公开显示 | 增加可见性 | 静态、系统状态确认 |
| 高优先级与自定义布局 | 强化提醒和视觉 | 提高曝光和点击 | 表现受系统频道和 ROM 限制 |
7. 通知触发与频控逻辑#
7.1 主调度模型#
竞品主模型是“时间窗口+循环尝试+条件判断”,不是单纯固定时间点:S4:4.1
进入允许时间窗口
→ 按全局 interval 周期运行
→ 检查权限和设备门槛
→ 检查全局上限、间隔和通知栏数量
→ 从可用场景选择一条
→ 检查该场景/素材的上限、间隔和重复次数
→ 生成通知并记录时间、次数
→ 等待下一轮
固定 09:00 / 13:00 / 18:00 / 21:00 可以作为另一种策略,但不是本次逆向确认的竞品主模型。
7.2 两套内置兜底策略#
| 配置 | Offline_A | Online_B | 解释 |
|---|---|---|---|
| 普通通知上限 | 5 | 99 | 一个统计周期内允许的最大数量 |
| 普通通知间隔 | 30分钟 | 2分钟 | 两次普通通知尝试之间的最小间隔 |
| 同素材重复 | 1 | 3 | 同一句素材可以连续复用的次数 |
| 连续通知数量 | 未明确 | 12 | 一轮连续安排的数量能力 |
| 通知栏最大可见数 | 未明确 | 5 | 同时保留在通知栏中的数量 |
| Android 16 最大可见数 | 未明确 | 1 | 针对 Android 16 的单独限制 |
| 广告通知上限 | -1 |
-1 |
客户端兜底配置中不设上限 |
边界:这些是 APK 内置兜底配置,不代表当前线上所有用户实际使用 Online_B。
7.3 通知 ID、路由与单素材频控#
以下内容直接整合自常老大提供/指定整理的竞品通知原始材料:S5:第2、3章
| 通知ID | 路由 | 功能作用 | 单素材上限 | 单素材间隔 |
|---|---|---|---|---|
| 1 | home |
首页/综合恢复召回 | 5 | 15分钟 |
| 2 | photo |
照片恢复 | 5 | 15分钟 |
| 3 | video |
视频恢复 | 3 | 15分钟 |
| 5 | document |
文档恢复 | 3 | 15分钟 |
| 6 | screenshot |
截图清理 | 2 | 15分钟 |
| 7 | contacts |
联系人备份 | 3 | 15分钟 |
| 8 | recoveryed |
已恢复文件召回 | 2 | 15分钟 |
| 9 | junkcleaner |
垃圾清理主素材池 | 5 | 15分钟 |
| 10 | photo |
已删除照片风险提醒 | 3 | 15分钟 |
| 11 | home |
已删除文件风险提醒 | 5 | 15分钟 |
| 12 | photo |
长时间未扫描 | 3 | 15分钟 |
| 13 | junkcleaner |
长时间未清理/容量提醒 | 3 | 15分钟 |
| 17 | noticlean |
通知清理召回 | 2 | 15分钟 |
| 18 | largeclean |
大文件/存储清理 | 3 | 15分钟 |
需要区分两层限制:
Online_B 全局最短间隔:2分钟
单个素材自己的最短间隔:15分钟
这表示系统可以每2分钟尝试选择不同素材,但同一个素材项自身仍受15分钟限制;两者不能混为同一个字段。S5:第2章
7.4 展示前置门槛#
| 门槛 | 作用 | 确认状态 |
|---|---|---|
| 已获得通知权限 | 确保通知能展示 | 已确认 |
| 安装满约5分钟 | 避免安装后立刻进入周期通知 | 静态确认 |
| 屏幕状态 | 部分通知只在特定屏幕状态构造 | 适用范围待进一步确认 |
| 设备未锁定 | 减少部分自定义通知在锁屏触发 | 适用范围待确认 |
| 竖屏 | 适配部分自定义布局 | 适用范围待确认 |
| 未达到每日上限 | 防止超过全局频控 | 已确认模型 |
| 满足最短间隔/冷却 | 防止连续重复 | 已确认模型 |
| 通知栏未超量 | 控制同时可见数量 | 已确认字段 |
7.5 场景选择优先级#
可用的合理决策顺序为:S4:4.4
- 权限或功能异常提醒;
- 用户刚完成操作后的结果提醒;
- 有真实数据的待清理提醒;
- 存储空间不足;
- 通知积压;
- 长时间未使用召回;
- 通用品牌提醒。
该顺序用于 Deep Cleaner 参考方案,不代表竞品代码已完整确认同样的优先级实现。
8. 多语言文案逻辑#
8.1 推荐结构#
通知场景
├── 英文文案池
├── 西班牙语文案池
├── 葡萄牙语文案池
├── 其他语言文案池
└── 默认英文兜底
发送前执行:
确定场景
→ 获取设备/App语言
→ 查找对应语言文案池
→ 按权重、重复次数选择素材
→ 检查动态变量是否真实存在
→ 缺少对应语言时回退默认英文
→ 生成最终标题和正文
这是 Deep Cleaner 配置方案,不是目前已经完整反推出的竞品服务端多语言实现。S4:3.3、第5章、配置发布第四步
8.2 动态变量规则#
允许使用真实变量:
You have {count} screenshots to review.
(你有 {count} 张截图可以检查。)
竞品动态变量按当前有效数据填充;变量缺失或过期时使用竞品无变量素材:
Review screenshots you may no longer need.
(检查可能不再需要的截图。)
同时保留竞品资源中已经确认的固定文件数量、容量、提速比例、风险等级和“手机变慢”等原始素材。动态变量与固定宣称用 fixed_claim 区分,但两类都进入复刻范围。S4:配置发布第四步;S5:通知文案规则
8.3 竞品原始通知素材池#
竞品并不是“一条通知 ID 固定一组标题和正文”,而是按资源池随机组合:S5:第1章
Remote Config 选择 ntf_id 与 router
→ notification_resource_{id}
→ 从标题池选择标题
→ 从图标池选择图标
→ 从正文池选择正文
→ 点击后按 router 进入目标页面
主要素材方向如下:
| 通知ID | 标题/正文示例 | 中文含义 | 作用判断 |
|---|---|---|---|
| 1 | View now / Lost important files? |
立即查看 / 丢失了重要文件? | 通用恢复召回 |
| 2 | Recovery / Get your lost photos back in seconds! |
恢复 / 几秒找回丢失照片 | 照片恢复召回,存在能力夸张风险 |
| 3 | Go Recovery! / Recover accidentally deleted videos |
去恢复 / 恢复误删视频 | 视频恢复入口 |
| 5 | Recovery / Recover deleted documents |
恢复 / 恢复已删除文档 | 文档恢复入口 |
| 6 | View now / Let’s clean up your screenshots! |
立即查看 / 一起清理截图 | 截图清理 |
| 7 | Back up now / Back up contacts to prevent data loss |
立即备份 / 备份联系人防止丢失 | 联系人备份 |
| 8 | View now / Come see the restored memories |
立即查看 / 看看找回的回忆 | 已恢复文件回访 |
| 9 | Clean Now / Junk Files Detected |
立即清理 / 检测到垃圾文件 | 垃圾清理主召回 |
| 12 | Recovery / You haven't scanned...for a long time. |
恢复 / 你很久没有扫描删除文件 | 长期未使用召回 |
| 17 | 通知过载/未读数量类文案 | 引导查看被隐藏通知 | Notification Cleaner 召回 |
| 18 | 大文件/空间提醒 | 引导查看占用空间的文件 | 大文件清理 |
固定虚假数字问题#
ID 9 的 APK 内置素材中存在以下固定数字:S5:ID 9
1.8GB Junk Detected(检测到1.8GB垃圾);Speed Boost up to 35%(速度最高提升35%);23 Rarely Used Apps Detected(检测到23个少用 App);Free 8.5GB(释放8.5GB)。
这些数字来自固定资源文案,不是根据测试机实时扫描结果动态计算。Deep Cleaner 按竞品完整复刻,原文进入正式复刻素材池,并标记 fixed_claim=true 便于测试识别;不得因其属于固定数字而自动删除。S5:第3、6章
文案策略观察#
| 策略 | 竞品做法 | 学习判断 |
|---|---|---|
| 强行动词 | View now、Clean Now、Handle Now |
原样进入复刻素材池 |
| 风险损失 | “无法恢复”“文件丢失” | 原样进入复刻素材池 |
| 回忆情绪 | “restored memories” | 原样进入复刻素材池 |
| 性能恐吓 | 垃圾导致变慢、固定提速比例 | 原样进入复刻素材池,并标记固定宣称 |
| 数字紧迫感 | 固定 GB、App 数量、天数 | 原样进入复刻素材池,并标记固定宣称 |
| 路由匹配 | 文案与 photo/video/junkcleaner 等页面绑定 | 按竞品 ID 和路由完整复刻 |
完整逐条英文和中文对照仍保留在 S5,统一文档收录其结构、主要素材和风险,不重复堆叠所有同义候选。
9. 通知点击与页面路由#
竞品通过 NotificationTempActivity 收敛通知点击:S1:2.1
用户点击通知
→ NotificationTempActivity
→ 读取 notification_type / router / notification_id
→ 记录点击埋点
→ 保存目标路由
→ 启动 MainActivity
→ 进入照片、视频、清理或通知管理页
统一跳板的作用:
| 作用 | 说明 |
|---|---|
| 集中埋点 | 统一记录通知来源、素材、点击和目标页 |
| 初始化兜底 | 确保数据库、配置和 SDK 已准备好 |
| 路由容错 | 无效路由可统一回到首页 |
| 生命周期统一 | 保证 App 回到前台后再打开深层页面 |
| 商业化衔接 | 便于统一处理热启动和页面广告场景 |
10. Notification Cleaner 通知清理逻辑#
10.1 用户链路#
首页点击“通知清理”
→ 竞品先检查/引导所有文件访问
→ 再检查 Notification access
→ 跳转 Android 系统设置授权
→ NotificationListenerService 连接
→ 读取当前和后续通知
→ 判断通知来源是否在允许集合
→ 对符合条件的通知调用 cancelNotification
→ 转换为 NotificationBean 并写入 Room
→ 在通知管理历史页展示
10.2 用户看到的功能#
真机已确认通知管理页保存并展示:S3
- 应用图标;
- 通知标题;
- 通知正文;
- 日期;
- “清除所有”入口;
- “通知隐藏”总开关。
10.3 白名单逻辑#
反编译调用链确认:S3:动态结论
- 默认白名单约280个包名;
- 竞品自身包名运行时强制加入;
- 用户逐 App 修改结果通过
NOTIFICATION_APP_WHITE_LIST_KEY保存; - 总开关开启后,非 ongoing 且不在允许集合的通知会先被取消,再写入本地数据库。
10.4 权限和产品风险#
| 风险 | 原因 |
|---|---|
| 权限范围大 | Notification access 可以读取并控制其他 App 通知 |
| 重要通知误伤 | 验证码、支付、聊天和系统通知可能被影响 |
| 入口权限不匹配 | “通知清理”先索要所有文件访问,目的解释不充分 |
| 用户理解偏差 | “清理”可能被理解为清除历史,而实际包含实时隐藏/取消 |
| 商业化争议 | 退出通知管理页存在插屏广告请求场景 |
10.5 Deep Cleaner 通知清理复刻规则#
以下规则是 Deep Cleaner 当前执行口径:按竞品已确认行为完整复刻;风险只用于测试标记,不再产生额外的保护、降级或排除规则。S6:第4~6、8~11章
权限规则#
- 分别记录
POST_NOTIFICATIONS与 Notification access 的系统状态; - Notification Cleaner 入口按竞品链路先进入所有文件访问权限引导,再进入通知使用权设置;
- 返回 App 后按竞品逻辑重新校验权限并进入管理页;
- 权限撤销、重新授权和服务重绑按竞品行为复刻。
白名单与 ongoing 规则#
- 内置竞品约 280 个默认白名单包名;
- Deep Cleaner 自身包名运行时加入白名单;
- ongoing 通知放行;
- 非 ongoing 且不在白名单的通知调用
cancelNotification(key)后写入本地历史; - 不增加竞品不存在的额外“高风险分类默认放行”规则。
本地数据边界#
只在本机保存实现通知历史所需的最小字段:来源包名、App 显示名、本地图标引用、标题/正文摘要、产生和隐藏时间、系统可得的类别/分组、已读与保护状态。S6:5.3
禁止上传中台:
- 通知标题和正文;
- 发送者、验证码和聊天内容;
- 通知图片;
- 原始 Intent / PendingIntent;
- 其他个人内容。
交互边界#
- “从系统通知栏隐藏”和“从 Tidyvo 本地历史删除”必须使用不同文案;
- 已从系统清除的通知不能承诺恢复到原 App 通知栏;
- 关闭总开关后,新通知恢复正常显示;
- 用户可以按 App 管理允许名单;
- 埋点只上传授权、开关、处理结果和数量分桶,不上传通知内容或来源包名。S6:5.4、6、9
11. 后台调度与恢复逻辑#
11.1 调度链#
| 机制 | 竞品参数/触发 | 主要作用 | 当前证据 |
|---|---|---|---|
| 前台 Service | START_STICKY |
承载长期通知监听和核心后台能力 | 真机运行确认 |
| 快速 Job | 约4~6秒 | Service 启动失败后的快速补拉 | 静态确认 |
| WorkManager | 约18分钟 | 周期检查/恢复 | 真机安排确认 |
| 持久 Job | 约24分钟 | 心跳式恢复入口 | 静态+真机确认 |
| AlarmManager | 约8小时 | 长周期兜底 | 静态+真机确认 |
| 开机/更新广播 | 重启或覆盖安装 | 重新初始化和安排任务 | 静态;重启恢复已观察 |
| FCM | 服务端消息到达 | 远程通知或恢复入口 | 能力确认,优先级分支待测 |
| Activity 恢复 | 用户回到 App | 重新校验并补任务 | 静态确认 |
11.2 为什么需要多路调度#
Android 后台任务会受到以下因素影响:
- Doze 深度休眠;
- 厂商省电策略;
- 用户划掉最近任务;
- 系统回收进程;
- 设备重启;
- 网络断开;
- Force Stop;
- Android 版本差异。
因此竞品不是依赖某一条绝对可靠的链路,而是让不同入口相互补位。作用是提高恢复概率,不是保证永远存活。S2:4.2、8、9章
11.3 已动态观察到的状态#
- 前台 Service 正在运行;
- 前台通知 ID 为
2084960406; - 约24分钟持久 Job 已安排;
- 约18分钟 WorkManager 已安排;
- 约8小时 Alarm 已安排;
- FCM Service 有活动 ServiceRecord;
- 划掉最近任务后短时间观察中服务和进程仍存活;
- 设备重启且未手动打开 App 时,监听服务和前台服务恢复;
- 临时撤销通知使用权会解绑监听,重新授权后再次绑定;
- 短时 Deep Doze 观察中服务仍存活。
12. 桌面小组件逻辑#
12.1 展示与入口#
小组件展示可清理空间/缓存状态,并提供清理、恢复和备份/联系人入口。S1:第三章
| 点击区域 | 路由 | 最终目标 |
|---|---|---|
| 中央清理 | router_key_widget_clean |
CleanActivity |
| 恢复 | router_key_widget_recovery |
MainActivity 恢复流程 |
| 备份 | router_key_widget_back_up |
联系人功能选择页 |
12.2 刷新机制#
- 系统周期请求:
updatePeriodMillis=86,400,000ms; - 进程存活期间:数据 Flow 变化时主动更新 RemoteViews。
12.3 作用#
| 价值 | 说明 |
|---|---|
| 用户价值 | 提供桌面快捷入口和状态展示 |
| 召回价值 | 长期留在桌面,提高品牌和功能曝光 |
| 活跃价值 | 点击后重新进入 App 生命周期 |
| 商业价值 | 用户进入清理、恢复等广告场景 |
边界:24小时更新是系统调度请求,不保证每天准确唤醒。S2:第6、8章
13. 广告与商业化闭环#
13.1 已识别广告场景#
| 阶段 | 场景示例 |
|---|---|
| 启动 | ColdOpen、HotOpen |
| 引导 | GuideCompletionInt |
| 扫描 | ScanCompleteInt、FolderClickInt |
| 操作完成 | RecoverySuccessInt、DeleteSuccessInt、CleanSuccessInt |
| 页面退出 | ScanResultExitInt、RecoveredExitInt、ContactExitInt、NotificationExitInt、CleanerExitInt |
来源:S2:第7章
13.2 动态验证状态#
| 场景 | 结果 |
|---|---|
| 冷启动广告 | 已实际出现 Google Mobile Ads 全屏广告 |
| 通知管理页退出广告 | 代码确认有请求,本次动态测试未展示,可能受填充或频控影响 |
来源:S3:广告点位证据表
13.3 商业闭环#
通知/小组件召回
→ 启动广告
→ 用户进入功能
→ 扫描或完成操作
→ 完成/结果广告
→ 用户退出页面
→ 退出广告请求
因此通知系统不仅承担用户提醒,还承担扩大 App 启动次数和广告请求机会的商业目标。S1:3.6、4.6;S2:第7章
14. 已确认事实、合理推断与待验证项#
14.1 已确认事实#
| 事实 | 证据 |
|---|---|
| 前台 Service、Job、WorkManager、Alarm 多路存在 | 静态+真机状态 |
Service 使用 START_STICKY,销毁/划任务后请求恢复 |
明确代码调用链 |
| 内置 Offline_A / Online_B 两套通知兜底值 | APK 配置常量 |
| Online_B 包含2分钟间隔、99次上限、素材重复3次 | APK 配置常量 |
| 通知时间可写成当前时间+365天 | 明确代码 |
| 删除通知 PendingIntent 指向前台服务入口 | 明确代码 |
| NotificationListener 能取消非允许集合通知并入库 | 明确调用链 |
| 通知管理页和隐藏开关存在 | 真机页面 |
| 冷启动广告存在 | 真机动态测试 |
| 小组件具备24小时更新请求和多个入口 | Manifest、资源和代码 |
14.2 合理推断#
| 推断 | 依据 | 不能扩大成什么结论 |
|---|---|---|
| 多路任务用于提高后台恢复率 | Service、Job、Work、Alarm 相互调用 | 不能说用户绝对关不掉 |
| 小组件兼有召回和变现价值 | 多入口路由到广告业务页面 | 不能证明每次点击必展示广告 |
| 通知系统服务于广告活跃 | 通知路由与大量广告场景连接 | 不能证明所有通知只为广告 |
| Remote Config 支持灰度调频 | 两套配置模型和 RC 数据结构 | 不能证明当前线上正在使用最高频组 |
14.3 尚未验证#
- 当前线上 Remote Config 实际激活值;
- 不同用户组每天真实收到的通知数量;
- FCM 服务端的实际发送频率和优先级策略;
- NotificationListener 对独立测试 App 各类通知的真实取消效果;
- 不同 Android 版本和厂商 ROM 的恢复成功率;
- 长达24小时以上的通知、Job、Alarm 实际执行轨迹;
- 照片恢复究竟是恢复真实删除数据,还是主要扫描现存缓存、缩略图或可访问文件;
- 团队主观动机、审核期和上线后的真实配置变化。
15. Deep Cleaner 完整复刻范围#
| 设计 | 竞品作用 | Deep Cleaner 执行 |
|---|---|---|
| 全局与场景双层配置 | 既能紧急停发,也能单独调整某一类通知 | 做 |
| 真实业务场景触发 | 通知与截图、大文件、待处理内容对应 | 做 |
| 多层频控 | 避免多个场景叠加造成骚扰 | 做 |
| 统一通知路由 | 埋点、初始化和错误兜底集中 | 做 |
| 多语言文案池 | 同场景支持多语言和多素材 | 做 |
| 变量缺失兜底 | 防止占位符、假数字和过期结果 | 做 |
| 配置版本和紧急开关 | 支持回滚和停发 | 做 |
| 分级灰度 | 先测试,再逐步扩大人群 | 做 |
| 通知漏斗埋点 | 可判断展示、点击、完成和卸载影响 | 做 |
| 设备重启/升级后恢复完整任务链 | 提高后台恢复概率 | 完整复刻 |
来源:S4:第3、4、8~11章
16. 高风险但仍进入复刻的设计#
| 设计 | 已知风险或系统限制 | Deep Cleaner 执行口径 |
|---|---|---|
| 2分钟一条、每天99条 | 可能提高关闭通知、卸载和投诉 | 完整建立并执行 Online_B 参数能力 |
| 广告通知无上限 | 可能造成高频触达 | 保留 -1 无上限配置能力 |
| 未来365天时间戳 | 不同系统和 ROM 表现不一致 | 按竞品厂商条件复刻并逐机验证 |
| 删除通知后恢复服务 | 可能与用户清除动作形成对抗 | 复刻 deleteIntent 恢复入口 |
| Service 销毁后不断自拉 | 可能增加耗电和系统限制 | 复刻 START_STICKY、销毁和划任务恢复链 |
| 取消其他 App 通知 | 可能影响重要通知 | 按竞品 ongoing + 约280包名白名单模型复刻 |
| 通知清理先索要所有文件权限 | 权限目的关联弱 | 按竞品入口顺序复刻 |
| 固定清理天数或空间数字 | 不是实时扫描结果 | 原文进入素材池并标记 fixed_claim=true |
| 高频启动/退出广告 | 可能破坏功能体验 | 已确认广告请求场景全部复刻 |
| 高优先级 FCM 进入恢复链 | 可能被系统降级 | 保留同等客户端分支并用自有 FCM 验证 |
17. Deep Cleaner 完整复刻落地框架#
本章把竞品已确认结构、参数和素材转成 Deep Cleaner 执行方案。竞品尚未确认的服务端激活值继续标记待验证,但不删除对应客户端能力和配置字段。完整字段和场景见 S4。
17.1 三套能力#
| 能力 | 作用 | 复刻边界 |
|---|---|---|
| 通知清理 | 获取通知使用权、取消非白名单普通通知并保存历史 | 按竞品权限入口、白名单和管理页完整复刻 |
| 通知召回 | 周期选择通知素材并进入业务页 | 按竞品 ID、固定素材、Offline_A / Online_B 完整复刻 |
| 常驻与恢复 | Service、Job、WorkManager、Alarm、广播和 FCM 多路恢复 | 按竞品已确认参数完整复刻,系统效果逐机验证 |
17.2 后台配置页面#
| 页面 | 管理内容 |
|---|---|
| 全局策略 | 总开关、紧急停止、时段、时区、总上限、全局间隔 |
| 通知场景 | 触发条件、优先级、冷却、场景上限、通知类型 |
| 多语言文案池 | 语言、标题、正文、变量、权重、默认语言 |
| 路由 | 通知场景到 App 页面映射和非法路由兜底 |
| 灰度与发布 | 配置版本、测试人群、比例、回滚和指标 |
来源:S4:第3章
17.3 复刻通知场景#
| 竞品 ID | 复刻场景 | 点击路由 | 执行口径 |
|---|---|---|---|
| 1、5、11 | 文件恢复/删除文件风险 | home 或已登记等价页 |
原素材、频控和路由完整保留 |
| 2、8、10 | 照片恢复/已删除照片风险 | photo 或已登记等价页 |
原素材、频控和路由完整保留 |
| 3 | 视频恢复 | video 或已登记等价页 |
原素材、频控和路由完整保留 |
| 6、16 | 截图清理 | screenshot |
原素材、频控和路由完整保留 |
| 7 | 联系人备份 | contact 或已登记回退页 |
原素材、频控和路由完整保留 |
| 9、13 | 垃圾清理/长期未清理 | junkcleaner |
固定数字和风险式素材一并保留 |
| 12 | 长期未扫描 | home |
原素材、频控和路由完整保留 |
| 14、15 | 安装包/卸载残留 | junkcleaner |
按事件触发链完整复刻 |
| 17 | 通知积压 | noticlean |
通知数量素材和路由完整复刻 |
| 18 | 空间不足/待清理垃圾 | junkcleaner |
原素材、频控和路由完整保留 |
来源:S4:第5章
17.4 竞品频控基线#
| 项目 | Offline_A | Online_B |
|---|---|---|
| 普通通知总上限 | 5 | 99 |
| 全局最短间隔 | 30分钟 | 2分钟 |
| 同素材重复次数 | 1 | 3 |
| 连续通知数量 | 未确认 | 12 |
| 冷却时间 | 未确认 | 2分钟 |
| 通知栏最大可见数 | 未确认 | 5 |
| Android 16 最大可见数 | 未确认 | 1 |
| 广告通知上限 | -1 | -1 |
18. 配置发布步骤#
第一步:建立全局安全开关#
先完成 master_switch、emergency_stop、允许时段、每日上限和全局间隔。没有紧急停发能力,不进入生产。S4:第9章
第二步:建立路由字典#
为每个目标页面建立稳定路由;非法、缺失或版本不支持的路由统一回到首页并记录错误。S4:3.4、第9章
第三步:建立通知场景#
逐个定义:触发条件、排除条件、优先级、冷却、上限、有效期、路由和停发条件。S4:第5章
第四步:录入多语言文案#
每条素材绑定场景、语言、变量、权重和默认兜底;变量缺失时不得发送带占位符的文案。S4:3.3、第9章
第五步:建立策略组#
完整建立并可直接发布竞品 Offline_A / Online_B,同时支持远程选择策略组、覆盖字段和回滚。不得再建立一套保守生产参数去替代竞品基线。S4:2.1、第9章
第六步:逐场景测试#
每个场景验证:条件满足、不满足、点击路由、语言、变量、冷却、每日上限、有效期和紧急关闭。S4:第9、11、13章
第七步:灰度发布#
按照内部测试 → 1% → 10% → 50% → 100%推进,观察授权率、送达/展示、点击率、清理完成率、通知关闭率、卸载率、崩溃率和投诉。S4:第9、10章
19. 验证清单#
19.1 竞品后续验证#
- 读取 Remote Config 当前激活值;
- 连续观察24小时以上的通知类型、时间、数量和来源;
- 用合法测试 FCM 验证 normal/high priority 分支;
- 用独立测试 App 验证 NotificationListener 白名单和取消行为;
- 分别测试 Home、划任务、停止服务、重启、Doze、后台限制和 Force Stop;
- 验证照片恢复的数据来源和真实恢复能力;
- 对不同 Android 版本和厂商 ROM 复测。
19.2 Deep Cleaner 开发验收重点#
- 总开关和紧急停发立即生效;
- 多语言按设备/App语言正确回退;
- 动态变量全部来自真实有效数据;
- 全局、场景和素材频控同时生效;
- 用户完成目标动作后同类通知停止;
- 通知点击进入正确页面,非法路由回首页;
- 用户关闭通知或营销提醒后不再发送;
- 权限只在对应功能入口申请;
- 设备重启、时区变化和 App 更新后重新校验计划;
- 成功、取消、失败和权限拒绝路径均有验证记录。
来源:S4:第11、13、14章
20. 参考原文#
20.1 来源编号#
| 编号 | 原文档 | 在本整合文档中的作用 |
|---|---|---|
| S1 | Photo_Recovery_逆向分析报告.md | 常老大提供/指定的原始逆向报告;V1.0.2 核心类、通知、小组件、保活和风险初判 |
| S2 | Photo_Recovery_V1.0.3_独立复核报告.md | V1.0.3 独立复核、纠偏、静态与动态证据边界 |
| S3 | 证据索引.md | 真机页面、广告点位、权限、服务和动态测试证据 |
| S4 | Deep_Cleaner_v1.0.3_通知系统详细配置执行方案.md | 从竞品结构转为 Deep Cleaner 后台、场景、频控、路由和验收方案 |
| S5 | Photo_Recovery_V1.0.3_通知文案整理.md | 常老大提供/指定整理的通知原始材料;竞品通知ID、路由、标题、正文和频控 |
| S6 | Deep_Cleaner_v1.0.3_通知清理与通知干预方案.md | 通知清理权限、处理规则、白名单、埋点和验收补充 |
| S7 | photo-recovery-apkpure.html | 原始下载/页面留档,仅作样本来源辅助,不作为运行逻辑证据 |
20.2 原文关系#
S1 主逆向报告
↓ 由 S2 对 V1.0.3 重新复核和纠偏
S3 提供真机截图、系统状态和动态证据
↓
S4 将竞品事实转成 Deep Cleaner 可配置执行方案
S5 补充通知文案素材
S6 补充通知清理产品规则
↓
本文负责统一解释和索引,不替代原始证据
20.3 冲突处理原则#
当原文之间存在冲突时,按以下顺序判断:
- V1.0.3 真机动态证据;
- V1.0.3 独立复核中的明确静态调用链;
- 主逆向报告中的静态发现;
- Deep Cleaner 完整复刻执行方案中的字段映射和待验证标记。
Deep Cleaner 的执行范围不得反向改写为竞品线上已激活事实;静态能力也不能直接写成所有竞品线上用户的实际行为。但这些证据边界不影响 Deep Cleaner 完整建设同等客户端能力和配置字段。