AutoJs制作简易自动化脚本(持续更新)
一、环境搭建
代码编程建议使用vscode编写
下载安装autojs(建议还是下载4.1.1版本):Auto.js Pro (autojs.org)
2023-2-18免费版已经无法使用,建议使用 autox.js:Releases · kkevsekk1/AutoX · GitHub
调试建议下载雷电模拟器 :雷电安卓模拟器 (ldmnq.com)
安装好auto.js之后记得开启以下操作:
1、先在vscode中下载auto.js插件,并且在查看--控制面板 中输入auto.js回车,就会有相应的命令,
2、开启auto.js的无障碍服务、悬浮窗、连接电脑
3、查看电脑ip:
二、auto.js官方文档
注意!!!!
因为抖音短视频的机制是,当进入页面的时候会有上下视频先进性加载缓存,如下图,所以当我们直接按照控件属性去寻找控件的时候,会一次性找到好多个,一般往往都会取第一个,所以我们一般都要加上visibleToUser()这个属性表示在可视范围内的。
三、开发遇到问题记录
1、当使用截图找相似图的时候,最好不要采用scrcpy的投屏形式进行截屏,直接采用手机截图(因为这样分辨率一样,更好找)
因为有些手机没法永久设置同意截图的权限,导致每次运行都要在截图的时候进行同意权限,那么在刚开始运行脚本的时候就进行设置权限,而这个权限只需要同意一次就可,请求截图只要请求一次,否则会堵塞。
//封装一个截图函数
function imageClick(smallImgpath, saveImgPath, threshold, screen) {
for (var i=0; i<=5; i++) {
if (screen) {
if (sig) {
if (!requestScreenCapture()) { // 请求截图
// console.log("请求截图失败");
exit();
}
sig = false
}
var img = captureScreen(); //截图
images.saveImage(img, "/sdcard/Download/" + saveImgPath);
}
var bg = images.read("/sdcard/Download/" + saveImgPath);
var smallImg = images.read("/sdcard/Download/" + smallImgpath);
var p = findImage(bg, smallImg, {
threshold: threshold
});
if (p) {
click(p.x, p.y)
return 1
}
sleep(1000)
}
}
//在需要的地方的调用即可
imageClick("send.jpg", "3.png", 0.6, true) //第一个参数是需要找的小图,第二参数是大图,第三个参数是相似度,第四个参数是是否需要截图
2、安装问题:
2.1 launchApp(‘应用名’);会失效:因为存在同名软件,这时候使用包名;
2.2 无障碍服务经常被停止,导致AutoJs或者Apk不干活了:给软件设置允许【后台弹出界面】权限
2.3 使用图片识别的方法打包成apk,无法正常执行脚本,应该是打包后的图片路径与代码中的路径不一致,所以导致无法正确识别找到,可以换成计算图形位置来进行计算。
2.4 进行http请求,需要把http写在线程中,吧请求写在关闭弹窗--即关闭脚本处时,会产生异步问题,往往会直接先执行关闭脚本再进行请求——这样就是错的请求不出去,所以可以采用settimeout进行异步处理。
3、 控件属性
3.1 选择框:单选框和多选框都是利用 attr()方法进行塞值
// 修改cb3的checked属性
$ui.cb3.attr("checked", "true");
3.2 bounds范围使用坐标:可以用bounds这个范围来定位这个控件。尽管用这个方法定位控件对于静态页面十分准确,却无法兼容不同分辨率的设备;同时对于列表页面等动态页面无法达到效果,因此使用不推荐该选择器。
3.3
4、UI界面
4.1 列表展示:直接渲染出来一个数组里面的数据
参考文章: autojs之同一种布局的多种实现方式 - 知乎
而<list></list>布局只能是垂直布局,不能横向列表遍历
4.2 在子线程中更改UI的操作
参考文章:https://www.cnblogs.com/x666-6/p/15006044.html
要在ui.run()中进行操作UI界面的改动 - 增删改
4.3 引用VIew,使用setVisibility属性
参考文章: autojs一个经典的飘浮工具栏界面源码_autojs悬浮窗ui界面
5、悬浮窗
5.1 悬浮窗拖动:主要是setOnTouchListener监听事件
在同一个id控件上,既可以移动也可以进行点击事件,这就是监听移动事件,根据移动的距离足够短,我们就可以认为这是点击事件。
6、按钮
6.1 按钮修改状态
四、打包后运行速度很慢
参考文章: autojs内存处理机制代码,避免经常崩溃_autojs运行久了崩溃_
autojs本身的线程代码threads.start(action)有内存泄露
但是使用 Java 的线程存在问题: thread线程中的代码执行结束就会关闭,但是如果该线程代码未执行完毕,即时主线程关闭,该线程也不会关闭 ,没有一种能够安全关闭线程的方法。
如果线程中有死循环.线程是不会运行完就结束的.
因为未跳出子程序.所以结束不了线程.反之,跳出子程序了就说明自动结束了线程.
死循环子程序的解决方法.可以用强制结束线程 ()或用变量来结束线程