专栏首页中国Android研究院自动化篇 - 黑客们使用的自动化方案,很多人还不知道

自动化篇 - 黑客们使用的自动化方案,很多人还不知道

阅读文本大概需要 8 分钟。

聊到 App 端的自动化,大家能想到的可能是 Appium、UIAutomator2、Airtest 等一系列自动化框架。

Android 系统内置了一个 无障碍服务,能完成一系列自动化操作;相比其他自动化框架,无障碍服务可以能完全脱离 PC 端,手机也不需要获取 Root 权限。另外,无障碍服务操作起来更加高效、更加智能。

今天,我们来聊聊无障碍服务,后续一系列项目实战将使用这个方案来实现。

01

概念定义

谷歌官方对无障碍服务的定义如下:无障碍服务是一个为残疾人或可能暂时无法与设备完全互动的人提供用户界面扩展功能的应用程序无障碍服务提供了一个服务,方便我们操作一些应用完成一系列定义好的操作。

很多手机厂商内置的抢红包提醒功能就是利用 Android 系统提供的无障碍服务实现的。

02

使用方法

要开启无障碍服务,只需要 5 个简单的步骤即可实现。

  1. 使用 Android Studio 新建一个 Android 项目
  2. 创建无障碍服务的配置文件
  3. 创建一个无障碍服务的子类,并配置 AndroidManifest 文件
  4. 重写服务的方法,针对页面变化、内容变化、通知变化,编写业务逻辑
  5. 开启无障碍服务

无障碍服务配置文件 可以配置无障碍服务监听的应用和事件。

其中,packageNames 指定监听的应用程序对象的应用包名;accessibilityEventTypes 指定要监听的事件类型;description 为无障碍服务的描述信息;notificationTimeout 是事件发送的时间间隔,一般默认为 100 毫秒。

比如,微信的typeWindowStateChanged、typeWindowContentChanged 两个事件,事件发送时间为 100 毫秒。

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeWindowStateChanged|typeWindowContentChanged"
    android:accessibilityFeedbackType="feedbackAllMask"
    android:canRetrieveWindowContent="true"
    android:description="@string/service_wechat_description"
    android:notificationTimeout="100"
    android:packageNames="com.tencent.mm" />

然后,新建一个 无障碍服务的子类,重写无障碍服务内的 3 个方法。

public class WeChatService extends AccessibilityService{
    @Override
    public void onAccessibilityEvent(AccessibilityEvent event)
    {
        //监听事件
    }

   @Override
    public void onInterrupt()
    {
        //服务断开
    }

    @Override
    protected void onServiceConnected()
    {
        super.onServiceConnected();
        //服务开启
    }
}

onAccessibilityEvent(event) 可以拿到对拿到目标应用配置文件中配置的事件类型,针对每一个事件类型,可以编写对应的应用逻辑。

onServiceConnected() 方法在无障碍服务被开启的同时,会被触发。

onInterrupt() 方法在服务被终端的时候触发。

接着,需要在项目的配置文件 AndroidManifest.xml 中 配置服务,并指定上面编写的配置文件。

<service
       android:name=".WeChatService"
       android:enabled="true"
       android:exported="true"
       android:label="@string/service_wechat_label"
       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/config_accessibility" />
</service>

最关键的是 编写事件的逻辑,根据配置文件中指定的事件类型和页面元素,包含类型、包名、顶部 Activity 来编写响应的逻辑。

比如,要实现抢红包的功能,就需要对页面更新和内容更新两个事件进行处理,如果页面元素中出现了红包的标识,就获取到红包所在的元素,执行点击操作,就可以实现抢红包的这一操作。

最后,就是 打开无障碍服务

在布局文件中放一个按钮,判断无障碍服务是否打开,如果没有打开,就跳到无障碍服务设置界面,手动打开即可。

/**
  * 检查当前无障碍服务是否开启
  *
  * @param serviceName 服务名称
  * @return 服务是否启用
*/
@SuppressLint("LongLogTag")
public boolean checkAccessibilityEnabled(String serviceName)
{
    List<AccessibilityServiceInfo> accessibilityServices =
                mAccessibilityManager.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_GENERIC);
    for (AccessibilityServiceInfo info : accessibilityServices)
    {
        Log.e("checkAccessibilityEnabled", info.getId());
        if (info.getId().equals(serviceName))
        {
            return true;
        }
    }
    return false;
}

03补充一下

上面的步骤介绍了使用无障碍服务的完整流程,基于此,我们使用一部手机,就能完成应用内大部分的自动化操作。

后续我将利用 一系列项目,带大家一步步地进行学习和项目实战。

本文分享自微信公众号 - IT烂笔头(nj_android)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-08-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 强烈建议!让你的团队强制推行ConstraintLayout!

    ConstraintLayout(约束布局)在2016年的Google I/O大会上就推出来了,经历这两年的迭代,功能已经非常的成熟了。一次偶然的机会,在项目中...

    吴延宝
  • 高工做CPU架构适配的心得体会

    如上图所示,armabi的库可以运行在x86、x86-64以及armabi-v7a和armabi-v8a的CPU架构上,从下往上的方向上,下方架构的so库可以兼...

    吴延宝
  • 【谷歌官方文档】1.1 建立第一个APP

    本小节介绍如何使用Android Studio或者是SDK Tools中的命令行来创建一个新的项目。

    吴延宝
  • toggbutton

    2013年8月14日Android记录 很多应用都会有用户设置,用户的一些偏好可以由用户来决定那是应用人性化的体现,在实际开发中很多情况都作成可配置的了,本篇博...

    xiangzhihong
  • Fragment使用起来非常简单

    Fragment创建完成后并不能单独使用,还需要将Fragment加载到Activity中,在Activity中添加Fragment的方式有两种:静态加...

    分享达人秀
  • CoordinatorLayout使用(三):NestedScrollView & 嵌套滑动事件

    上一篇,我们大体理解了 Behavior流程 和 事件流 具体代码可以见 https://github.com/2954722256/use_little_d...

    dodo_lihao
  • 4.PopupWindow

    六月的雨
  • Android Listener侦听的N种写法

    Android中,View的Listener方法,在是否使用匿名类匿名对象时,有各种不同的写法。

    阳光岛主
  • 浅谈PopupWindow弹出菜单

    听着music睡
  • 从0系统学Android--4.1探究碎片

    平板电脑和手机最大的区别就在于屏幕的大小,一般手机的屏幕大小会在 3 英寸到 6 英寸之间,而一般平板电脑屏幕大小会在 7 英寸到 10 英寸之间。屏幕大小差距...

    开发者

扫码关注云+社区

领取腾讯云代金券