无障碍服务自动断开 — 原因与 7 种解决方法
问题现象
脚本运行中突然停住 → 检查发现 AutoJs6 的无障碍服务被系统关闭了 → 重新开启后脚本继续 → 过一段时间又断开。
根本原因
Android 系统(尤其是定制 ROM)会自动清理后台进程,为前台应用腾出资源。无障碍服务作为后台服务是主要清理对象。
解决方案
方案一:加入电池优化白名单(最有效)
这是最推荐的方案,解决了 80% 以上的断连问题。
操作步骤:
1. 打开系统设置 → 电池 / 电量管理 / 省电模式
2. 找到 AutoJs6
3. 设置为"不限制"或"无限制"或"允许后台活动"
方案二:加入自启动白名单
在各厂商的自启动管理中手动开启 AutoJs6 自启动:
| 厂商 | 设置路径 |
|---|---|
| 小米 / Redmi | 安全中心 → 应用管理 → 自启动 |
| 华为 / 鸿蒙 | 手机管家 → 自启动管理 + 关联启动 |
| OPPO | 设置 → 电池 → 允许应用自启动 |
| Vivo | i管家 → 应用管理 → 自启动 |
| 一加 | 设置 → 电池 → 后台限制 → 不限制 |
| 三星 | 设置 → 应用 → 自动运行应用 → 开启 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 | ⭐⭐ | 电池优化白名单基本够用 |
终极方案
如果上面所有方法都试过了还是断连,考虑:
- 换设备:某些老设备 / 低端机后台管控特别严
- 用 Tasker + AutoJs6 插件:Tasker 的调度引擎比 AutoJs6 自己的更可靠
- 开发模式 / Root:Root 后用 Shell 命令定期检测 + 重启
- 接受现实:某些 ROM 就是不让你后台跑自动化
总结
最有效的三件事:
- ✅ 电池优化白名单(不限制)
- ✅ 厂商自启动白名单
- ✅ 锁定后台