QPython 中文文档 下载 App

QPython 脚本被后台杀掉——电池优化、自启动、前台服务三管齐下

现象

脚本启动后运行正常,但一段时间后(几分钟到几小时)自动停止,没有任何报错信息。重新打开 QPython 发现脚本已经不跑了。

根本原因

Android 的核心设计理念就是把不活跃的 App 杀掉来省电和释放内存。QPython 长时间运行脚本时,Android 系统会认为 QPython「不活跃」——因为屏幕关了、用户没操作,然后把它的进程杀掉。

这不是 Bug,是 Android 的正常行为。但对需要长时间运行的脚本来说就是致命问题。

三管齐下的解决方案

方案一:忽略电池优化(最重要)

90% 的情况只做这一步就够了。QPython 被电池优化后,Android 会在短时间内杀掉后台进程。

设置路径:

系统设置 → 应用管理 → QPython → 电池优化 → 设为「不优化」或「无限制」

不同 ROM 的名字不同:

方案二:自启动

让 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 对插着充电器的设备更宽容——有电源时后台进程更容易存活。长时间运行的脚本建议插着充电器。

检查是否真的被杀了

怎么确认脚本是被系统杀掉了,还是自己崩溃了:

  1. 用 try / except 包主循环,异常时写日志文件:
   import traceback
   
   try:
       while True:
           main_logic()
   except Exception:
       with open("crash_log.txt", "a") as f:
           traceback.print_exc(file=f)
  1. 如果日志文件最后有 traceback,说明是脚本报错了
  2. 如果日志文件突然中断没有 traceback,大概率是被系统杀了

各 ROM 特殊处理

ROM额外设置
MIUI / HyperOS省电策略设为「无限制」+ 自启动 + 开发者选项里关闭「MIUI 优化」
ColorOS允许后台活动 + 锁定后台任务(最近任务界面下拉锁定)
OneUI电池设为「无限制」+ 设备维护器里把 QPython 加入白名单
原生 Android用 adb 或开发者选项关闭后台限制

小结

脚本被后台杀掉是 QPython 长时间运行的头号敌人。先做电池优化忽略,再加自启动,最后用前台服务/唤醒锁作为补充。插着充电器能大幅提高存活率。各 ROM 的设置路径不同,但核心思路一样——让 Android 认为 QPython 有资格持续运行。

继续看最后一个问题:文件路径报错。