最近在使用心悦俱乐部这个APP,里面有个代币叫G分,可以换游戏道具,但需要每天领取,比较繁琐。于是索性做一个自动领取G分的辅助,姑且叫它G分助手吧。

这个辅助主要是通过Accessibility Service(辅助功能)实现的,总体思路就是通过AccessibilityService模拟点击来实现自动化。项目地址是https://github.com/LittleFogCat/gpointhelper。

1. 查看包名和当前Activity

首先使用adb shell连接上手机。在启动应用之后,输入dumpsys activity activities命令查看当前的Activity。


可以看到,包名是com.tencent.tgclub,欢迎页是WelcomeActivity,主页面是MainActivity

2. 查看当前应用布局,View的id等

在Android sdk目录下,有一个tools文件夹。这之中有一个monitor工具,也就是之前的DDMS。连接手机到电脑之后,通过monitor即可看到当前应用界面的布局了。

  • 点击dump view hierarchy

  • 当前应用布局

通过monitor工具,我们就可以获取到想要点击View的id,从而为实现模拟点击做好准备。

3. AccessibilityService的配置

Accessibility Service的教程网上一搜一大把,很简单,这里就不赘述了。

AccessibilityService的xml配置文件如下:

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"android:accessibilityEventTypes="typeWindowStateChanged|typeWindowContentChanged|typeViewClicked"android:accessibilityFeedbackType="feedbackGeneric"android:accessibilityFlags="flagReportViewIds|flagRequestEnhancedWebAccessibility|flagRetrieveInteractiveWindows"android:canRequestEnhancedWebAccessibility="true"android:canRetrieveWindowContent="true"android:canPerformGestures="true"android:description="@string/app_name"android:notificationTimeout="10"android:packageNames="com.tencent.tgclub" />

其中特别要指出的是,flagRequestEnhancedWebAccessibility这一项,是为了操作WebView中的内容的。最坑的地方在于,在api 26中这个flag就被废弃了,而且我并没有找到替代方法。也就是说,在Android O以后的手机很可能就不能用这个方式了,而且竟然没有可以替代的方式!(只能用Android 7及以前的手机暂时苟一下)

4. 实现代码

4.1 判断是否开启AccessibilityService的权限

/*** 检测是否本应用辅助功能开启*/
fun isAccessibilitySettingsOn(mContext: Context, clazz: Class<out AccessibilityService>): Boolean {var accessibilityEnabled = 0val service = mContext.packageName + "/" + clazz.canonicalNametry {accessibilityEnabled = Settings.Secure.getInt(mContext.applicationContext.contentResolver,Settings.Secure.ACCESSIBILITY_ENABLED)} catch (e: Exception) {e.printStackTrace()}val mStringColonSplitter = TextUtils.SimpleStringSplitter(':')if (accessibilityEnabled == 1) {val settingValue = Settings.Secure.getString(mContext.applicationContext.contentResolver,Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES)if (settingValue != null) {mStringColonSplitter.setString(settingValue)while (mStringColonSplitter.hasNext()) {val accessibilityService = mStringColonSplitter.next()if (accessibilityService.equals(service, ignoreCase = true)) {return true}}}}return false
}
    /*** 检查是否开启辅助功能,没有开启就跳转到设置页面*/private fun checkAccessibilityOn() {if (!isAccessibilitySettingsOn(this, GPointService::class.java)) {mDialog = makeDialog(this,"需要打开辅助功能","点击确定,在设置中找到\"G分助手\",打开辅助功能","确定",DialogInterface.OnClickListener { _, _ -> startActivity(Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS)) },false)mDialog!!.show()}}

4.2 AccessibilityService的实现

4.2.1 需求分析

拟定功能有三点:

  1. 签到
  2. 领取月卡积分
  3. 喂猫

那么,我们的辅助功能应该是这样的:
每日定时打开心悦app -> 检查今日是否完成以上任务 -(如果没有)-> 执行任务 -> 检查是否成功 [ -> 上报]

4.2.2 思路

在AccessibilityService的onAccessibilityEvent回调方法中,可以接收到在xml中指定app的事件。

    /*** 检测到事件。*/override fun onAccessibilityEvent(event: AccessibilityEvent) {Log.v(TAG, "onAccessibilityEvent: " + AccessibilityEvent.eventTypeToString(event.eventType))if (event.eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {// window状态改变(切换窗口、显示隐藏、对话框等)// doSth...} else if(event.eventType == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED) {// 当前window内容改变// doSth...}}
  1. 首先检查一下今日任务是否已经执行完毕了,如果是的话就什么都不做。因为不能让辅助妨碍了用户的正常操作,所以在完成了任务之后就不需要再进行操作了。

  2. 按照4.2.1中的流程依次执行任务。

  3. 执行完毕之后,将结果保存在本地。

4.2.3 设计

思路上捋清楚了,接下来就是具体是设计了。

1. 任务设计

任务的设计主要分为两个方面。第一,数据结构;第二,存储方式。
如何得知当日是否已经执行完毕?执行任务之后如何存储?
最简单可行的想法就是使用SharedPreferences来进行记录,读取之后保存在AccessibilityService中。

    private lateinit var mSharedPreferences: SharedPreferencesoverride fun onServiceConnected() {Log.d(TAG, "onServiceConnected: GPointService")mSharedPreferences = getSharedPreferences(SP_NAME, Context.MODE_PRIVATE)}

另一方面,由于任务状态包括了签到、领取月卡积分、喂猫三项,任务重复性高,如果全都写在AccessibilityService中,冗余度很高,所以单独抽象一个Task基类出来。这样做的好处不仅在于可以减少重复代码,而且如果以后有新的任务,直接继承这个父类即可,利于扩展:

最后,创建一个TaskManager的单例类,统一管理任务,将职责从AccessibilityService中分割出来。

这里任务的设计暂告一段落了。

2. 任务执行

在任务执行之后,还需要保存任务的完成状态。对于每日更新的任务来说,每天的任务完成之后,需要将任务标记为已完成,并且在第二天的0点(或其他时候)重新变成未完成。

这个花了我很多时间,主要是比较各种方式的优劣。对于定/延时任务,一般来说有这几种方法:

  • Timer
  • Handler
  • AlarmManager

鉴于任务间隔时间很长,所以这里采用了AlarmManager作为定时任务的方法。
另外,考虑到不同的任务可能会有不同的执行时间和间隔,那么就没法统一执行时间了。这个问题其实还是很棘手的,虽然有不同的解决方案,但是我最后也没有找到一个比较完美的。

最终方案

采用过期时间mExpireTime。对于每个Task来说,执行完毕任务之后,设定一个任务过期时间。任务过期之前为保护期,在保护期内,任务不会再次运行。超过过期时间的,或者没有设置过期时间的,视为过期任务,则执行。同时将isTaskDone()方法修改为shouldRunTask()方法,使其更符合实际逻辑。

每次AccessibilityService的onAccessibilityEvent回调均会调用TaskManager.checkAndRunTasks()方法来检查所有任务是否过期,对于未过期的任务则跳过,只执行已过期的任务。在checkAndRunTasks方法中,会调用每个Task的shouldRunTask方法,检查是否应该运行。

对于TaskManager,简化了外部接口,使得任务的执行更加便捷且清晰;同时当一个任务执行时,其他任务禁止执行,避免互相干扰。
另外对Task类也进行了优化,删去了过度设计的部分。

4.3 最终代码

大体框架已经完成,剩下的内容就是往里面写各个任务的业务逻辑了,甚至根据需求可以添加其他任务。
Github地址是https://github.com/LittleFogCat/gpointhelper,有兴趣的可以自己改着玩。(不过我猜没有人会坚持看到这里。)
事实上,写到这里,我已经不想领G分了。

Android辅助工具,G分助手的实现 - 心悦俱乐部app自动签到、领G分相关推荐

  1. Android辅助工具助手-keep 自动点赞器

    0.运行界面 源码下载 https://github.com/sufadi/AccessibilityServiceMonitor 1.需求点赞界面,进行自动点击 注意:要clickable事件为tu ...

  2. android UiAutomator一个在京东app里面自动签到领流量的方法

    京东app里面有一个能签到领流量的功能,我几乎每天想起来就用一下,感觉挺好用的,但是近期京东流量口令实在找得令人心烦,故写了一个自动的方法,测试通过. clean();//清理后台 UiDevice. ...

  3. 分享个龙门神途脚本辅助工具,相当于一个云端的安卓模拟器

    龙门神途这一类游戏需要长时间的挂机,这里分享一个脚本辅助工具,此工具相当于一个挂在云端的模拟器, 能随时操作,设置好后能够云端运行 远程操作界面截图: 功能: 红手指云手机功能: 1.24h挂机,免r ...

  4. 推荐个人常用的六个APP设计辅助工具

    推荐个人常用的六个APP设计辅助工具 分享六个本人在学习和制作App设计时,经常使用到的辅助工具,非常实用,相信对UI设计的初学者一定非常有帮助. Eagle Eagle for mac 一个简单.高 ...

  5. Android开发辅助工具类 Utils

    包括了各种工具类.辅助类.管理类等    都可以 在Git  里找到代码 来研究,深入 Awesome_API: https://github.com/marktony/Awesome_API/blo ...

  6. Android开发辅助工具类 Utils 汇总

    包括了各种工具类.辅助类.管理类等 Awesome_API: https://github.com/marktony/Awesome_API/blob/master/Chinese.md 收集中国国内 ...

  7. android测试入门选择哪个工具何时,Android单元测试——辅助工具介绍

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 阅读本文大约需要8分钟 目录 最近在学习单元测试的相关知识,在这里我将分享一下我在学习过程中,使用到的一些辅助工具或框架 ...

  8. 一个简单的微信跳一跳辅助工具(android)

    前两天手机微信升级到了最新版,多了个跳一跳的游戏,无聊玩了几把,奈何手残,最高只玩到70多分,就想着能不能搞个工具辅助下,于是有了下边的工具: 工具的简单原理如下: 根据前后两个方块的距离计算出一个按 ...

  9. 通用定时发送工具V1.1.2、Excel办公辅助工具V1.0.1、我在这儿-个人定位助手V5.0.1下载

    1.通用定时发送工具V1.1.2下载地址:https://download.csdn.net/download/wenjuan11122/12498780 2.Excel办公辅助工具V1.0.1下载地 ...

最新文章

  1. 高房价可控制人口增长与人口素质?
  2. 网络带宽与传输性能的基本计算方法
  3. c#只用一个for输出三角形
  4. 6a标准 api_【阀门标准】API SPEC 6A CHINESE-2010中文版.pdf
  5. mysql数据到导入导出
  6. 希尔排序是一种稳定的排序算法_十大经典排序算法——希尔排序
  7. mac学python_新手小白学Python必备编程利器Pycharm快捷键大全(Win+Mac)
  8. 国二c语言选择题要对一半,计算机二级考试C语言程序设计题有步骤分吗
  9. 斗鱼弹幕服务器未响应,斗鱼看不到弹幕的解决方法步骤
  10. 计算机做电池模拟,探讨锂电领域常用模拟计算方法
  11. TCP RTT测量妙计
  12. python中pixels函数_Python的PIL库中getpixel方法的使用
  13. 手机直播系统 服务器,手机直播系统平台搭建部署开发
  14. X书x-mini-sig_x-mini-mua
  15. FM,FMM,deepFFM模型总结,深度排序模型
  16. 开源物联网平台ThingsBoard数据库40张数据表设计一览
  17. 部署dashboard
  18. 【MTK官方工具】最好用的MTK官方工具
  19. 如何利用gretna软件计算脑网络全局属性(聚类系数,小世界属性,最短路径),局部属性指标(度,度分布,节点效率),如何理解网络稀疏度
  20. Android 1000实例代码集结(二 )

热门文章

  1. 全自动高清录播服务器,全高清高清录播服务器 自动高清录播系统 真正零布线 即装即用...
  2. 盘一盘 Python 特别篇 20 - SciPy 稀疏矩阵
  3. opencv调用pytorch训练好的模型
  4. zp2ss matlab,控制系统计算机仿真(matlab)实验三实验报告
  5. 人工智能火爆 国内这几家计算机视觉公司值得关注
  6. qt大作业——消灭星星
  7. 领略千变万化的Android Drawable (一)
  8. oCPC实践录 | 随你千变万化,oCPC PID控制(2)
  9. 河北欧格教育:什么是白底图
  10. 支付宝支付整体流程,包括验签【同步】【异步】