QPython 脚本被后台杀掉——电池优化、自启动、前台服务三管齐下
现象
脚本启动后运行正常,但一段时间后(几分钟到几小时)自动停止,没有任何报错信息。重新打开 QPython 发现脚本已经不跑了。
根本原因
Android 的核心设计理念就是把不活跃的 App 杀掉来省电和释放内存。QPython 长时间运行脚本时,Android 系统会认为 QPython「不活跃」——因为屏幕关了、用户没操作,然后把它的进程杀掉。
这不是 Bug,是 Android 的正常行为。但对需要长时间运行的脚本来说就是致命问题。
三管齐下的解决方案
方案一:忽略电池优化(最重要)
90% 的情况只做这一步就够了。QPython 被电池优化后,Android 会在短时间内杀掉后台进程。
设置路径:
系统设置 → 应用管理 → QPython → 电池优化 → 设为「不优化」或「无限制」
不同 ROM 的名字不同:
- MIUI / HyperOS:设置 → 应用设置 → 应用管理 → QPython → 省电策略 → 无限制
- ColorOS:设置 → 电池 → 耗电管理 → QPython → 允许后台活动
- OneUI:设置 → 应用 → QPython → 电池 → 无限制
方案二:自启动
让 QPython 在开机或系统清理后自动重启:
系统设置 → 应用管理 → QPython → 自启动 → 允许
自启动确保 QPython 在开机、系统清理后台、或某些触发条件下自动复活。
方案三:前台服务
这是最硬核的方案——脚本主动告诉 Android:「我正在做重要的事,别杀我」。QPython 的某些版本支持通过 QSL4A 启动前台服务:
from androidhelper import Android
droid = Android()
# 启动前台服务,让 Android 认为 QPython 正在执行持续任务
# 具体 API 因版本而异,参考 QSL4A 文档
# 启动后会在通知栏显示持续运行状态
# 用完后记得关闭
前台服务需要 FOREGROUND_SERVICE 权限,还需要在通知栏显示一个持续的通知。
进阶技巧
唤醒锁(Wake Lock)
防止屏幕熄灭时 CPU 停止:
droid.wakeLockAcquireFull() # 获取唤醒锁
# ... 长时间运行的脚本 ...
droid.wakeLockRelease() # 用完必须释放
不释放唤醒锁会导致手机一直亮着、耗电极快。用完一定要释放。
定时心跳
让脚本每隔一段时间执行一个轻量操作(如写日志、更新状态栏通知),让 Android 认为 QPython 还有活干:
import time
while True:
# 主要业务逻辑
do_work()
# 心跳:每 30 秒更新一次通知
if time.time() - last_heartbeat > 30:
droid.notify("脚本运行中", f"已运行 {elapsed_minutes} 分钟")
last_heartbeat = time.time()
time.sleep(1)
插着充电器
Android 对插着充电器的设备更宽容——有电源时后台进程更容易存活。长时间运行的脚本建议插着充电器。
检查是否真的被杀了
怎么确认脚本是被系统杀掉了,还是自己崩溃了:
- 用
try / except包主循环,异常时写日志文件:
import traceback
try:
while True:
main_logic()
except Exception:
with open("crash_log.txt", "a") as f:
traceback.print_exc(file=f)
- 如果日志文件最后有 traceback,说明是脚本报错了
- 如果日志文件突然中断没有 traceback,大概率是被系统杀了
各 ROM 特殊处理
| ROM | 额外设置 |
|---|---|
| MIUI / HyperOS | 省电策略设为「无限制」+ 自启动 + 开发者选项里关闭「MIUI 优化」 |
| ColorOS | 允许后台活动 + 锁定后台任务(最近任务界面下拉锁定) |
| OneUI | 电池设为「无限制」+ 设备维护器里把 QPython 加入白名单 |
| 原生 Android | 用 adb 或开发者选项关闭后台限制 |
小结
脚本被后台杀掉是 QPython 长时间运行的头号敌人。先做电池优化忽略,再加自启动,最后用前台服务/唤醒锁作为补充。插着充电器能大幅提高存活率。各 ROM 的设置路径不同,但核心思路一样——让 Android 认为 QPython 有资格持续运行。
继续看最后一个问题:文件路径报错。