常见问题
这里收录了一些常见问题,如果你的问题不在此列,请尝试右上角搜索文档,查阅相关文档;或者在官方博客、搜索引擎、自带示例中搜索。
在查阅文档、网络资料等均未找到答案时,你可以尝试在官方QQ群、官方频道(论坛)中求助,但请注意:
- 提问之前请查阅应用内自带示例(示例支持搜索)、商店(也支持搜索)、官方文档、官方博客、搜索引擎等,是否已经包含了你的问题答案
- 不要用“不能用”、“报错”等含糊字眼,请直接贴出具体代码,具体错误截图或文本(错误需要完整!),运行日志
- 请提供你的Auto.js Pro版本(不要说“最新”,请说具体版本号)、系统、Android版本
- 怀疑是bug的,请先更新到群文件、官网的最新版本尝试是否仍然有问题
显示Toast信息时,自动加上了应用名称前缀
这是定制系统(比如小米、华为)的特性,而非Auto.js自身添加的前缀。
在后台时无法显示Toast
这是系统自身的限制,你可以尝试授予应用通知权限。另外,从Android 11开始,自定义View的Toast内容将无法在后台显示。
在后台时launchApp等无反应
从Android 10开始(部分国内厂商系统可能更早),应用无法在应用启动其他应用、自身界面,因此,launch、launchApp等代码会无反应。
部分国内厂商系统中有一个“后台启动界面”的权限,如果你在应用的权限设置中找到它,可以尝试开启此权限;或者开启“自启动”、“后台启动”等权限。
在后台时无法读写剪贴板
从Android 10开始,应用无法在后台读写剪贴板。如果你在后台时需要和用户交互并读写剪贴板,可以尝试使用悬浮窗获取焦点,再读写剪贴板。
代码运行一段时间后就自动停止,没有任何报错、崩溃
首先你需要确定,你的代码是真的没有报错,你可以将日志目录设置到sdcard(参见setGlobalLogConfig),查看日志文件的内容。
一旦你确定代码是运行一段时间(一般几个小时以上)自动停止,那么有几种原因:
- 内存不足
这可能是设备本身的内存较低,或者是代码中有内存泄露。内存泄露又有多种情况:
- 在Pro 9.2及以前的版本,包括免费版,引擎自身有内存泄露。请更新到Pro 9.3以上版本。
- 代码自身有内存泄露,比如反复创建对象等。典型的错误代码有:
- 被系统杀死
比如消耗资源较高长时间超过100% CPU运行,消耗较高的电量,被系统杀死;或者没有开启前台服务、没有界面、悬浮窗等情况被系统认为低优先级而杀死。
这些情况下除了加入白名单、开启前台服务,保持充电状态时,还有用一些异步方式(比如第二代API)来代替,减少耗电和资源消耗。
- 其他异常
你可以用Logcat来查看进程退出的信息。一般来说,不管是内存不足、被系统杀死还是应用崩溃,在Logcat中都有相关日志。
Logcat一般需要在电脑上使用adb命令,在手机上则需要root权限才能查看完整的日志。
运行脚本时出现"Module toast not found"或者"missing ; before statement"
通常这是因为使用第一代引擎去运行第二代API的脚本。你需要将文件名改名为".node.js"结尾的文件,或在文件前面加上"nodejs";
。
请查阅第二代API的文档。
如何定时运行、根据特定条件自动运行脚本
点击脚本右边的菜单按钮->更多->任务即可设置一个脚本任务。任务可以是定时任务,也可以是开机自动运行、解锁屏幕等条件。
但是必须保持Auto.js Pro后台运行,给予自启动白名单、电源管理白名单等,参见不要杀死我的APP。
打包后如何设置任务、开机启动
使用代码将文件加入任务,可以设置定时任务或者开机自启动等任务,参见定时与任务。
任务如何获取外部参数
如果一个脚本是用任务触发启动的,比如任务中的特定事件(网络状态变化等)触发而启动的,则可以通过engines.myEngine().execArgv.intent
获取启动的intent,从而获取外部参数。
如何把图片和脚本一起打包,或者打包多个脚本
如果除了单脚本以外还有其他脚本、图片、音乐等资源一起打包,则需要使用项目功能。
点击Auto.js Pro的"+"号,选择项目,填写项目名称、包名等信息以后,点击"√"即可新建一个项目。可以在项目中放多个脚本、模块、资源文件,点击项目工具栏的apk打包图标即可打包一个项目,点击工具栏可以重新配置项目。
例如,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。