常见问题

2022年10月22日

常见问题

这里收录了一些常见问题,如果你的问题不在此列,请尝试右上角搜索文档,查阅相关文档;或者在官方博客、搜索引擎、自带示例中搜索。

在查阅文档、网络资料等均未找到答案时,你可以尝试在官方QQ群、官方频道(论坛)中求助,但请注意:

  1. 提问之前请查阅应用内自带示例(示例支持搜索)、商店(也支持搜索)、官方文档、官方博客、搜索引擎等,是否已经包含了你的问题答案
  2. 不要用“不能用”、“报错”等含糊字眼,请直接贴出具体代码,具体错误截图或文本(错误需要完整!),运行日志
  3. 请提供你的Auto.js Pro版本(不要说“最新”,请说具体版本号)、系统、Android版本
  4. 怀疑是bug的,请先更新到群文件、官网的最新版本尝试是否仍然有问题

已启用无障碍服务,但提示“无障碍服务已但并未运行”

正如提示所言,这是Android系统的Bug。

在低于Android11的版本上,这通常是因为开启无障碍服务后应用被杀死导致的;在Android 11版本上,这是系统启动无障碍服务过程的Bug。在Android12及以上,这个问题发生的概率已大大下降。

当你遇到这个问题时,请关闭无障碍服务,等待一段时间后再重新打开无障碍服务;或者关闭无障碍服务,杀死应用,重新打开应用,重新打开无障碍服务。这样尝试多次,直到没有问题为止。

显示Toast信息时,自动加上了应用名称前缀

这是定制系统(比如小米、华为)的特性,而非Auto.js自身添加的前缀。

在后台时无法显示Toast

这是系统自身的限制,你可以尝试授予应用通知权限。另外,从Android 11开始,自定义View的Toast内容将无法在后台显示。

在后台时launchApp、请求截图权限等无反应

从Android 10开始(部分国内厂商系统可能更早),应用无法在应用启动其他应用、自身界面,因此,launch、launchApp、请求截图权限等代码会无反应。

部分国内厂商系统中有一个“后台启动界面”的权限,如果你在应用的权限设置中找到它,可以尝试开启此权限;或者开启“自启动”、“后台启动”等权限。

在后台时无法读写剪贴板

从Android 10开始,应用无法在后台读写剪贴板。如果你在后台时需要和用户交互并读写剪贴板,可以尝试使用悬浮窗获取焦点,再读写剪贴板。

代码运行一段时间后就自动停止,没有任何报错、崩溃

首先你需要确定,你的代码是真的没有报错,你可以将日志目录设置到sdcard(参见setGlobalLogConfig),查看日志文件的内容。

一旦你确定代码是运行一段时间(一般几个小时以上)自动停止,那么有几种原因:

  1. 内存不足

这可能是设备本身的内存较低,或者是代码中有内存泄露。内存泄露又有多种情况:

  • 在Pro 9.2及以前的版本,包括免费版,引擎自身有内存泄露。请更新到Pro 9.3以上版本。
  • 系统自身有内存泄露。典型的是一些模拟器在开启截图以后,surfaceflinger进程存在内存泄露,系统进程的占用内存会越来越大。
  • 代码自身有内存泄露,比如图片处理未回收图片,反复创建图片、创建对象等。典型的错误代码有:
while(true) {
    // 循环中反复创建图片、OCR等昂贵对象...
    let ocr = $ocr.create();
    // ..
}


while(true) {
    let capture = captureScreen();
    // 循环中反复读取小图等资源,即使有回收,也会造成内存碎片
    let tempalte = $images.read('...')
    // ...
    tempalte.recycle();
}

// 中间图片未回收,这里是clip返回的对象没有回收
let img = $images.grayscale($images.clip(...))

// 变量被覆盖,前面的图片没有回收
let img1 = $images.read('...')
img1 = $images.clip(img1, ...);
img1.recycle();
  1. 被系统杀死

比如消耗资源较高长时间超过100% CPU运行,消耗较高的电量,被系统杀死;或者没有开启前台服务、没有界面、悬浮窗等情况被系统认为低优先级而杀死。

这些情况下除了加入白名单、开启前台服务,保持充电状态时,还有用一些异步方式(比如第二代API)来代替,减少耗电和资源消耗。

  1. 其他异常

你可以用Logcat来查看进程退出的信息。一般来说,不管是内存不足、被系统杀死还是应用崩溃,在Logcat中都有相关日志。

Logcat一般需要在电脑上使用adb命令,在手机上则需要root权限才能查看完整的日志。

运行脚本时出现"Module toast not found"或者"missing ; before statement"

通常这是因为使用第一代引擎去运行第二代API的脚本。你需要将文件名改名为".node.js"结尾的文件,或在文件前面加上"nodejs";

请查阅第二代API的文档

如何定时运行、根据特定条件自动运行脚本

点击脚本右边的菜单按钮->更多->任务即可设置一个脚本任务。任务可以是定时任务,也可以是开机自动运行、解锁屏幕等条件。

但是必须保持Auto.js Pro后台运行,给予自启动白名单、电源管理白名单等,参见不要杀死我的APPopen in new window

打包后如何设置任务、开机启动

使用代码将文件加入任务,可以设置定时任务或者开机自启动等任务,参见定时与任务

任务如何获取外部参数

如果一个脚本是用任务触发启动的,比如任务中的特定事件(网络状态变化等)触发而启动的,则可以通过engines.myEngine().execArgv.intent获取启动的intent,从而获取外部参数。

如何把图片和脚本一起打包,或者打包多个脚本

如果除了单脚本以外还有其他脚本、图片、音乐等资源一起打包,则需要使用项目功能。

点击Auto.js Pro的"+"号,选择项目,填写项目名称、包名等信息以后,点击"√"即可新建一个项目。可以在项目中放多个脚本、模块、资源文件,点击项目工具栏的apk打包图标即可打包一个项目,点击工具栏可以重新配置项目。

例如,主脚本要读取同一文件夹下的图片1.png,再执行找图,则可以通过images.read("./1.png")来读取,其中"./1.png"表示同一目录1.png图片;ui中的图片控件要引用同一文件夹的2.png图片则为<img src="file://2.png"/>。Auto.js内置的函数和模块都支持相对路径,但是,其他情况则需要使用files.path()函数来把相对路径转换为绝对路径。

如何使打包的应用隐藏日志界面

打包时在打包配置中勾选隐藏日志界面即可。一般来说,建议脚本不要没有任何界面,否则一些依赖界面的功能会出现错误,或者是容易被系统杀死。

Auto.js自带的模块和函数中没有的功能如何实现

由于Auto.js支持直接调用Android的API,对于Auto.js没有内置的函数,可以直接通过修改Android代码为JavaScript代码实现。例如旋转图片的Android代码为:

import android.graphics.Bitmap;
import android.graphics.Matrix;

public static Bitmap rotate(final Bitmap src,
                            final int degrees,
                            final float px,
                            final float py) {
    if (degrees == 0) return src;
    Matrix matrix = new Matrix();
    matrix.setRotate(degrees, px, py);
    Bitmap ret = Bitmap.createBitmap(src, 0, 0, src.getWidth(), src.getHeight(), matrix, true);
    return ret;
}

转换为JavaScript的代码后为:

importClass(android.graphics.Bitmap);
importClass(android.graphics.Matrix);

function rotate(src, degrees, px, py){
    if (degrees == 0) return src;
    var matrix = new Matrix();
    matrix.setRotate(degrees, px, py);
    var ret = Bitmap.createBitmap(src, 0, 0, src.getWidth(), src.getHeight(), matrix, true);
    return ret;
}

有关调用Android和Java的API的更多信息,参见Work with Java

上次编辑于:
贡献者: hyb1996