CleanTool v2.3.1 保活与拉活反编译代码册#
文档日期:2026-10-12
包名:com.brisksignal.easyproxyapp
样本:2.3.1 (231)
分析日期:2026-09-30
目的:给开发直接定位 App 自有保活、拉活与召回通知代码
1. 阅读口径#
- S1:源码/资源/Manifest 中可直接确认。
- I:由多处 S1 拼接出的等价逻辑,尚未真机复现。
- U:JADX 失败、系统/OEM 或服务端行为未确认。
- 本册只整理 App 自有行为链;广告、Firebase、WorkManager 等第三方库内部实现不展开。
jadx/保存完整未删节反编译产物。本册的代码块是便于阅读的关键语句摘录/等价化整理,省略 XOR 字符串解码、混淆日志和无关异常包装;开发核对时以所列源文件和行号为准。- JADX 本次结束错误数为 76。关键失败方法:
WpCyBN.onCreate()、NaKMPne.c()、u32.a()、s32.e()、v32.invokeSuspend()、OutOpenActivity.g();这些方法不能仅凭伪代码恢复结果认定真机行为。
2. 总链路#
ContentProvider WpCyBN(进程创建前置)
└─ dn.a()
├─ 创建 3 个通知 Channel
├─ im2.d() → gXXfik 前台服务
│ └─ 启动失败 → Job 3857 / PsaeNNErXb
├─ Alarm 74655 → BpFZcYhmZ → im2.d() → 重排 Alarm
├─ 动态系统广播 z7 → im2.d()
├─ Boot/Package replaced ZPHDnIht → im2.d()
├─ Job 3432 → sToBblBqZa → im2.d() + 重排 Job
└─ Unique PeriodicWork → kcTBvDgL → im2.d()
其他入口:Widget 广播 / FCM / FGS onDestroy / FGS onTaskRemoved / 常驻通知 deleteIntent
所有这些代码都只能证明“尝试启动/重排”存在;targetSdk 36 下后台 FGS、Job、Alarm、WorkManager 是否实际按请求执行仍为 U。
3. App 自有方法全量索引#
3.1 初始化、配置与总编排#
| 源码路径:行号 | 方法/字段 | 行为 | 等级 |
|---|---|---|---|
com/ai/smart/WpCyBN.java:79-168 |
onCreate() |
保存 Application Context;校验包名 hash;从 Manifest metadata 反射 KeepCallbackImp;注册 lifecycle;初始化归因/协程;调用 dn.a(context) |
S1/I,方法 JADX 失败 |
com/ai/smart/notify/KeepCallbackImp.java:11-25 |
单例与构造 | 三个 Channel;常驻通知 ID 1;FCM topic;解码后 Alarm 时间 10:00;Job/Work 周期各 15 分钟 | S1 |
defpackage/dn.java:27-101 |
a(Context) |
后台总编排:先建 Channel;通知权限满足后安排 FGS、Alarm、动态 Receiver、boot receiver、周期 Job、PeriodicWork | S1 |
defpackage/eq3.java:150-186 |
d(String) |
记录 live point;每次延迟 2.5 秒尝试自动通知;非特定入口时刷新 FCM token/topic | S1/I |
3.2 FGS 与 fallback#
| 源码路径:行号 | 方法 | 行为 | 等级 |
|---|---|---|---|
defpackage/im2.java:69-139 |
d() |
通知权限满足且 FGS 未运行时 startForegroundService(gXXfik);异常时调度 job ID 3857 |
S1 |
com/ai/smart/gXXfik.java:37-86 |
a() |
创建常驻通知并 startForeground(ID=1, type=0x40000000);更新运行标记 |
S1 |
gXXfik.java:102-105 |
onCreate() |
调 a() |
S1 |
gXXfik.java:108-113 |
onDestroy() |
清运行标记、停止前台、再次 im2.d() |
S1 |
gXXfik.java:116-119 |
onStartCommand() |
再次 a();API≥34 返回 2,否则返回 1 |
S1 |
gXXfik.java:122-125 |
onTaskRemoved() |
再次 im2.d() |
S1 |
gXXfik.java:94-99 |
onConfigurationChanged() |
重建/刷新常驻通知 | S1 |
com/ai/smart/PsaeNNErXb.java:48-121 |
onCreate() |
Job fallback 自身先前台化;若主 FGS 未运行则启动它 | S1 |
PsaeNNErXb.java:124-133 |
onDestroy() |
取消 scope,清 fallback 运行标记 | S1 |
PsaeNNErXb.java:136-145 |
onStartJob()/onStopJob() |
启动 15 秒协程;stop 不重试 | S1 |
defpackage/jo.java:479-518 |
coroutine case 11 | 延迟 15 秒后 jobFinished(params,false) |
S1 |
3.3 Job、Alarm 与 WorkManager#
| 源码路径:行号 | 方法 | 行为 | 等级 |
|---|---|---|---|
defpackage/hd3.java:50-97 |
a(Context) |
Job 3432;无网络/充电/idle 要求;persisted;默认 15 分钟;deadline +5 秒;API33+ priority 400 | S1 |
com/ai/smart/sToBblBqZa.java:21-42 |
onCreate() |
调 im2.d() 并记 live point |
S1 |
sToBblBqZa.java:45-53 |
onStartJob()/onStopJob() |
hd3.a(this) 自重排;立即返回 false |
S1 |
defpackage/wu3.java:261-312 |
b(Context) |
Alarm requestCode 74655;按配置的 10:00 计算下次时间;使用 AlarmManager.set(type=2 / ELAPSED_REALTIME_WAKEUP, elapsedRealtime+delta) |
S1 |
com/ai/smart/BpFZcYhmZ.java:20-28 |
onReceive() |
im2.d()、记 live point、重排 Alarm |
S1 |
defpackage/wu3.java:314-350 |
c(Context) |
unique periodic work;默认 15 分钟、最小 15 分钟、flex 5 分钟;配置为 0 时按 name 取消 | S1 |
com/ai/smart/kcTBvDgL.java:27-35 |
doWork() |
im2.d()、记 live point、返回 success |
S1 |
3.4 广播、Widget、FCM 等再入口#
| 源码路径:行号 | 方法 | 行为 | 等级 |
|---|---|---|---|
defpackage/z7.java:20-90 |
onReceive() |
9 类系统事件按 action 500ms 去抖,随后 im2.d() 并记 live point |
S1 |
com/ai/smart/ZPHDnIht.java:22-39 |
onReceive() |
BOOT_COMPLETED / MY_PACKAGE_REPLACED 时 im2.d() 并记 live point |
S1 |
defpackage/dk1.java:12-18 |
onReceive() |
三个 AppWidget Provider 的基类;任一 Widget 广播均 im2.d() |
S1 |
com/ai/smart/NaKMPne.java:51-60 |
c(RemoteMessage) 开头 |
每条 FCM 先 im2.d() 并记 live point |
S1;其余方法失败 |
defpackage/m71.java:189-197 |
常驻通知 deleteIntent |
API<35 用 getForegroundService、API≥35 用 getService,目标 gXXfik |
S1/U(系统是否回调) |
z7 的 9 个 action 经字符串解码/哈希交叉确认:SCREEN_OFF、SCREEN_ON、PACKAGE_REPLACED、CLOSE_SYSTEM_DIALOGS、CONFIGURATION_CHANGED、PACKAGE_REMOVED、USER_PRESENT、ACTION_POWER_CONNECTED、PACKAGE_ADDED。
3.5 常驻通知与场景通知#
| 源码路径:行号 | 方法 | 行为 | 等级 |
|---|---|---|---|
defpackage/m71.java:38-74 |
a(Context) |
创建 resident/remind/remind_silence 三个 Channel | S1 |
m71.java:76-96 |
b(Context) |
App 可见且未锁屏时刷新常驻通知 ID 1 | S1 |
m71.java:98-228 |
c(Context) |
创建常驻 RemoteViews、五个入口、实时网速、deleteIntent | S1 |
defpackage/s32.java:49-93 |
c(Context,int) |
常驻通知 8197~8201 选择码 → action | S1 |
s32.java:96-101 |
d() |
NotificationManager.areNotificationsEnabled() |
S1 |
s32.java:108-277 |
e(...) |
构建 ID 8194 自定义通知、deleteIntent、normal/silent channel、启动连续提醒 | S1/I,方法失败 |
s32.java:280-283 |
f(...) |
normal 提醒包装入口 | S1 |
defpackage/v32.java:43-104 |
invokeSuspend() |
计划 4 秒间隔的静默连续提醒 | I/U,方法失败且权限分支疑似反转 |
com/ai/smart/notify/NotifyRepeatReceiver.java:14-22 |
onReceive() |
收到 com.action.CANCEL_REPEAT 取消连续提醒 |
S1 |
defpackage/u32.java:50-119 |
a(...) |
统一门禁:权限、冷却、时间、安装龄、锁屏/interactive、横屏、后台 | S1/I,方法失败 |
u32.java:121-128 |
b() |
type1 冷却:默认 Remote Config,特定状态 2h | S1 |
u32.java:130-148 |
c(Context) |
未锁屏且 interactive | S1 |
u32.java:151-157 |
d() |
AB/状态组合判断 | S1,业务语义 I |
u32.java:159-169 |
e(type,scene) |
写 type 与 scene 最后展示时间 | S1 |
u32.java:171-184 |
h() |
自动通知三选一 | S1 |
u32.java:186-209 |
f() |
低电量通知 | S1 |
u32.java:211-238 |
g(Bitmap,String) |
截图通知 | S1 |
defpackage/t32.java:5-30 |
enum | 15 个 scene 与 10 分钟/1 小时冷却 | S1 |
defpackage/z23.java:28-132 |
onReceive() |
屏幕、电池、最近任务、安装卸载、充放电、解锁通知触发 | S1;string switch 警告 |
defpackage/zr0.java:30-100 |
onEvent() |
FileObserver 新图片→截图通知;其他文件→新文件通知 | S1 |
defpackage/r3.java:277-313 |
case 17 | 网络类别变化→网络切换通知 | S1 |
defpackage/g.java:116-146 |
case 4 | 广告外跳后召回通知 | S1 |
g.java:207-236 |
case 9 | live point 后的自动三选一通知 | S1/I |
g.java:360-535 |
cases 17-21 | 最近任务、解锁、卸载、充电、停止充电通知 | S1 |
defpackage/lc1.java:236-268 |
case 21 | 安装 App A/B 通知 | S1 |
a/ac/view/notification/NotificationListener.java:74-117 |
onNotificationPosted() |
取消其他 App 非 ongoing 通知;计数达到 20 后发通知清理召回 | S1 |
defpackage/cw.java:704-724 |
coroutine case 12 | 构造 NotificationItem(pkg,title,content,time) 并调用 DAO |
S1 |
defpackage/dx1.java:259-285 |
s(j32,...) |
截断 title/content 后写 Room 数据库 | S1,方法有局部 JADX 警告 |
defpackage/j32.java:18-53 |
NotificationItem |
字段:id、pkg、title、content、time | S1 |
com/ai/smart/NaKMPne.java:51-135 |
c(RemoteMessage) |
FCM:delivered priority 为 high 时随机 10 条本地模板;original priority high 另有门禁但执行体失败 | S1/U |
defpackage/kf.java:60-132 |
onStateChanged() |
前台取消 ID8194;广告导致退后台时延迟召回;切换后台标记 | S1 |
a/ac/view/splash/OutOpenActivity.java:60-100 |
g() |
点击通知取消连续提醒,透传 action 到 Splash | S1/I,方法失败 |
defpackage/f81.java:230-409 |
g(String) |
action→功能落地页 | I,string switch 恢复失败 |
3.6 FCM、Remote Config 与路由配置#
| 源码路径:行号 | 方法 | 行为 | 等级 |
|---|---|---|---|
defpackage/lw0.java:48-132 |
a()/b() |
获取/保存 FCM token,传给 Adjust,订阅 topic tZDmW |
S1 |
com/ai/smart/NaKMPne.java:137-141 |
d(String) |
token refresh→lw0.a() |
S1 |
defpackage/yi2.java:115-145 |
c(Task) |
拉 notifyCoolTime、notify_interval_10m、D0-D3 广告配置等 |
S1 |
defpackage/f81.java:73-228 |
e(n11,...) |
枚举→具体扫描/管理 Activity | S1 |
defpackage/n11.java:27-50 |
enum | Cache、Large File、Screenshot、App Manage、Network Traffic、RAM、Notify Clean 等落地类型 | S1 |
4. 核心反编译代码摘录#
4.1 进程前置初始化#
jadx/sources/com/ai/smart/WpCyBN.java:82-168:
Context context = getContext();
if (context == null) return true;
WpCyBN.f4799a = context.getApplicationContext();
// 包名 hash 校验;不匹配则退出
MessageDigest digest = MessageDigest.getInstance(/* decoded algorithm */);
String packageHash = vg.O(digest.digest(context.getPackageName().getBytes(...)), ...);
if (!packageHash.equals(ALLOWED_1) && !packageHash.equals(ALLOWED_2)) return false;
// 遍历 Manifest metadata,反射 KeepCallbackImp.INSTANCE/构造器
ApplicationInfo ai = context.getPackageManager()
.getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
Class<?> cls = Class.forName(metadataKey);
WpCyBN.b = (ek1) cls.getDeclaredField("INSTANCE").get(null);
application.registerActivityLifecycleCallbacks(ua3.b);
Adjust.getAttribution(new zm3());
Adjust.getAdid(new an3());
dn.a(context);
return true;
onCreate() 有 JADX 失败;包校验、反射、lifecycle 和 dn.a() 调用均有直接语句,异常分支细节为 U。
4.2 总编排#
jadx/sources/defpackage/dn.java:27-101 的等价主干:
static void initKeep(Context context) {
m71.a(context); // 创建通知 channels
if (!notificationPermissionGranted(context)) return; // f92.a()
if (!started) {
started = true;
im2.d(); // 启动 FGS
wu3.b(context); // 每日 Alarm
registerDynamicReceiver(z7); // 9 类系统事件
registerBootReceiver(); // boot / package replaced
hd3.a(context); // 周期 Job 3432
}
if (!workScheduled) {
wu3.c(context); // Unique PeriodicWork
workScheduled = true;
}
}
4.3 FGS 启动与 Job 3857 fallback#
jadx/sources/defpackage/im2.java:69-139:
static void startKeepService() {
Context context = WpCyBN.f4799a;
if (context == null || !notificationPermissionGranted(context)) return; // f92.a()
try {
if (!gXXfik.f4807c) {
Intent i = new Intent(context, gXXfik.class)
.setPackage(context.getPackageName());
context.startForegroundService(i);
}
} catch (Throwable startError) {
if (PsaeNNErXb.b) return;
JobScheduler js = (JobScheduler) context.getSystemService(JOB_SCHEDULER_SERVICE);
js.cancel(3857);
JobInfo.Builder b = new JobInfo.Builder(3857,
new ComponentName(context.getPackageName(), PsaeNNErXb.class.getName()))
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_NONE)
.setRequiresCharging(false)
.setRequiresDeviceIdle(false)
.setPersisted(true)
.setMinimumLatency(5000L)
.setOverrideDeadline(7000L);
if (SDK_INT >= 33) b.setPriority(400);
js.schedule(b.build());
PsaeNNErXb.b = true;
}
}
4.4 常驻前台 Service#
jadx/sources/com/ai/smart/gXXfik.java:37-125:
void enterForeground() {
Notification n = m71.c(this);
if (SDK_INT > 29) {
startForeground(1, n, 0x40000000); // specialUse type bit
} else {
startForeground(1, n);
}
gXXfik.f4807c = true;
}
public void onCreate() { super.onCreate(); enterForeground(); }
public int onStartCommand(Intent intent, int flags, int startId) {
enterForeground();
return SDK_INT >= 34 ? 2 /* START_NOT_STICKY */ : 1 /* START_STICKY */;
}
public void onDestroy() {
super.onDestroy();
gXXfik.f4807c = false;
stopForeground(1);
im2.d();
}
public void onTaskRemoved(Intent rootIntent) {
super.onTaskRemoved(rootIntent);
im2.d();
}
4.5 fallback JobService#
PsaeNNErXb.java:48-145 与 jo.java:479-518:
public void onCreate() {
super.onCreate();
Notification n = m71.c(this);
if (SDK_INT > 29) startForeground(1, n, 0x40000000);
else startForeground(1, n);
PsaeNNErXb.b = true;
if (!gXXfik.f4807c) startForegroundService(new Intent(this, gXXfik.class));
}
public boolean onStartJob(JobParameters p) {
PsaeNNErXb.b = true;
launch {
delay(15_000L);
jobFinished(p, false);
}
return true;
}
public boolean onStopJob(JobParameters p) { return false; }
4.6 周期 Job 自重排#
hd3.java:50-97 与 sToBblBqZa.java:21-53:
static void schedulePeriodicJob(Context context) {
JobScheduler js = context.getSystemService(JobScheduler.class);
long minutes = v93.c().b; // KeepCallbackImp 默认 15
if (minutes == 0) { js.cancel(3432); return; }
long delayMs = TimeUnit.MINUTES.toMillis(minutes);
JobInfo.Builder b = new JobInfo.Builder(3432,
new ComponentName(context, sToBblBqZa.class))
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_NONE)
.setRequiresCharging(false)
.setRequiresDeviceIdle(false)
.setPersisted(true)
.setMinimumLatency(delayMs)
.setOverrideDeadline(delayMs + 5000L);
if (SDK_INT >= 33) b.setPriority(400);
js.schedule(b.build());
}
// sToBblBqZa
public void onCreate() { super.onCreate(); im2.d(); eq3.d(LIVE_POINT); }
public boolean onStartJob(JobParameters p) { hd3.a(this); return false; }
4.7 Alarm 与 Receiver 自重排#
wu3.java:261-312、BpFZcYhmZ.java:20-28:
static void scheduleDailyAlarm(Context context) {
PendingIntent pi = PendingIntent.getBroadcast(context, 74655,
new Intent(context, BpFZcYhmZ.class), flags());
alarmManager.cancel(pi);
// KeepCallbackImp 内置字符串解码为 10:00;解析失败则回退 10:00
Calendar next = Calendar.getInstance();
if (nowIsAfter(10, 0)) next.add(Calendar.DAY_OF_MONTH, 1);
next.set(HOUR_OF_DAY, 10); next.set(MINUTE, 0);
next.set(SECOND, 0); next.set(MILLISECOND, 0);
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + (next.getTimeInMillis() - System.currentTimeMillis()), pi);
}
public void onReceive(Context context, Intent intent) {
im2.d();
eq3.d(ALARM_LIVE_POINT);
wu3.b(context); // 下一次
}
它使用的是 set() + ELAPSED_REALTIME_WAKEUP:属于唤醒型 Alarm,但 set() 仍是非精确调度,不是 exact Alarm;Doze、系统合批和 OEM 策略仍可造成漂移或延迟。
4.8 PeriodicWork#
wu3.java:314-350、kcTBvDgL.java:27-35:
static void schedulePeriodicWork(Context context) {
long minutes = v93.c().f15284c; // 默认 15
if (minutes == 0) { cancelUniqueWork(NAME); return; }
long interval = Math.max(TimeUnit.MINUTES.toMillis(minutes), 900_000L);
long flex = Math.min(300_000L, interval);
enqueueUniquePeriodicWork(NAME, /* policy=1 */, kcTBvDgL.class, interval, flex);
}
public Result doWork() {
im2.d();
eq3.d(WORK_LIVE_POINT);
return Result.success();
}
4.9 系统事件再拉起#
z7.java:20-90:
public void onReceive(Context context, Intent intent) {
String action = intent != null ? intent.getAction() : null;
if (!SUPPORTED_ACTIONS.contains(action)) return;
long now = System.currentTimeMillis();
if (now - lastByAction.getOrDefault(action, 0L) < 500L) return;
lastByAction.put(action, now);
im2.d();
eq3.d(SYSTEM_EVENT_LIVE_POINT);
}
ZPHDnIht.java:22-39:
public void onReceive(Context context, Intent intent) {
im2.d();
if (BOOT_COMPLETED.equals(intent.getAction())) eq3.d(BOOT_POINT);
else if (MY_PACKAGE_REPLACED.equals(intent.getAction())) eq3.d(REPLACE_POINT);
}
4.10 常驻通知删除后再启 Service#
m71.java:189-197:
Intent restart = new Intent(context, gXXfik.class)
.setPackage(context.getPackageName());
notification.deleteIntent = SDK_INT < 35
? PendingIntent.getForegroundService(context, requestCode(), restart, flags())
: PendingIntent.getService(context, requestCode(), restart, flags());
notification.when = System.currentTimeMillis() + TimeUnit.DAYS.toMillis(365);
notification.contentIntent = actionResidentPendingIntent;
4.11 场景通知统一门禁#
u32.java:50-169 的等价逻辑:
static boolean canNotify(int type, Scene scene, boolean specialCall) {
if (!NotificationManager.areNotificationsEnabled()) return false;
if (!specialCall) {
if (abMode && scene != null) {
if (now - last("notify_scene_last_" + scene.key) <= scene.cooldown) return false;
} else {
if (now - lastType(type) <= cooldownFor(type)) return false;
}
}
if (!abMode && (hour < 7 || hour >= 23)) return false;
if (!specialCall && now - firstInstallTime < 300_000L) return false;
if (isKeyguardLocked() || !powerManager.isInteractive()) return false;
if (!abMode && orientation == ORIENTATION_LANDSCAPE) return false;
return MyApplication.f4797c; // 后台
}
static void markShown(int type, Scene scene) {
save(lastTypeKey(type), now);
save("notify_scene_last_" + scene.key, now);
}
由于原方法失败,specialCall 是对 Kotlin 默认 mask 的语义化命名。广告返回调用可见会跳过一部分标准限制,但完整边界为 I。
4.12 普通通知、固定 ID 与连续提醒#
s32.java:108-277、v32.java:43-104:
static void show(Context c, String title, String body,
String compactButton, String expandedButton,
Intent click, Bitmap image, boolean silent) {
click.setData(Uri.parse("https://google.com?q=" + System.currentTimeMillis()));
RemoteViews small = ...; RemoteViews big = ...; RemoteViews middle = ...;
// 设置 title、button、image
Intent cancel = new Intent("com.action.CANCEL_REPEAT")
.setComponent(new ComponentName(c, NotifyRepeatReceiver.class));
NotificationCompat.Builder b = new Builder(c,
silent ? "channel_id_remind_silence" : "channel_id_remind");
b.setDeleteIntent(PendingIntent.getBroadcast(..., cancel, ...));
b.setContentIntent(PendingIntent.getActivity(..., click, ...));
notificationManager.notify(8194, b.build());
if (!silent) {
int repeats = isSamsung() ? 1 : 3;
cancelPreviousRepeatJob();
repeatJob = launch {
repeat(repeats) {
delay(4000L);
if (stillAllowed) show(..., true);
}
};
}
}
v32 反编译文本把 areNotificationsEnabled()==true 分支打印成“没有通知权限”,明显存在控制流恢复异常;所以 stillAllowed 的精确权限判断为 U。
4.13 广告退出召回#
kf.java:103-110 与 g.java:116-146:
// lifecycle 进入后台
MyApplication.f4797c = true;
if (MyApplication.b && u6.f21074c) {
postDelayed(1000L, AD_GO_BACK_TASK);
}
// AD_GO_BACK_TASK
u6.f21074c = false;
if (u32.canNotify(/* specialCall */)) {
markShown(TYPE_1, AD_GO_BACK);
Intent i = new Intent(app, OutOpenActivity.class)
.putExtra("action", "notify_ad_retrieve");
show("Oops! looks like you tapped an ad. Tap to go back!", "Back", i);
}
4.14 通知清理召回#
NotificationListener.java:74-117:
public void onNotificationPosted(StatusBarNotification sbn) {
if (sbn.isOngoing() || APP_PACKAGE.equals(sbn.getPackageName())) return;
String title = sbn.getNotification().extras.getString(EXTRA_TITLE, "");
CharSequence text = sbn.getNotification().extras.getCharSequence(EXTRA_TEXT);
cancelNotification(sbn.getKey());
launch {
NotificationItem item = new NotificationItem(
0L, sbn.getPackageName(), title, String.valueOf(text), now);
dao.insert(truncateTitleAndContent(item));
}
todayCount++;
if (todayCount >= 20 && canNotify(TYPE_1, NOTIFY_CLEAN)) {
markShown(TYPE_1, NOTIFY_CLEAN);
todayCount = 0;
show(getString(notifications_filtered_keep_your_bar, oldCount),
"View", action("notify_notifyClean"));
}
}
4.15 FCM 本地模板与保活入口#
NaKMPne.java:51-141:
public void onMessageReceived(RemoteMessage msg) {
im2.d();
eq3.d(FCM_LIVE_POINT);
if (msg.c() == 1) { // Firebase RemoteMessage: delivered priority == high
if (areNotificationsEnabled()) {
Template t = randomOf(LOCAL_TEMPLATES_10);
show(t.title, "", t.button, t.button,
action("notify_sub_high"), t.icon);
}
}
String priority = firstNonNull(bundle["google.original_priority"],
bundle["google.priority"]);
if ("high".equals(priority)) {
// 可见:App 后台、非锁屏、非横屏、距 live point >=5min、07:00-23:00
// 后续执行体 JADX 未完整恢复:U
}
}
public void onNewToken(String token) { lw0.a(this, token); }
该直接模板分支只检查通知总开关,没有调用 u32.a() 的统一冷却/时段门禁,这是与本地场景通知不同的关键实现差异。
5. 开发核对清单#
- 用
jadx/resources/AndroidManifest.xml:354-396对照自有 Provider/Service/Receiver/Job/FCM 声明与 exported/permission。 - 对
WpCyBN、im2、gXXfik、PsaeNNErXb、hd3、wu3逐条建立后台启动时序图,不要把任一调度请求写成“必定保活成功”。 - 对
u32.a()和v32.invokeSuspend()回看 smali/DEX,重点确认 Kotlin 默认参数 mask 与连续提醒权限分支。 - 对
f81.g()回看 string-switch smali,确认resident_speed/网络通知究竟落 Network Traffic 还是 Speed Test;当前 Java 伪代码显示 Network Traffic。 - 真机至少覆盖 Android 12L、13、14、15、16 与 Samsung/非 Samsung;记录 FGS start 异常、Job/Alarm 实际时间、ID8194 更新次数、Channel 样式。
- 代理抓包核验 FCM/Remote Config;本册未证明线上 topic 推送规则与远控当前值。
6. 未验证与风险#
- 本轮未操作设备、未抓包、未执行服务端推送;所有运行成功率为 U。
- JADX 共 76 个错误;上述六个关键失败方法需要 smali 或动态验证补齐。
- Android 14+ 对后台 FGS 与
specialUse有严格限制;Manifest/代码里的重启尝试不等于获系统许可。 AlarmManager.set(type=2)对应ELAPSED_REALTIME_WAKEUP,会请求唤醒设备;但set()非 exact,“每天 10:00”仍只是请求时间,可能被系统合批或延迟,不保证准点。- WorkManager 15 分钟是最小请求周期,不保证 15 分钟执行一次。
- 网络 50/100 场景只找到枚举/路由,未找到 App 自有生产者。
- 未发现 Remote Config/FCM 直接下发通知 title/body 的读取,但服务端仍可能控制消息类型、优先级和到达频率。