自动化脚本和微服务都使用js语言,是我们自己实现的一个标准ECMAScript(JavaScript)的子集,比标准JavaScript简单很多,没有编程基础的同学也能很快掌握(我们的应用领域是做脚本,而不是大规模项目,不需要用到很复杂的语法,否则有些新手很难学会);支持标准JavaScript函数库;支持多线程并发编程,在线编辑、动态部署并立即生效。
function main() {
// 启动微信
var ret = launchApp('com.tencent.mm', 'txt*:微信', {maxStep: 40, afterWait: 2000});
if (1 == ret) {
console.log('进入微信成功');
var index = 0;
/* 滚动三次微信 */
while (index < 3) {
scroll('up', {distance: Math.random() * 0.5 + 0.45, duration: parseInt(Math.random() * 200 + 300), afterWait: 2000});
++index;
console.log('滚动:' + index);
}
console.log('任务结束,退出');
} else {
console.log('启动微信失败');
}
}
| 类型名 | 说明 |
|---|---|
| number | 包括整型,和浮点型,例:整型常量 12,浮点型 3.4。 |
| boolean | 支持常量true,false,分别表示真和假,用于if语句的条件表达式。 |
| string | 字符串常量用''或""表示,例:'hello'。支持模版字符串,用``(两个反引号)表示,可以嵌入变量,例:`hello ${name}`,在执行过程中会动态解析字符串值。 |
| array | json数组类型,用[]创建json数组,可以用[]操作符访问数组,第一个元素从0开始,依此类推。注意:数组支持负索引,比如arr[-1]表示取arr的最后一个元素,-2表示倒数第二个元素,依次类推。例:var arr =['z', 12];var a=arr[-1];var b = arr[0];。 |
| object | json对象类型,其本质是键值对,用{}创建json对象,可以用.和[]操作符访问属性。例:var obj = {name:'a', value:12};var a = obj.name; var b = obj['name'];。 |
| 类型 | 运算符 |
|---|---|
| 算数运算符 | +、-、*、/、%、++、-- |
| 比较运算符 | >、>=、<、<=、!=、==(注意这里取消了繁杂的===和!==) |
| 逻辑运算符 | &&、||、! |
| 赋值运算符 | =、+=、-=、*=、/=、%= |
| 字符串运算符 | +、+= |
| 三元运算符 | ?: |
| 其他运算符 | typeof、delete、new |
| 运算符 | 说明 |
|---|---|
| ()、[]、. | 函数调用以及表达式分组、数组访问、对象字段访问 |
| ++、--、!、delete、new、typeof | 一元运算符,只有一个操作数 |
| *、/、% | 二元运算符,乘法、除法、取模 |
| +、- | 二元运算符,加法、减法 |
| ==、!= | 二元运算符,等于、不等于 |
| && | 二元运算符,逻辑与 |
| || | 二元运算符,逻辑或 |
| ?: | 三元运算符,条件 |
| =、+=、*=... | 二元运算符,赋值、运算赋值 |
| 语句 | 说明 |
|---|---|
| var | 声明变量,变量必须先声明才能使用。例:var a = 1, b, c = 'demo'; |
| 表达式 | 表达式用于实现基本的计算。例:b = 1 + a * 5; |
| if(条件)、 else if(条件)、 else | 根据条件执行语句块。例:if (a == 'str') {...} else if (a == 'hello') {...} else {...} |
| switch(条件) | 根据条件选择一个语句块执行。例:switch (a) {case 1:break;} |
| for...of遍历 | 遍历可迭代对象,支持数组、对象、字符串等。例:for(var item of container){...} |
| for循环 | 循环。例:for(var i = 0; i < 10; ++i){...} |
| while(条件){} | 条件为true时执行语句块。例:while(a < 10){...} |
| do{...}while(条件) | 先执行语句块,再判断条件,若为true则继续执行语句块。例:do{...}while(a < 10) |
| function | 函数声明,支持默认参数。例:function main(a = 1, b = 'hello'){...} |
| break | 退出循环,用于逻辑控制。 |
| continue | 中断一次循环,并继续循环中的下一次迭代,用于逻辑控制。 |
| return | 停止执行函数并从该函数返回值,用于逻辑控制。 |
| import | 导入其他脚本,import支持三种方式 1.线上的脚本,2.本地js文件,3.apk资源中的js(asset:前缀在打包apk时添加的js文件),比如:import 'asset:temp.js';直接使用手机本地js文件。例:import 'Xiaomi_runtime'; import '/sdcard/sample.js'; import 'asset:test.js'; |
| 变量必须先声明才能使用。例:var a = 10;。 |
| 支持//和/**/注释。 |
| if、for、while、do-while等,即使仅有一条子语句也必须使用{}。 |
| 不支持匿名函数和闭包,但支持自定义函数赋值给变量或作为函数参数传递。 |
| 暂不支持位运算。 |
| 支持函数默认参数。 |
| 支持import语句,导入脚本。注意:可以使用user.scriptName来访问一个团队内部其他成员的脚本。 |
| 支持模版字符串。 |
| 新增编译指令:__global、__permanent、__day(仅用于移动端脚本),用于 var后,分别表示声明全局变量,持久变量和day变量,全局变量可以在多个模块间共享,可以在不同线程间通信,例:var __global text;持久变量永久存在,在当前脚本文件可见,除非卸载程序;day变量作用域为一天,在当前脚本文件可见,每天0点day变量复位为初始值。 |
| 默认main函数为入口函数,外部可以传递参数给main函数,main返回值为脚本的返回值,可以使用callScript函数可以调用其他脚本。 |
| 支持系统事件回调,cbNotification(textList, className, packageName, rawEvent)、cbWindowChange(textList, className, packageName, rawEvent)、cbMessage(msgId, param1...)、cbForceExit(),开发者可以在脚本中定义这三个函数,当系统收到通知消息或窗口改变事件后,会自动调用回调函数。注意事件回调函数和main函数不在一个线程中执行,可以通过__global变量来进行通信。 |
| 参数名 | 类型 | 说明 |
|---|---|---|
| textList | array | 通知中的文本数组 |
| className | string | 类名 |
| packageName | string | 包名 |
| rawEvent | Event | 原始事件对象 |
// 例子:
function main() {
}
function cbNotification(textList, className, packageName, rawEvent) {
console.log('textList:' + textList + ' className:' + className + ' packageName:' + packageName);
}
| 参数名 | 类型 | 说明 |
|---|---|---|
| textList | array | 窗口中文本 |
| className | string | 类名 |
| packageName | string | 包名 |
| rawEvent | Event | 原始事件对象 |
// 例子:
function main() {
}
function cbWindowChange(textList, className, packageName, rawEvent) {
console.log('textList:' + textList + ' className:' + className + ' packageName:' + packageName);
}
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| msgId | string | 必填 | 消息的唯一标识,系统内置消息id「run_msg」,用于显示程序内部运行的信息。 |
| params... | 可变参数 | 选填 | 任意个参数 |
// 例子:
function main() {
}
function cbMessage(msgId, params) {
console.log('msgId:' + msgId + ' params:' + params);
}
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| state | boolean | 必填 | true表示屏幕打开,false表示屏幕关闭 |
// 例子:
function main() {
}
function cbScreenStateChange(state) {
console.log('cbScreenStateChange:' + state);
}
| 参数名 | 类型 | 必填 | 说明 |
|---|
// 例子:
function main() {
// 自定义悬浮按钮
configFloatButton({items:[{id:'a1', text:'设置'}, {id:'a2', text:'显示'}]})
}
function cbFloatButton(id, text) {
console.log('dealFloatButton id:' + id + ' text:' + text);
// 发送消息给ui处理
sendMessage('myMsg');
}
| 参数名 | 类型 | 必填 | 说明 |
|---|
// 例子:
function main() {
}
function cbForceExit(msgId, params) {
console.log('force exit');
}
| 常量名 | 类型 | 说明 |
|---|---|---|
| rsCurWindowClassName | string | 当前的窗口的类名(仅用于移动端端脚本,需要开启无障碍) |
| rsScreenWidth | integer | 分辨率,屏幕宽,单位像素(仅用于移动端端脚本) |
| rsScreenHeight | integer | 分辨率,屏幕高,单位像素(仅用于移动端端脚本) |
| rsOrientation | boolean | 屏幕方向,true表示竖屏,false表示横屏 |
| rsStatusHeight | integer | 状态栏高,单位像素 |
| rsDensity | float | 屏幕密度 dp和px转换公式:px=dp*rsDensity(仅用于移动端端脚本) |
| rsContext | Context | 上下文context(仅用于移动端端脚本) |
| rsUsername | string | 登录当前设备的用户名(仅用于移动端端脚本) |
| rsWX | string | 当前设备的微信名(仅用于移动端端脚本,仅供联系用) |
| rsDeviceName | string | 当前设备名(仅用于移动端端脚本) |
| rsUUID | string | 当前设备的uuid(仅用于移动端端脚本) |
| rsOpenId | string | 当前用户的openId(仅用于后端脚本) |
| rsIsDev | boolean | 当前是否处于调试状态(仅用于后端脚本) |