利用Android无障碍服务(AccessibilityService)能做什么
可以开发各种各样的自动化脚本程序以及协助脚本,比如:
- 微信自动抢红包
- 微信自动接听电话
- 支付宝蚂蚁森林自动浇水
- 支付宝芭芭农场自动施肥、自动收集能量...
- 各种平台的拓客、引流、营销系统
- 远程控制
基于Android无障碍服务(AccessibilityService)封装的框架
- 简化自动化脚本开发
- 为自动化脚本提供各种增强能力
- 提高脚本易维护性
- 支持html+js/vue开发自动化脚本
- 易于使用的无障碍服务API
- 浮窗管理器:易于实现及管理浮窗
- 步骤器:为快速实现、可复用、易维护的自动化步骤提供框架及管理
- 配套屏幕管理:快速生成输出屏幕截图、元素截图
- 屏幕管理结合opencv:便于屏幕内容识别为自动化提供服务
- 封装webview接口支持html+js/vue开发自动化脚本
基础示例 | 进阶示例 | 高级示例 | 图片截取 |
---|---|---|---|
![]() |
![]() |
![]() |
![]() |
自动收能量 | 自动发朋友圈 | 自动滑动朋友圈 | 无障碍服务开启引导 |
---|---|---|---|
![]() |
![]() |
![]() |
![]() |
防止下拉通知栏 | 通知/Toast监听 | 自动接听微信电话 | 窗口缩放&拖动 |
![]() |
![]() |
![]() |
![]() |

allprojects {
repositories {
//添加jitpack仓库
maven { url 'https://jitpack.io' }
}
}
dependencies {
//按需添加
//基础库(必须)
implementation "com.github.ven-coder.Assists:assists-base:最新版本"
//屏幕录制相关(可选)
implementation "com.github.ven-coder.Assists:assists-mp:最新版本"
//opencv相关(可选)
implementation "com.github.ven-coder.Assists:assists-opcv:最新版本"
//html+js/vue自动化脚本支持(可选,⚠️当前还处于可用但非稳定版本)
implementation "com.github.ven-coder.Assists:assists-web:最新版本"
}
一定要在主模块中注册服务,不然进程被杀服务也会自动被关闭需要再次开启(小米可保持杀进程保持开启,其他vivo、oppo、鸿蒙机型似乎不行)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.ven.assists.simple">
<application
android:name="com.ven.assists.simple.App"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:requestLegacyExternalStorage="true"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true">
<!-- 添加代码 ↓-->
<service
android:name="com.ven.assists.service.AssistsService"
android:enabled="true"
android:exported="true"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<!--android:priority="10000" 可提高服务在设置中的权重,排在前面-->
<intent-filter android:priority="10000">
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/assists_service" />
</service>
<!-- 或者使用下面的服务可以解决一些应用混淆节点的问题,比如微信8.0.51以上版本获取的节点元素错乱问题 -->
<!-- ⚠️ 选其一 -->
<service
android:name="com.google.android.accessibility.selecttospeak.SelectToSpeakService"
android:enabled="true"
android:exported="true"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<!--android:priority="10000" 可提高服务在设置中的权重,排在前面 -->
<intent-filter android:priority="10000">
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/assists_service" />
</service>
<!-- 添加代码 ↑-->
</application>
</manifest>
调用 AssistsCore.openAccessibilitySetting()
跳转到无障碍服务设置页面,找到对应的应用开启服务。
服务开启后执行以下API测试是否成功集成:
AssistsCore.getAllNodes().forEach { it.logNode() }
这段代码是获取当前页面所有节点元素的基本信息在Logcat(tag:assists_log)打印出来,如下图:

至此,已成功集成Assists。如果没有任何输出请检查集成步骤是否正确。
步骤器可以帮助快速实现复杂的业务场景,比如自动发朋友圈、获取微信所有好友昵称、自动删除好友...等等都是一些逻辑较多的业务场景,步骤器可帮助快速实现。
直接在接口 onImpl(collector: StepCollector)
写步骤逻辑,每个步骤自定义步骤的序号,用于区分执行的步骤。如果重复则会以最后一个步骤为准
class MyStepImpl:StepImpl() {
override fun onImpl(collector: StepCollector) {
//定义步骤序号为1的逻辑
collector.next(1) {// 1为步骤的序号
//步骤1逻辑
...
//返回下一步需要执行的序号,通过Step.get([序号]),如果需要重复该步骤可返回Step.repeat,如果返回Step.none则不执行任何步骤,相当于停止
return@next Step.get(2) //将会执行步骤2逻辑
}.next(2) {
//步骤2逻辑
...
//返回下一步需要执行的序号,通过Step.get([序号])
return@next Step.get(3)
}.next(3) {
//步骤3逻辑
...
//返回下一步需要执行的序号,通过Step.get([序号])
return@next Step.get(4)
}
其他步骤
...
}
}
执行前请确保无障碍服务已开启
//从MyStepImpl步骤1开始执行,isBegin是否作为起始步骤,默认false
StepManager.execute(MyStepImpl::class.java, 1, isBegin = true)
// 设置停止标志,将取消所有正在执行的步骤
StepManager.isStop = true
方法名 | 说明 | 返回值 |
---|---|---|
init(application: Application) |
初始化AssistsCore | 无 |
openAccessibilitySetting() |
打开系统无障碍服务设置页面 | 无 |
isAccessibilityServiceEnabled() |
检查无障碍服务是否已开启 | Boolean |
getPackageName() |
获取当前窗口所属的应用包名 | String |
方法名 | 说明 | 返回值 |
---|---|---|
findById(id, filterText?, filterDes?, filterClass?) |
通过id查找所有符合条件的元素 | List |
AccessibilityNodeInfo.findById(id, filterText?, filterDes?, filterClass?) |
在指定元素范围内通过id查找元素 | List |
findByText(text, filterViewId?, filterDes?, filterClass?) |
通过文本内容查找所有符合条件的元素 | List |
findByTextAllMatch(text, filterViewId?, filterDes?, filterClass?) |
查找所有文本完全匹配的元素 | List |
AccessibilityNodeInfo.findByText(text, filterViewId?, filterDes?, filterClass?) |
在指定元素范围内通过文本查找元素 | List |
findByTags(className, viewId?, text?, des?) |
根据多个条件查找元素 | List |
AccessibilityNodeInfo.findByTags(className, viewId?, text?, des?) |
在指定元素范围内根据多个条件查找元素 | List |
getAllNodes(filterViewId?, filterDes?, filterClass?, filterText?) |
获取当前窗口中的所有元素 | List |
方法名 | 说明 | 返回值 |
---|---|---|
AccessibilityNodeInfo.txt() |
获取元素的文本内容 | String |
AccessibilityNodeInfo.des() |
获取元素的描述内容 | String |
AccessibilityNodeInfo.getAllText() |
获取元素的所有文本内容(包括text和contentDescription) | ArrayList |
AccessibilityNodeInfo.containsText(text) |
判断元素是否包含指定文本 | Boolean |
AccessibilityNodeInfo.getBoundsInScreen() |
获取元素在屏幕中的位置信息 | Rect |
AccessibilityNodeInfo.getBoundsInParent() |
获取元素在父容器中的位置信息 | Rect |
AccessibilityNodeInfo.isVisible(compareNode?, isFullyByCompareNode?) |
判断元素是否可见 | Boolean |
方法名 | 说明 | 返回值 |
---|---|---|
AccessibilityNodeInfo.getNodes() |
获取指定元素下的所有子元素 | ArrayList |
AccessibilityNodeInfo.getChildren() |
获取元素的直接子元素 | ArrayList |
AccessibilityNodeInfo.findFirstParentByTags(className) |
查找第一个符合指定类型的父元素 | AccessibilityNodeInfo? |
AccessibilityNodeInfo.findFirstParentClickable() |
查找元素的第一个可点击的父元素 | AccessibilityNodeInfo? |
方法名 | 说明 | 返回值 |
---|---|---|
AccessibilityNodeInfo.click() |
点击元素 | Boolean |
AccessibilityNodeInfo.longClick() |
长按元素 | Boolean |
AccessibilityNodeInfo.paste(text) |
向元素粘贴文本 | Boolean |
AccessibilityNodeInfo.setNodeText(text) |
设置元素的文本内容 | Boolean |
AccessibilityNodeInfo.selectionText(selectionStart, selectionEnd) |
选择元素中的文本 | Boolean |
AccessibilityNodeInfo.scrollForward() |
向前滚动可滚动元素 | Boolean |
AccessibilityNodeInfo.scrollBackward() |
向后滚动可滚动元素 | Boolean |
交流群 | 个人微信 |
---|---|
![]() |
![]() |
1群已满200人,要进1群可加我备注进1群 |
开源不易,您的支持是我坚持的动力!
如果Assists框架对您的项目有帮助,可以通过以下方式支持我喔:
- 给项目点个Star,让更多开发者发现这个框架
- 分享给身边的朋友和同事
- 爱发电支持 - 您的每一份支持都是我们前进的动力
- 一杯Coffee的微信赞赏

付费社群提供的服务:
微信扫扫即可加入

定制开发可直接联系个人微信: x39598
感谢所有的支持者,得到你们的支持我将会更加完善开源库的能力! 🚀
⚠️ 当前处于可用但非稳定版本
本仓库源码中包含了一个通过vite编写的一个自动化脚本示例:assists-web-simple
,可自行下载编译。项目中已经有编译好的vite示例在 simple/src/main/assets/assists-web-simple
目录下,在当前示例App中可直接加载查看这个vite编写的自动化脚本。
assists-web
是基础的web支持库,封装了webview js接口对web端调用的支持,但是对于web端本地开发调试不友好,需要了解android端相关知识
为了支持本地开发调试和动态化加载脚本,特地开发了脚本平台App:AssistsX,可支持脚本的本地安装,在线安装,局域网加载,远程加载