由于AccessibilityNodeInfo getChild获取大量的ANR [英] Getting Lots of ANR due to AccessibilityNodeInfo getChild

查看:2612
本文介绍了由于AccessibilityNodeInfo getChild获取大量的ANR的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

获取大量ANR报告,


mainprio = 5 tid = 1可运行
| group =mainsCount = 0 dsCount = 0 flags = 0 obj = 0x72e8a568 self = 0xe65da000
| sysTid = 20592 nice = 0 cgrp = default sched = 0/0 handle = 0xe9f6b4a8
| state = R schedstat =(35792446568 9751828904 97371)utm = 2328 stm = 1249 core = 2 HZ = 100
| stack = 0xff6e5000-0xff6e7000 stackSize = 8MB
|手持互斥= 增变锁(共享保持)
天然:PC 00000000002c45b7 /system/lib/libart.so(_ZN3art15DumpNativeStackERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEEiP12BacktraceMapPKcPNS_9ArtMethodEPv + 130)
天然:PC 0000000000355a83 /system/lib/libart.so(_ZNK3art6Thread9DumpStackERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEbP12BacktraceMapb +202)
native:pc 0000000000351f67 /system/lib/libart.so(_ZNK3art6Thread4DumpERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEbP12BacktraceMapb + 34)
native:pc 00000000003698df /system/lib/libart.so(_ZN3art14DumpCheckpoint3RunEPNS_6ThreadE + 654)
native :pc 000000000035662b /system/lib/libart.so(_ZN3art6Thread21RunCheckpointFunctionEv + 298)
native:pc 00000000003bbcff /system/lib/libart.so(_ZN3art16JniMethodFastEndEjPNS_6ThreadE + 46)
native:pc 0000000000403fdb / system / framework / arm / boot-framework.oat
(Java_androi在android.os.Parcel.readInt(Parcel.java:1966)
(在android.os.Parcel中) readExceptionCode(Parcel.java:1906)
处android.accessibilityservice.IAccessibilityServiceConnection $存根$ Proxy.findAccessibilityNodeInfoByAccessibilityId
android.os.Parcel.readException(Parcel.java:1885)
(IAccessibilityServiceConnection。 Java的:447)
在android.view.accessibility.AccessibilityInteractionClient.findAccessibilityNodeInfoByAccessibilityId
(AccessibilityInteractionClient.java:286)
在android.view.accessibility.AccessibilityNodeInfo.getChild(AccessibilityNodeInfo.java:959) MyAccessibilityService.traverseNode上的
(MyAccessibilityService.java:94)MyAccessibilityService.traverseNode上的
(MyAccessibilityService.java:100)$ MyAccessibilityService上的
在MyAccessibilityService.collectTextNodes在MyAccessibilityService.traverseNode .traverseNode(MyAccessibilityService.java:100)
(MyAccessibilityService.java:100)
(MyAccessibilityService.java:69)在MyAccessibilityService.onAccessibilityEvent(MyAccessibilityService

at android.accessibilityservice.AccessibilityService $ 2.onAccessibilityEvent $ b $(AccessibilityService.java:1527)
at android.accessibilityservice.AccessibilityService $ IAccessibilityServiceClientWrapper.executeMessage
(AccessibilityService.java :1712)
at com.android.internal.os.HandlerCaller $ MyHandler.handleMessage
(HandlerCaller.java:37)



 mainprio = 5 tid = 1原生
| group =mainsCount = 1 dsCount = 0 flags = 1 obj = 0x72e8a568 self = 0xe65da000
| sysTid = 11518 nice = 0 cgrp = default sched = 0/0 handle = 0xe9f6b4a8
| state = S schedstat =(34572861602 18459176949 199877)utm = 2350 stm = 1106 core = 1 HZ = 100
| stack = 0xff6e5000-0xff6e7000 stackSize = 8MB
|手持互斥=
天然:PC 0000000000018dac /system/lib/libc.so(系统调用+ 28)
天然:PC 00000000000b3729 /system/lib/libart.so(_ZN3art17ConditionVariable16WaitHoldingLocksEPNS_6ThreadE + 88)
天然:pc 00000000003bbbe3 /system/lib/libart.so(_ZN3artL12GoToRunnableEPNS_6ThreadE + 306)
native:pc 00000000003bba81 /system/lib/libart.so(_ZN3art12JniMethodEndEjPNS_6ThreadE + 8)
native:pc 00000000007ca401 / system / framework /臂/引导framework.oat(Java_android_os_BinderProxy_transactNative__ILandroid_os_Parcel_2Landroid_os_Parcel_2I + 144)
。在android.os.BinderProxy.transactNative(母语方法)
。在android.os.BinderProxy.transact(Binder.java:748)
at android.accessibilityservice.IAccessibilityServiceConnection $存根$ Proxy.findAccessibilityNodeInfoByAccessibilityId(IAccessibilityServiceConnection.java:446)
at android.view.accessibility.AccessibilityInteractionClient.findAccessibilityNodeInfoByAcces
位于android.view.accessibility.AccessibilityNodeInfo.getChild(AccessibilityNodeInfo.java:959)
at MyAccessibilityService.traverseNode(MyAccessibilityService.java:94)
at MyAccessibilityService .traverseNode(MyAccessibilityService.java:100)在MyAccessibilityService.traverseNode
(MyAccessibilityService.java:100)
在MyAccessibilityService.traverseNode(MyAccessibilityService.java:100)
在MyAccessibilityService.collectTextNodes(MyAccessibilityService。
at MyAccessibilityService.onAccessibilityEvent(MyAccessibilityService.java:384)
at android.accessibilityservice.AccessibilityService $ 2.onAccessibilityEvent(AccessibilityService.java:1527)
at android.accessibilityservice.AccessibilityService $ IAccessibilityServiceClientWrapper.executeMessage(AccessibilityService.java:1712)
at com.android.internal.os.HandlerCaller $ MyHandler .handleMessage(HandlerCaller.java:37)
at android.os.Handler.dispatchMessage(Handler.java:105)


mainprio = 5 tid = 1 Runnable
| group =mainsCount = 0 dsCount = 0 flags = 0 obj = 0x73bf7568 self = 0xe7445000
| sysTid = 18941 nice = 0 cgrp = default sched = 0/0 handle = 0xeae2e4a8
| state = R schedstat =(169234820933 190791369297 635928)utm = 11752 stm = 5170 core = 0 HZ = 100
| stack = 0xff795000-0xff797000 stackSize = 8MB
|持有mutexes =mutator lock(共享举行)
在java.util.ArrayList.clear(ArrayList.java:565)
在android.view.accessibility.AccessibilityNodeInfo.init(AccessibilityNodeInfo.java:3211 )
at android.view.accessibility.AccessibilityNodeInfo.obtain(AccessibilityNodeInfo.java:3015)
at android.view.accessibility.AccessibilityCache.getNode(AccessibilityCache.java:231)
- locked< ; 0x0f41ae94> (a java.lang.Object)
at android.view.accessibility.AccessibilityInteractionClient.findAccessibilityNodeInfoByAccessibilityId(AccessibilityInteractionClient.java:272)
at android.view.accessibility.AccessibilityNodeInfo.getChild(AccessibilityNodeInfo.java:959)
at MyAccessibilityService.traverseNode(MyAccessibilityService.java:84)
at MyAccessibilityService.traverseNode(MyAccessibilityService.java:85)
at MyAccessibilityService.traverseNode(MyAccessibilityService.java:85)
at MyAccessibilityService.traverseNode(MyAccessibilityService.java:85)
at MyAccessibilityService.collectTextNodes(MyAccessibilityService.java:66)
at MyAccessibilityService.onAccessibilityEvent(MyAccessibilityService.java:360)
at android.accessibilityservice.AccessibilityService $ 2.onAccessibilityEvent(AccessibilityService.java:1527)
在android.accessibilityservice.AccessibilityService $ IAccessibilityServiceC lientWrapper.executeMessage(AccessibilityService.java:1712)
at com.android.internal.os.HandlerCaller $ MyHandler.handleMessage(HandlerCaller.java:37)
at android.os.Handler.dispatchMessage(Handler。 java:105)

mainprio = 5 tid = 1 TimedWaiting
| group =mainsCount = 1 dsCount = 0 flags = 1 obj = 0x73228568 self = 0xed55a000
| sysTid = 19996 nice = 0 cgrp = default sched = 0/0 handle = 0xed8414a8
| state = S schedstat =(39022541552 53623486893 130046)utm = 3252 stm = 648 core = 2 HZ = 100
| stack = 0xff636000-0xff638000 stackSize = 8MB
| (本地方法)
- 等待< 0x0b44b730> (java.lang.Object)
at java.lang.Object.wait(Object.java:422)
at android.view.accessibility.AccessibilityInteractionClient.waitForResultTimedLocked(AccessibilityInteractionClient.java:687)
at android.view.accessibility.AccessibilityInteractionClient.getFindAccessibilityNodeInfosResultAndClear(AccessibilityInteractionClient.java:582)
- locked< 0x0b44b730> (a java.lang.Object)
at android.view.accessibility.AccessibilityInteractionClient.findAccessibilityNodeInfoByAccessibilityId(AccessibilityInteractionClient.java:291)
at android.view.accessibility.AccessibilityInteractionClient.getRootInActiveWindow(AccessibilityInteractionClient.java:160)
at android.accessibilityservice.AccessibilityService.getRootInActiveWindow(AccessibilityService.java:572)
at MyAccessibilityService.onAccessibilityEvent(MyAccessibilityService.java:370)

  ArrayList< AccessibilityNodeInfo> collectNodes(AccessibilityNodeInfo节点){

ArrayList< AccessibilityNodeInfo> nodeInfoArrayList = new ArrayList<>();
尝试{
int childCount = node.getChildCount();
for(int index = 0; index< childCount; index ++){
AccessibilityNodeInfo childNode = node.getChild(index);


traverseNode(childNode);
if(childNodes!= null&&& childNodes.size()> 0){
nodeInfoArrayList.addAll(childNodes);
childNodes.clear();
}
}
}
catch(Exception e){
e.printStackTrace();
}
返回nodeInfoArrayList;
}

private void traverseNode(AccessibilityNodeInfo node){
try {
AccessibilityNodeInfo edittextNode = null;
if(null == node)
return;

final int count = node.getChildCount();
if(count> 0){
for(int i = 0; i< count; i ++){
AccessibilityNodeInfo childNode = node.getChild(i);
if(childNode == null){
node.recycle();
return;
}
else {
traverseNode(childNode);

$ b $ else {

}
}
catch(异常错误){
error.printStackTrace() ;
}
}

Android 8.0中的更多问题。任何想法如何处理这些ANR的。

config.xml文件

 < accessibility-service 
xmlns:android =http://schemas.android.com/apk/res/android

android:accessibilityEventTypes =typeWindowStateChanged | typeViewFocused | typeWindowContentChanged

android:notificationTimeout =100
android:canRetrieveWindowContent =true
$ b android:accessibilityFeedbackType =feedbackGeneric
android:accessibilityFlags =flagReportViewIds | flagRequestEnhancedWebAccessibility
机器人:描述= 测试/>

请注意几乎所有来自Android 8.0设备的ANR报告。


<第一个重要的事情是回收所有由 getChild 分配的节点, findAccessibilityNodeInfoByAccessibilityId 或其他任何函数。所以你应该有这样的东西:


lockquote
$ $ p $ code AccessibilityNodeInfo findFirstViewByText( AccessibilityNodeInfo rootNode,String text){
if(rootNode == null)return null;
if(rootNode.getText()!= null&& rootNode.getText()。toString()。equals(text))
return rootNode;
int childCount = rootNode.getChildCount();
for(int i = 0; i< childCount; i ++){
AccessibilityNodeInfo tmpNode = rootNode.getChild(i);
if(tmpNode!= null){
AccessibilityNodeInfo res = findFirstViewByText(tmpNode,text);
if(res!= null){
return res;
} else {
tmpNode.recycle();
}
}
}
返回null;
}
}

node = findFirstViewByText(rootNode,something);
if(node!= null){
node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
node.recycle();
}




    $ b $请记住,当您与目标应用程序进行交互时,可能会经常调用 onAccessibilityEvent ,并且您在此函数中的处理会阻止目标应用。您可以通过以下方式解决这个问题:


    • 限制对 onAccessibilityEvent 的调用,即不要如果最后一次执行发生在x毫秒以前,请执行您的代码,但要确保最后一次调用将触发代码的执行。 通过避免不必要的遍历来提高代码的性能。定义状态,以便应用程序仅查找与当前状态相关的节点。 欢迎随时与我们分享更多代码,所以我/我们可以理解你的目标究竟是什么,这样我们可以更有帮助。正如我从日志中看到的那样,有几个线程遍历可访问服务的虚拟目录,并且它们正在导致死锁。


Getting lot of ANR reports,

"main" prio=5 tid=1 Runnable | group="main" sCount=0 dsCount=0 flags=0 obj=0x72e8a568 self=0xe65da000 | sysTid=20592 nice=0 cgrp=default sched=0/0 handle=0xe9f6b4a8 | state=R schedstat=( 35792446568 9751828904 97371 ) utm=2328 stm=1249 core=2 HZ=100 | stack=0xff6e5000-0xff6e7000 stackSize=8MB | held mutexes= "mutator lock"(shared held) native: pc 00000000002c45b7 /system/lib/libart.so (_ZN3art15DumpNativeStackERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEEiP12BacktraceMapPKcPNS_9ArtMethodEPv+130) native: pc 0000000000355a83 /system/lib/libart.so (_ZNK3art6Thread9DumpStackERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEbP12BacktraceMapb+202) native: pc 0000000000351f67 /system/lib/libart.so (_ZNK3art6Thread4DumpERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEbP12BacktraceMapb+34) native: pc 00000000003698df /system/lib/libart.so (_ZN3art14DumpCheckpoint3RunEPNS_6ThreadE+654) native: pc 000000000035662b /system/lib/libart.so (_ZN3art6Thread21RunCheckpointFunctionEv+298) native: pc 00000000003bbcff /system/lib/libart.so (_ZN3art16JniMethodFastEndEjPNS_6ThreadE+46) native: pc 0000000000403fdb /system/framework/arm/boot-framework.oat (Java_android_os_Parcel_nativeReadInt__J+114) at android.os.Parcel.nativeReadInt (Native method) at android.os.Parcel.readInt (Parcel.java:1966) at android.os.Parcel.readExceptionCode (Parcel.java:1906) at android.os.Parcel.readException (Parcel.java:1885) at android.accessibilityservice.IAccessibilityServiceConnection$Stub$Proxy.findAccessibilityNodeInfoByAccessibilityId (IAccessibilityServiceConnection.java:447) at android.view.accessibility.AccessibilityInteractionClient.findAccessibilityNodeInfoByAccessibilityId (AccessibilityInteractionClient.java:286) at android.view.accessibility.AccessibilityNodeInfo.getChild (AccessibilityNodeInfo.java:959) at MyAccessibilityService.traverseNode (MyAccessibilityService.java:94) at MyAccessibilityService.traverseNode (MyAccessibilityService.java:100) at MyAccessibilityService.traverseNode (MyAccessibilityService.java:100) at MyAccessibilityService.traverseNode (MyAccessibilityService.java:100) at MyAccessibilityService.collectTextNodes (MyAccessibilityService.java:69) at MyAccessibilityService.onAccessibilityEvent (MyAccessibilityService.java:384) at android.accessibilityservice.AccessibilityService$2.onAccessibilityEvent (AccessibilityService.java:1527) at android.accessibilityservice.AccessibilityService$IAccessibilityServiceClientWrapper.executeMessage (AccessibilityService.java:1712) at com.android.internal.os.HandlerCaller$MyHandler.handleMessage (HandlerCaller.java:37)

    "main" prio=5 tid=1 Native
      | group="main" sCount=1 dsCount=0 flags=1 obj=0x72e8a568 self=0xe65da000
      | sysTid=11518 nice=0 cgrp=default sched=0/0 handle=0xe9f6b4a8
      | state=S schedstat=( 34572861602 18459176949 199877 ) utm=2350 stm=1106 core=1 HZ=100
      | stack=0xff6e5000-0xff6e7000 stackSize=8MB
      | held mutexes=
      native: pc 0000000000018dac  /system/lib/libc.so (syscall+28)
      native: pc 00000000000b3729  /system/lib/libart.so (_ZN3art17ConditionVariable16WaitHoldingLocksEPNS_6ThreadE+88)
      native: pc 00000000003bbbe3  /system/lib/libart.so (_ZN3artL12GoToRunnableEPNS_6ThreadE+306)
      native: pc 00000000003bba81  /system/lib/libart.so (_ZN3art12JniMethodEndEjPNS_6ThreadE+8)
      native: pc 00000000007ca401  /system/framework/arm/boot-framework.oat (Java_android_os_BinderProxy_transactNative__ILandroid_os_Parcel_2Landroid_os_Parcel_2I+144)
      at android.os.BinderProxy.transactNative (Native method)
      at android.os.BinderProxy.transact (Binder.java:748)
      at android.accessibilityservice.IAccessibilityServiceConnection$Stub$Proxy.findAccessibilityNodeInfoByAccessibilityId (IAccessibilityServiceConnection.java:446)
      at android.view.accessibility.AccessibilityInteractionClient.findAccessibilityNodeInfoByAccessibilityId (AccessibilityInteractionClient.java:286)
      at android.view.accessibility.AccessibilityNodeInfo.getChild (AccessibilityNodeInfo.java:959)
      at MyAccessibilityService.traverseNode (MyAccessibilityService.java:94)
      at MyAccessibilityService.traverseNode (MyAccessibilityService.java:100)
      at MyAccessibilityService.traverseNode (MyAccessibilityService.java:100)
      at MyAccessibilityService.traverseNode (MyAccessibilityService.java:100)
      at MyAccessibilityService.collectTextNodes (MyAccessibilityService.java:69)
      at MyAccessibilityService.onAccessibilityEvent (MyAccessibilityService.java:384)
      at android.accessibilityservice.AccessibilityService$2.onAccessibilityEvent (AccessibilityService.java:1527)
      at android.accessibilityservice.AccessibilityService$IAccessibilityServiceClientWrapper.executeMessage (AccessibilityService.java:1712)
      at com.android.internal.os.HandlerCaller$MyHandler.handleMessage (HandlerCaller.java:37)
      at android.os.Handler.dispatchMessage (Handler.java:105)


    "main" prio=5 tid=1 Runnable
      | group="main" sCount=0 dsCount=0 flags=0 obj=0x73bf7568 self=0xe7445000
      | sysTid=18941 nice=0 cgrp=default sched=0/0 handle=0xeae2e4a8
      | state=R schedstat=( 169234820933 190791369297 635928 ) utm=11752 stm=5170 core=0 HZ=100
      | stack=0xff795000-0xff797000 stackSize=8MB
      | held mutexes= "mutator lock"(shared held)
      at java.util.ArrayList.clear (ArrayList.java:565)
      at android.view.accessibility.AccessibilityNodeInfo.init (AccessibilityNodeInfo.java:3211)
      at android.view.accessibility.AccessibilityNodeInfo.obtain (AccessibilityNodeInfo.java:3015)
      at android.view.accessibility.AccessibilityCache.getNode (AccessibilityCache.java:231)
    - locked <0x0f41ae94> (a java.lang.Object)
      at android.view.accessibility.AccessibilityInteractionClient.findAccessibilityNodeInfoByAccessibilityId (AccessibilityInteractionClient.java:272)
      at android.view.accessibility.AccessibilityNodeInfo.getChild (AccessibilityNodeInfo.java:959)
      at MyAccessibilityService.traverseNode (MyAccessibilityService.java:84)
      at MyAccessibilityService.traverseNode (MyAccessibilityService.java:85)
      at MyAccessibilityService.traverseNode (MyAccessibilityService.java:85)
      at MyAccessibilityService.traverseNode (MyAccessibilityService.java:85)
      at MyAccessibilityService.collectTextNodes (MyAccessibilityService.java:66)
      at MyAccessibilityService.onAccessibilityEvent (MyAccessibilityService.java:360)
      at android.accessibilityservice.AccessibilityService$2.onAccessibilityEvent (AccessibilityService.java:1527)
      at android.accessibilityservice.AccessibilityService$IAccessibilityServiceClientWrapper.executeMessage (AccessibilityService.java:1712)
      at com.android.internal.os.HandlerCaller$MyHandler.handleMessage (HandlerCaller.java:37)
      at android.os.Handler.dispatchMessage (Handler.java:105)

"main" prio=5 tid=1 TimedWaiting
  | group="main" sCount=1 dsCount=0 flags=1 obj=0x73228568 self=0xed55a000
  | sysTid=19996 nice=0 cgrp=default sched=0/0 handle=0xed8414a8
  | state=S schedstat=( 39022541552 53623486893 130046 ) utm=3252 stm=648 core=2 HZ=100
  | stack=0xff636000-0xff638000 stackSize=8MB
  | held mutexes=
  at java.lang.Object.wait (Native method)
- waiting on <0x0b44b730> (a java.lang.Object)
  at java.lang.Object.wait (Object.java:422)
  at android.view.accessibility.AccessibilityInteractionClient.waitForResultTimedLocked (AccessibilityInteractionClient.java:687)
  at android.view.accessibility.AccessibilityInteractionClient.getFindAccessibilityNodeInfosResultAndClear (AccessibilityInteractionClient.java:582)
- locked <0x0b44b730> (a java.lang.Object)
  at android.view.accessibility.AccessibilityInteractionClient.findAccessibilityNodeInfoByAccessibilityId (AccessibilityInteractionClient.java:291)
  at android.view.accessibility.AccessibilityInteractionClient.getRootInActiveWindow (AccessibilityInteractionClient.java:160)
  at android.accessibilityservice.AccessibilityService.getRootInActiveWindow (AccessibilityService.java:572)
  at MyAccessibilityService.onAccessibilityEvent (MyAccessibilityService.java:370)

My code

ArrayList<AccessibilityNodeInfo> collectNodes(AccessibilityNodeInfo node) {

    ArrayList<AccessibilityNodeInfo> nodeInfoArrayList = new ArrayList<>();
    try {
        int childCount = node.getChildCount();
        for (int index = 0; index < childCount; index++) {
            AccessibilityNodeInfo childNode = node.getChild(index);


            traverseNode(childNode);
            if (childNodes != null && childNodes.size() > 0) {
                nodeInfoArrayList.addAll(childNodes);
                childNodes.clear();
            }
        }
    }
    catch (Exception e){
        e.printStackTrace();
    }
    return nodeInfoArrayList;
}

private void traverseNode(AccessibilityNodeInfo node) {
    try {
        AccessibilityNodeInfo edittextNode = null;
        if (null == node)
            return;

        final int count = node.getChildCount();
        if (count > 0) {
            for (int i = 0; i < count; i++) {
                AccessibilityNodeInfo childNode = node.getChild(i);
                if (childNode == null) {
                    node.recycle();
                    return;
                }
                else {
                    traverseNode(childNode);
                }
            }
        } else {

        }
    }
    catch (Exception error){
        error.printStackTrace();
    }
}

even more issues in Android 8.0. Any idea how to deal with these ANR's.

config.xml file

<accessibility-service
    xmlns:android="http://schemas.android.com/apk/res/android"

    android:accessibilityEventTypes="typeWindowStateChanged|typeViewFocused|typeWindowContentChanged"

    android:notificationTimeout="100"
    android:canRetrieveWindowContent="true"

    android:accessibilityFeedbackType="feedbackGeneric"
    android:accessibilityFlags="flagReportViewIds|flagRequestEnhancedWebAccessibility"
    android:description="Test"/>

please note almost all the ANR report from Android 8.0 devices.

解决方案

  1. The first important thing is to recycle all the nodes allocated by getChild, findAccessibilityNodeInfoByAccessibilityId or any other function. So you should have something like this:

AccessibilityNodeInfo findFirstViewByText(AccessibilityNodeInfo rootNode, String text) {
        if (rootNode == null) return null;
        if (rootNode.getText() != null && rootNode.getText().toString().equals(text))
            return rootNode;
        int childCount = rootNode.getChildCount();
        for (int i = 0; i < childCount; i++) {
            AccessibilityNodeInfo tmpNode = rootNode.getChild(i);
            if (tmpNode != null) {
                AccessibilityNodeInfo res = findFirstViewByText(tmpNode, text);
                if (res != null) {
                    return res;
                } else {
                    tmpNode.recycle();
                }
            }
        }
        return null;
    }
}

node = findFirstViewByText(rootNode, "something");
if(node != null) {
  node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
  node.recycle();
}

  1. Keep in mind that onAccessibilityEvent may be called too often while you interact with the target application and also your processing in this function is blocking UI Thread on the target application. You can overcome this by:

    • Throttling the calls to onAccessibilityEvent i.e. don't execute your code if the last execution happened less than x milliseconds ago, but make sure that last call will trigger execution of your code.
    • Improve the performance of your code by avoiding unnecessary traversing. Define states so the app will look only for the nodes relevant for the current state.
  2. Feel free to share more of your code so i/we can understand what exactly is your goal, that way we can be more helpful. As i can see from your log, there are several threads traversing the virtual dom of accessibility service and they are causing deadlock.

这篇关于由于AccessibilityNodeInfo getChild获取大量的ANR的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆