
Android后台生存战Foreground Service、WakeLock与自恢复在tg-ws-proxy-android中的实践【免费下载链接】tg-ws-proxy-androidAndroid-форк популярного приложения Flowseal - tg-ws-proxy - локальный прокси-сервер MTProto с проксированием CF или без для частичного обхода проблем загрузки Telegram项目地址: https://gitcode.com/gh_mirrors/tg/tg-ws-proxy-androidtg-ws-proxy-android是运行在 Android 上的 Telegram 本地 MTProto 代理应用可通过 CloudFlare WebSocket 转发或部分绕过 Telegram 加载问题。对代理类应用来说真正的难题不是能不能跑起来而是能不能一直活着——系统杀后台、CPU 休眠、意外重启都会让代理悄悄掉线。本文以该开源项目为样本拆解它在 Foreground Service、WakeLock 和自恢复上的三层防御设计新手也能看懂。一、为什么代理应用必须在后台生存 ️Telegram 走本地代理后只要代理进程一死消息收发立刻受阻。而 Android 出于省电考虑对后台进程非常狠系统内存紧张时随时可能回收进程手机锁屏后 CPU 进入休眠网络线程可能停摆用户从最近任务划掉应用进程往往跟着被杀设备重启后任何应用默认都不会自己跑起来。ProxyService.kt 针对这四种死法逐一设防构成一套完整的 Android 后台服务保活方案。二、第一道防线Foreground Service 前台服务为什么必须用前台服务普通服务在后台随时会被系统回收。startProxy() 在启动代理引擎前先调用startForeground()把服务顶到前台Android 14SDK 34上声明了FOREGROUND_SERVICE_TYPE_SPECIAL_USE类型并在 AndroidManifest.xml 中同步标注foregroundServiceTypespecialUse及用途说明更早版本走传统startForeground()路径。这意味着系统把它视为用户明确要用的服务杀进程的概率大幅下降。一条能干活的常驻通知前台服务必须挂一条常驻通知这个项目的通知见 createNotification()被设计得很实用通知特性作用每 3 秒刷新流量统计实时显示上行/下行字节数与活跃连接数内置重启操作按钮代理卡死时不用进应用通知栏一键重启内置断开操作按钮通知栏一键停止服务点击通知跳转应用快速回到设置界面低优先级、静默、无震动常驻但不打扰 细节通知更新做了节流NOTIFICATION_MIN_UPDATE_MS避免频繁重建通知条目导致通知栏抖动这是长驻前台服务的常见优化。划掉应用卡片也不掉线manifest 中服务声明了stopWithTaskfalse配合 onTaskRemoved() 的空实现——用户在最近任务里上滑划掉应用进程照常存活。这对很多国产 ROM 尤其关键它们默认会在清后台时杀掉服务。三、第二道防线WakeLock 防 CPU 休眠前台服务解决的是进程被杀但还有另一种隐蔽故障CPU 休眠。锁屏后 Android 会让 CPU 进入 Doze 状态即使进程活着数据面也会假死。解法是部分唤醒锁PARTIAL_WAKE_LOCK。acquireWakeLock() 的核心参数值得学习带超时的获取acquire(30分钟)而非无超时——无限期 WakeLock 容易被系统忽略甚至引起耗电投诉带超时是更被接受的做法25 分钟自动续期refreshWakeLock() 每 25 分钟释放并重新获取一次 WakeLock抢在 30 分钟系统超时之前续命相当于无限续期的锁。这两个常量 WAKELOCK_TIMEOUT_MS 与 WAKELOCK_REFRESH_MS 的差值5 分钟安全窗口就是整个续期策略的全部精髓。停止服务时releaseWakeLock() 负责及时归还避免耗电——拿了要还是 WakeLock 的最佳实践。四、第三道防线三层自恢复机制 即使前两道防线都失守进程被强杀这套自恢复设计也能让代理起死回生1. 被杀后自动带配置重启START_REDELIVER_INTENTonStartCommand() 有两个关键动作每次启动都把绑定 IP、端口、数据中心 IP 池、CloudFlare 开关、密钥等参数全部存成成员变量lastPort、lastSecretKey等返回值恒为START_REDELIVER_INTENT——系统杀掉服务后会重新拉起并补发 intent。当补发的 intent 为null时服务检查已保存的参数只要之前配置过就用原配置自动重启代理用户完全无感。2. 重启设备后自动拉起BootReceiver开机自启由 BootReceiver.kt 实现流程是监听BOOT_COMPLETED与QUICKBOOT_POWERON广播注册见 AndroidManifest.xml用goAsync()延长回调生命周期在 IO 线程里读 DataStore检查 SettingsStore 里的auto_start_on_boot开关应用设置页可手动开启开关开启则调用 ProxyController.startFromSavedSettings()按用户保存的全部配置启动前台服务。⚠️ 官方提醒部分 ROM 上开机自启不会秒级触发可能要等系统完全启动或首次解锁后才拉起属正常现象见 strings.xml 帮助文案。3. 状态随时可查、一键可控快捷磁贴ProxyTileService.kt 把代理状态做成了下拉通知栏的快捷磁贴订阅ProxyService.isRunning状态流磁贴实时显示已连接/已断开点一下即可启停——相当于把保活状态做成了随时可验证的 UI。五、给普通用户的实用建议 ✅如果你也在运行这个代理或自研类似应用可以照这份清单自检允许通知Android 13 需授予通知权限前台服务的常驻通知才可见忽略电池优化设置 → 应用 → tg-ws-proxy-android → 电池 → 不限制能显著降低被 Doze 机制干扰的概率开启开机自启在应用设置页打开自动启动开关SettingsTab.kt锁后台卡片国产 ROM 记得把应用锁在最近任务里防止一键加速清掉别划掉通知常驻通知是前台服务的保命牌关掉通知渠道会触发系统异常。六、小结tg-ws-proxy-android 的后台保活方案可以总结为一张三层防线表威胁防线对应实现系统回收进程Foreground Service specialUseProxyService.kt划掉应用卡片stopWithTaskfalseonTaskRemovedAndroidManifest.xml锁屏 CPU 休眠30 分钟超时 25 分钟续期 WakeLockacquireWakeLock()进程被强杀START_REDELIVER_INTENT 参数记忆onStartCommand()设备重启BootReceiver 开机自启开关BootReceiver.kt对想学 Android 后台开发的人来说这套代码是教科书级的案例前台服务抢身位、WakeLock 保 CPU、参数记忆 广播监听兜底重启——三层叠加才能让一个代理应用在严苛的 Android 后台环境里长命百岁。【免费下载链接】tg-ws-proxy-androidAndroid-форк популярного приложения Flowseal - tg-ws-proxy - локальный прокси-сервер MTProto с проксированием CF или без для частичного обхода проблем загрузки Telegram项目地址: https://gitcode.com/gh_mirrors/tg/tg-ws-proxy-android创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考