CleanTool v2.3.1 保活与拉活反编译代码册
CleanTool v2.3.1 保活与拉活反编译代码册返回竞品库
报告口径本页直接渲染本地报告真源;静态能力、动态观察、推断和线上未验证项不得互相替代。

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. 开发核对清单#

  1. 用 jadx/resources/AndroidManifest.xml:354-396 对照自有 Provider/Service/Receiver/Job/FCM 声明与 exported/permission。
  2. 对 WpCyBN、im2、gXXfik、PsaeNNErXb、hd3、wu3 逐条建立后台启动时序图,不要把任一调度请求写成“必定保活成功”。
  3. 对 u32.a() 和 v32.invokeSuspend() 回看 smali/DEX,重点确认 Kotlin 默认参数 mask 与连续提醒权限分支。
  4. 对 f81.g() 回看 string-switch smali,确认 resident_speed/网络通知究竟落 Network Traffic 还是 Speed Test;当前 Java 伪代码显示 Network Traffic。
  5. 真机至少覆盖 Android 12L、13、14、15、16 与 Samsung/非 Samsung;记录 FGS start 异常、Job/Alarm 实际时间、ID8194 更新次数、Channel 样式。
  6. 代理抓包核验 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 的读取,但服务端仍可能控制消息类型、优先级和到达频率。
竞品拆包报告库 · 逆向结论按证据等级阅读