要实现微信自动化,大致有这么几种办法
这些方法各有利弊,综合看来,第一种实现总会有一天微信说要关闭web服务,那岂不是很惨,第二种风险在于被封号,只有第三种目前看来最合适,想要自动发送朋友圈,AccessibilityService是最完美的实现。知其然知其所以然,我们要想用好AccessibilityService,就要明白其原理,这样能更好的理解每一步 *** 作的含义,少走弯路,避免考虑不周导致成功率不足。
在做的过程中,也遇到很多问题,例如经常拿不到
AccessibilityNodeInfo实例,如果拿不到就无法 *** 作当前界面的元素,等于是无法再执行下去了,这里有几个关键点需要注意的,只要注意这几个就可以完美拿到。卖个关子,下面会提到,请往下看。
先大致了解下原理,对你的使用更是事半功倍。
类图源于 here
该类又继承了 IAccessibilityServiceClient.Stub ,并实现了 HandlerCaller.Callback 接口。看到这分析出,这是一个跨进程通信Service,在IAccessibilityServiceClientWrapper构造函数中看到 Callbacks 回调接口
看到这里再回头看看onBind函数的具体实现如图
而这个函数又是谁调的呢,这里就到了进程间通信的逻辑,看一下外部逻辑,上面是倒推逻辑,下面正推一下。
AccessibilityService跟一个监控一样,界面的所有的事件都可以收到,那它的源头肯定在View上,肯定在View的事件处理上,跟着这个逻辑去找一下
在performClick函数中发现有一个AccessibilityEvent事件传递,再往里面跟踪发现了这个有用的信息
这里面可以清晰的看到,你收到的AccessibilityEvent事件所有的字段赋值逻辑就在这里。那它是如何发出去交给AccessibilityService呢,肯定是通过AIDL,进一步查找源码
发现在sendAccessibilityEventUncheckedInternal函数中,调用了
getParent().requestSendAccessibilityEvent(this, event),接着看看这个getParent()干了什么,找了一圈找到具体实现在哪,最终在ViewRootImpl中找到这个方法实现
可以看到是mAccessibilityManager.sendAccessibilityEvent 发出了事件,再看下这个函数的实现逻辑
IAccessibilityManager 是个aidl接口,最终通过他发送给了服务
看到这是不是明白了其中的原理。在AccessibilityService你还可以拿到Activity的一些信息,同样的道理,你在源码中肯定能找到那个实现,你可以试着自己去搜一下。
上面卖的关子,现在可以圆满了,在使用中遇到过很多种情况拿不到RootInActiveWindow 也就是AccessibilityNodeInfo(表示窗口内容的节点),当窗口能拿到这个节点时,你才能通过他去findView,所以你知道它的重要性了,但为什么很多时候拿不到呢
如果在TYPE_WINDOWS_CHANGED中就会拿不到
当你不在当前页面(com.tencent.mm.ui.LauncherUI是微信的主页)时同样也有可能获取不到,有可能是在其他页面。
读到这是不是想看如何实现呢,这里直接提供项目源码,并没有写如何使用的教程,推荐给你们几个写的特别详细的教程,希望对你有帮助,使用起来相对很简单的,看完这些文章基本够用
Android自动化模拟 *** 作开源库源码解析
你真的理解AccessibilityService吗
AccessibilityService分析与防御
A complete guide to Accessibility Service Part 1 — Android
A Complete Guide to Accessibility Service Part 2 — Android
本项目源码完善中,功能上会加入
好友类里面包括姓名 联系方式 邮箱等等class Friend{
String name
String contact
String email
Friend(String name,String contact,String email){
构造函数
}
getter
setter
}
上面只是个雏形自己完善
用一个ArrayList<Friend>来储存所有的Friends
取,删或者增直接调用ArrayList的函数
用swing来显示所有的好友。。for循环读取ArrayList
然后批量加入swing GUI显示就行
可以用JTable或者直接用JPanel等等
struct people *p1,*p2struct people *head
struct people *p
struct people *head
struct x *p1
两个函数的这些指针,在使用前都没有初始化,或赋值
使其指向的内存单元不确定,造成崩溃
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)