Tasker Script 动作详解 JavaScriptlet Java Code Shell 三种脚本能力
Script:突破 Tasker 边界
当你发现"内置 Action 做不到这件事"时,就是 Script 类别出场的时候。Tasker 提供了三种脚本入口,能力从浅到深:
| 入口 | 难度 | 能力 | 版本 |
|---|---|---|---|
| JavaScriptlet | 中 | 嵌入 JS,访问 Tasker API 和变量 | 所有版本 |
| Java Code | 高 | BeanShell(类 Java),完整 Android API + AI 辅助 | v6.6+ |
| Shell Command | 高 | 执行底层 shell 命令,可用 Root | 所有版本 |
为什么需要脚本
内置 Action 覆盖了 190+ 种常见场景,但总有边界情况:
- 你需要做复杂的数学计算或字符串处理(Tasker 变量操作有限)
- 你需要访问 Android 的某个系统 API(没有对应的 Action)
- 你需要做循环、条件、异常处理等复杂逻辑(Flow Control 可能不够)
- 你需要调用 Tasker 插件不支持的第三方 App 的 Intent
JavaScriptlet
JavaScriptlet 是 Tasker 最常用的脚本入口。它执行一段 JavaScript 代码,可以:
- 读写 Tasker 变量:
var battery = tasker.local("%BATT"); tasker.setLocal("%Result", battery * 2); - 访问 Tasker API:控制 Profile、Task、Scene
- 处理复杂数据:数组操作、JSON 解析、正则匹配、字符串处理
- 阻塞或非阻塞执行:可以等待代码执行完再继续
JavaScriptlet 基础语法
// 读取 Tasker 变量
var battery = tasker.getGlobal("%BATT");
// 设置 Tasker 全局变量
tasker.setGlobal("%BatteryDoubled", battery * 2);
// 设置 Tasker 局部变量(仅当前 Task 可见)
tasker.setLocal("%tmp", "临时值");
// 返回值给 Tasker(作为 JSLET 变量)
tasker.returnValue(battery);
JavaScriptlet 常用 API
| API | 功能 |
|---|---|
tasker.getGlobal("%name") | 读取全局变量 |
tasker.setGlobal("%name", value) | 设置全局变量 |
tasker.getLocal("%name") | 读取局部变量 |
tasker.setLocal("%name", value) | 设置局部变量 |
tasker.taskExists("taskName") | 检查 Task 是否存在 |
tasker.runTask("taskName", priority) | 执行另一个 Task |
tasker.enableProfile("profileName") | 启用/禁用 Profile |
tasker.showScene("sceneName") | 显示 Scene |
tasker.notify(title, text, icon) | 创建通知 |
tasker.say(text) | TTS 朗读 |
JavaScriptlet 实战示例
复杂数学计算:
// 计算电池续航估算
var battery = parseFloat(tasker.getGlobal("%BATT"));
var drainRate = 2; // 假设每小时消耗 2%
var remainingHours = battery / drainRate;
tasker.setGlobal("%BatteryHoursLeft", Math.round(remainingHours));
解析复杂字符串:
// 从 URL 提取查询参数
var url = tasker.getGlobal("%LastURL");
var params = {};
url.split("?")[1].split("&").forEach(function(pair) {
var keyVal = pair.split("=");
params[keyVal[0]] = keyVal[1];
});
tasker.setGlobal("%ApiKey", params.api_key || "");
JavaScriptlet 的限制
- 不是完整浏览器环境——没有 DOM、没有 Node.js API
- 无法发起 HTTP 请求(用 Internet → HTTP Request 代替)
- 无法访问 Android 原生 API(用 Java Code 代替)
- 代码写在一个输入框里,没有语法高亮和调试器
Java Code(v6.6+)
Java Code 是 Tasker 6.6 新增的强大入口,执行环境是 BeanShell(类 Java 语法,比 Java 更宽松)。与 JavaScriptlet 的区别:
- 完整的 Android API 访问——可以调用 Context、Intent、LocationManager 等任何 Android API
- AI 代码助手——点放大镜图标让 AI 生成代码
- RxJava2 支持——异步操作更优雅
- 可以返回 Tasker 或 Java 变量
Java Code 基础示例
// 获取 Accessibility Service
var taskerService = tasker.getAccessibilityService();
// 获取 Location Manager
var locManager = context.getSystemService(context.LOCATION_SERVICE);
// 发起 Intent
var intent = new android.content.Intent(android.content.Intent.ACTION_VIEW);
intent.setData(android.net.Uri.parse("[目标 URL]"));
context.startActivity(intent);
AI 代码助手
Java Code 编辑器里有个放大镜图标,点击后可以:
- 让内置 AI 根据你的自然语言描述生成 BeanShell 代码
- 把当前代码复制到外部 AI(如 ChatGPT、Gemini)请求修改
- AI 直接修改编辑器里的代码
这让"不会 BeanShell 也能写脚本"成为可能——描述你想做什么,AI 帮你写。
Shell Command
Shell Command 可以执行 Android shell 命令,相当于 adb shell 的直接入口:
需要 Root 才能做的事:
- 修改系统设置
- 杀掉系统进程
- 访问 /data 目录
- 挂载分区
无 Root 也能做:
- 执行 toybox / busybox 的基础命令(ls、cat、echo)
- 执行安装在 PATH 里的可执行文件
input keyevent模拟按键
示例:
# 模拟返回键
input keyevent KEYCODE_BACK
# 获取屏幕状态
dumpsys power | grep Display
# 截屏(需 Root)
screencap -p /sdcard/screen.png
Shell Command 的风险
- 执行危险命令可能导致系统异常
- 部分 OEM 系统的 shell 功能受限
- 出错时 Tasker 只能拿到 exit code,拿不到完整错误栈
建议:能用 JavaScriptlet / Java Code 解决的,优先用它们。Shell Command 是最后兜底。
脚本选择建议
| 场景 | 推荐入口 |
|---|---|
| 读写 Tasker 变量 + 简单计算 | JavaScriptlet |
| 数组/JSON/正则处理 | JavaScriptlet |
| 访问 Android 原生 API | Java Code |
| UI 自动化(Accessibility) | Java Code |
| 需要 Root 的底层操作 | Shell Command |
| 不会写代码想尝试 | Java Code + AI 助手 |