AutoJs6 中文文档 下载 App

无障碍服务自动断开 — 原因与 7 种解决方法

问题现象

脚本运行中突然停住 → 检查发现 AutoJs6 的无障碍服务被系统关闭了 → 重新开启后脚本继续 → 过一段时间又断开。

根本原因

Android 系统(尤其是定制 ROM)会自动清理后台进程,为前台应用腾出资源。无障碍服务作为后台服务是主要清理对象。

解决方案

方案一:加入电池优化白名单(最有效)

这是最推荐的方案,解决了 80% 以上的断连问题。

操作步骤:
1. 打开系统设置 → 电池 / 电量管理 / 省电模式
2. 找到 AutoJs6
3. 设置为"不限制"或"无限制"或"允许后台活动"

方案二:加入自启动白名单

在各厂商的自启动管理中手动开启 AutoJs6 自启动:

厂商设置路径
小米 / Redmi安全中心 → 应用管理 → 自启动
华为 / 鸿蒙手机管家 → 自启动管理 + 关联启动
OPPO设置 → 电池 → 允许应用自启动
Vivoi管家 → 应用管理 → 自启动
一加设置 → 电池 → 后台限制 → 不限制
三星设置 → 应用 → 自动运行应用 → 开启 AutoJs6

方案三:锁定后台

1. 打开最近任务列表
2. 找到 AutoJs6 应用卡片
3. 长按(或下拉 / 点击菜单按钮)
4. 选择"锁定"或"保留"
5. 之后一键清理不会关闭它

方案四:开启前台服务

v6.7 新增的前台服务配置让 AutoJs6 以更高优先级运行:

AutoJs6 → 设置 → 无障碍 → 前台服务 → 开启

前台服务会在状态栏显示通知图标,系统会把它视为"活跃应用",减少清理。

方案五:重启策略

v6.7 新增的重启策略功能:

AutoJs6 → 设置 → 无障碍 → 重启策略
  → 配置异常退出后的快速重启

方案六:脚本内自动监控

在脚本开头加入监控逻辑,服务断开时自动提示或重启:

/**
 * 无障碍服务监控脚本
 */
function monitorAccessibility() {
    if (!auto.state) {
        console.error("⚠️ 无障碍服务已断开!");
        
        // 弹窗提醒用户
        dialogs.alert(
            "无障碍服务断开",
            "AutoJs6 的无障碍服务被系统关闭了,请手动重新开启。",
            "去开启"
        ).then(() => {
            auto.openAutoSetting();  // 跳转到设置页
        });
        
        return false;
    }
    return true;
}

// 主脚本开头先检查
if (!monitorAccessibility()) {
    exit();
}

// 定期检查(每 30 秒一次)
setInterval(() => {
    monitorAccessibility();
}, 30000);

// ... 继续你的脚本逻辑

方案七:定时心跳(进阶)

某些极端情况下甚至需要定时"戳一下"无障碍服务:

// 每 5 秒做一个无意义但有效的选择器查询
// 这样可以保持无障碍服务的活跃状态
setInterval(() => {
    try {
        root();  // 只获取根节点,不做实际操作
    } catch (e) {
        // 忽略异常
    }
}, 5000);

ADB 一键白名单

如果有电脑和 ADB,可以一键设置白名单:

# 小米 / MIUI 系列
adb shell dumpsys deviceidle disable

# 通用(关闭所有应用的 Doze)
adb shell dumpsys deviceidle disable all

# 设置 AutoJs6 为不受 Doze 影响
adb shell dumpsys deviceidle whitelist +moe.shizuku.privileged.api

注意:ADB 设置通常需要电脑连接,重启后可能失效。

诊断脚本

/**
 * 一键诊断无障碍服务状态
 */
function diagnoseAccessibility() {
    console.log("===== AutoJs6 诊断 =====");
    
    // 1. 服务状态
    console.log("无障碍服务: " + (auto.state ? "✓ 正常" : "✗ 已断开"));
    
    // 2. AutoJs6 进程状态
    let running = shell("pidof org.autojs.autojs6", false).result.trim();
    console.log("进程存在: " + (running ? "✓ PID=" + running : "✗ 不存在"));
    
    // 3. 电池优化状态
    let pkg = context.getPackageName();
    let isIgnored = powerManager.isIgnoringBatteryOptimizations(pkg);
    console.log("电池优化白名单: " + (isIgnored ? "✓ 已加入" : "✗ 未加入"));
    
    // 4. 前台服务状态
    // console.log("前台服务: " + (foregroundService ? "✓ 运行中" : "✗ 未运行"));
    
    // 5. 屏幕捕获权限
    let hasCapture = images.canCaptureScreen();
    console.log("屏幕捕获权限: " + (hasCapture ? "✓ 已授权" : "✗ 未授权"));
    
    console.log("==========================");
    
    if (!auto.state) {
        dialogs.alert("检测到问题", "无障碍服务未开启,需要手动重新开启");
        auto.openAutoSetting();
    }
}

diagnoseAccessibility();

各 ROM 特殊情况

ROM断连严重度推荐方法
MIUI⭐⭐⭐⭐⭐安全中心自启 + 电池白名单 + 锁定后台
ColorOS⭐⭐⭐⭐自启动管理 + 后台冻结关闭
EMUI / 鸿蒙⭐⭐⭐⭐手机管家自启 + 关联启动
OriginOS⭐⭐⭐后台运行管理
原生 Android⭐⭐电池优化白名单基本够用

终极方案

如果上面所有方法都试过了还是断连,考虑:

  1. 换设备:某些老设备 / 低端机后台管控特别严
  2. 用 Tasker + AutoJs6 插件:Tasker 的调度引擎比 AutoJs6 自己的更可靠
  3. 开发模式 / Root:Root 后用 Shell 命令定期检测 + 重启
  4. 接受现实:某些 ROM 就是不让你后台跑自动化

总结

最有效的三件事:

  1. ✅ 电池优化白名单(不限制)
  2. ✅ 厂商自启动白名单
  3. ✅ 锁定后台