一、Android Accessibility 介绍
也叫Android辅助功能。初衷是为了帮助残疾人士,现在被用来其他地方,比如抢红包、自动安装app等。
它最主要的接口是类AccessibilityService。AccessibilityService是Service的子类,我们可以继承这个类并实现它的抽象方法来监视一个应用的界面元素状态的变化,比如focus变化,一个按钮被click等等。当有这些变化的时候,系统会将这些信息封装在AccessibilityEvent里面,回调AccessibilityService的onAccessibilityEvent(AccessibilityEvent)方法。我们可以实现onAccessibilityEvent来处理这些AccessibilityEvent。
- 免Root自动安装
- 抢红包
- 微信自动回复
- 检查微信好友
- 进程清理
- 判断应用当前状态
- 防卸载
- 浏览器劫持
- 监控密码框
- 跳过用户授权
二、Accessibility使用
1、 首先新建一个类MyAccessibilityService并继承AccessibilityService
代码如下:
class MyAccessibilityService extends AccessibilityService() {
@Override
public void onInterrupt() {
}
@Override
public void onServiceConnected() {
}
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
}
}
onAccessibilityEvent(AccessibilityEvent event)
及onInterruput()
这两个方法是抽象方法,必须重写。
常用API介绍:
-
onServiceConnected()
(可选的方法)系统会在成功连接上你的服务的时候调用这个方法,在这个方法里你可以做一下初始化工作,例如设备的声音震动管理,也可以调用setServiceInfo()进行配置工作。 -
onAccessibilityEvent()
- (必须实现的方法) 通过这个函数可以接收系统发送来的AccessibilityEvent,接收来的AccessibilityEvent是经过过滤的,过滤是在配置工作时设置的。在整个生命周期里会被调用多次 -
onInterrupt()
- (required) 这个在系统想要中断AccessibilityService返给的响应时会调用。在整个生命周期里会被调用多次。 -
onUnbind()
- (optional) 在系统将要关闭这个AccessibilityService会被调用。在这个方法中进行一些释放资源的工作。
2、 辅助类的声明
AccessibilityService继承Service,因此也需要在AndroidManifest.xml中声明:
<service
android:name=".access.MyAccessibilityService"
android:enabled="true"
android:exported="true"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService"/>
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/accessibility"/>
</service>
注意需要加上BIND_ACCESSIBILITY_SERVICE权限。
3、辅助类的配置
meta部分是AccessibilityService的配置信息,这是android 4.0后才支持的,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFeedbackType="feedbackGeneric"
android:accessibilityFlags="flagReportViewIds"
android:canRetrieveWindowContent="true"
android:notificationTimeout="100"
android:packageNames="com.tencent.mm"/>
设置配置信息还有第二种方法,就是在onServiceConnected()方法中使用代码设置,如代码片段1中的注释部分所示。这里的配置有很多属性,我们只研究其中的6个:
android:packageNames
:指定辅助服务监听哪些应用发出事件,多个应用包名之间用逗号分隔,如果不填,则监听手机上所有应用。例如我们现在要利用辅助点击做app的自动安装功能,取值com.android.packageinstaller。如果只关注微信发出的事件,那么取值com.tencent.mm。
android:accessibilityEventTypes
:辅助服务监听的事件类型,例如TYPE_VIEW_FOCUSED、TYPE_VIEW_CLICKED 、TYPE_WINDOW_STATE_CHANGED、TYPE_NOTIFICATION_STATE_CHANGED等等,如果监听全部事件,就取值typeAllMask
android:accessibilityFlags
:辅助服务额外的flag信息,例如FLAG_REPORT_VIEW_IDS可以使回调的事件带上view的ID。
android:accessibilityFeedbackType
:事件的反馈类型,例如通用反馈FEEDBACK_GENERIC、声音反馈FEEDBACK_AUDIBLE、语音反馈FEEDBACK_SPOKEN等。
android:notificationTimeout
:两个同样类型的监听事件发给辅助类的最小时间间隔
android:canRetrieveWindowContent
:是否可以获取窗口内容,一般设置为true
三、项目讲解
项目主要是WhatsApp撞库,检查手机是否注册WhatsApp。
- 实现原理参考文章:android两行代码检测手机号是否注册whatsapp
- 通信使用的是:sekiro