简体   繁体   English

在Android中使用辅助功能获取大量ANR

[英]Getting lot of ANR using Accessibility service in android

i am getting ANR from reports 我从报告中获取ANR

Broadcast of Intent { act=android.intent.action.PACKAGE_ADDED dat=package:com.google.android.apps.maps flg=0x4000010 cmp=xx.xx.xx/com.microsoft.aad.adal.ApplicationReceiver (has extras) } 意图广播{act = android.intent.action.PACKAGE_ADDED dat = package:com.google.android.apps.maps flg = 0x4000010 cmp = xx.xx.xx / com.microsoft.aad.adal.ApplicationReceiver(有附加功能) }

Broadcast of Intent { act=android.intent.action.PACKAGE_ADDED dat=package:com.google.android.apps.translate flg=0x4000010 cmp=xx.xx.xx/com.microsoft.aad.adal.ApplicationReceiver (has extras) } 意图广播{act = android.intent.action.PACKAGE_ADDED dat = package:com.google.android.apps.translate flg = 0x4000010 cmp = xx.xx.xx / com.microsoft.aad.adal.ApplicationReceiver(有附加功能) }

"main" prio=5 tid=1 TimedWaiting | “ main” prio = 5 tid = 1 TimedWaiting | group="main" sCount=1 dsCount=0 obj=0x7527b598 self=0xe9105400 | group =“ main” sCount = 1 dsCount = 0 obj = 0x7527b598 self = 0xe9105400 | sysTid=29196 nice=0 cgrp=default sched=0/0 handle=0xebfd2534 | sysTid = 29196 nice = 0 cgrp = default sched = 0/0 handle = 0xebfd2534 | state=S schedstat=( 0 0 0 ) utm=1236 stm=469 core=2 HZ=100 | 状态= S schedstat =(0 0 0)utm = 1236 stm = 469 core = 2 HZ = 100 | stack=0xff733000-0xff735000 stackSize=8MB stack = 0xff733000-0xff735000 stackSize = 8MB
| | held mutexes= at java.lang.Object.wait! 在java.lang.Object.wait处保持mutexes =! (Native method) - waiting on <0x0fa0a2fe> (a java.lang.Object) at java.lang.Object.wait (Object.java:407) at android.view.accessibility.AccessibilityInteractionClient.waitForResultTimedLocked (AccessibilityInteractionClient.java:685) at android.view.accessibility.AccessibilityInteractionClient.getFindAccessibilityNodeInfosResultAndClear (AccessibilityInteractionClient.java:580) - locked <0x0fa0a2fe> (a java.lang.Object) at android.view.accessibility.AccessibilityInteractionClient.findAccessibilityNodeInfoByAccessibilityId (AccessibilityInteractionClient.java:292) at android.view.accessibility.AccessibilityNodeInfo.getChild (AccessibilityNodeInfo.java:851) at xxx.traverseNode (FooAccessibilityService.java:85) at xxx.traverseNode (FooAccessibilityService.java:86) at xxx.traverseNode (FooAccessibilityService.java:86) at xxx.traverseNode (FooAccessibilityService.java:86) at xxx.collectNodes (FooAccessibilityService.java:66) at xxx.onAccessibilityEvent (FooAccessibilityService.java:365) at (本机方法)-在android.view.accessibility.Accessibility.AccessibilityInteractionClient.waitForResultTimedLocked(AccessibilityInteractionClient.java:685)的java.lang.Object.wait(Object.java:407)上的<0x0fa0a2fe>(一个java.lang.Object)上等待在android.view.accessibility.AccessibilityInteractionClient.getFindAccessibilityNodeInfosResultAndClear(AccessibilityInteractionClient.java:580)处-将<0x0fa0a2fe>(一个java.lang.Object)锁定在android.view.accessibility.AccessibilityInteractionClient.findAccessibilityNodeInfoByAccessibilityId(AccessibilityInteractionClient.java:292) view.accessibility.AccessibilityNodeInfo.getChild(AccessibilityNodeInfo.java:851)位于xxx.traverseNode(FooAccessibilityService.java:86)在xxx.traverseNode(FooAccessibilityService.java:86)在xxx.traverseNode(FooAccessibilityService.java:86)在xxx。 xxx.onAccessibilityEvent(FooAccessibilityService.java:365)的xxx.collectNodes(FooAccessibilityService.java:66)的traverseNode(FooAccessibilityService.java:86) android.accessibilityservice.AccessibilityService$2.onAccessibilityEvent (AccessibilityService.java:1449) at android.accessibilityservice.AccessibilityService$IAccessibilityServiceClientWrapper.executeMessage (AccessibilityService.java:1585) at com.android.internal.os.HandlerCaller$MyHandler.handleMessage (HandlerCaller.java:37) at android.os.Handler.dispatchMessage (Handler.java:102) at android.os.Looper.loop (Looper.java:154) at android.app.ActivityThread.main (ActivityThread.java:6316) at java.lang.reflect.Method.invoke! com.android.internal.os.HandlerCaller $ MyHandler.handleMessage(HandlerCaller.java)上的android.accessibilityservice.AccessibilityService $ IAccessibilityService $ IAccessibilityServiceClientWrapper.executeMessage(AccessibilityService.java:1585)上的android.accessibilityservice.AccessibilityService $ 2.onAccessibilityEvent(AccessibilityService.java:1449) :37),位于android.os.Handler.dispatchMessage(Handler.java:102),位于android.os.Looper.loop(Looper.java:154),位于android.app.ActivityThread.main(ActivityThread.java:6316),位于Java .lang.reflect.Method.invoke! (Native method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:872) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:762) (本地方法)com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:872)com.android.internal.os.ZygoteInit.main(ZygoteInit.java:762)

My code is 我的代码是

    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();
    }
}

Any idea how to resolve this issue 任何想法如何解决这个问题

If an app doesn't respond to the request for the AccessibilityNodeInfo, the request for it from the AccessibilityService will time out and return null. 如果应用程序不响应对AccessibilityNodeInfo的请求,则AccessibilityService对它的请求将超时并返回null。 That timeout is set to 5s. 该超时设置为5s。

If you make repeated requests from the unresponsive app, you can end up with very long waits. 如果您从无响应的应用程序中重复发出请求,则可能会导致很长的等待时间。

In the first part of the code shown, the loop will continue trying to traverse nodes even if that fails. 在所示代码的第一部分中,即使失败,循环也将继续尝试遍历节点。 That can lead to very long delays. 这会导致很长的延迟。

I got a very similar issue : 我有一个非常类似的问题:

"main" prio=5 tid=1 TimedWaiting
  | group="main" sCount=1 dsCount=0 obj=0x74e352e8 self=0xb45f6a00
  | sysTid=1785 nice=0 cgrp=default sched=0/0 handle=0xb6efdde4
  | state=S schedstat=( 20808880338 15171670769 80754 ) utm=1292 stm=788 core=1 HZ=100
  | stack=0xbe022000-0xbe024000 stackSize=8MB
  | held mutexes=

  at java.lang.Object.wait! (Native method)
- waiting on <0x022019b2> (a java.lang.Object)

  at java.lang.Object.wait (Object.java:423)

  at android.view.accessibility.AccessibilityInteractionClient.waitForResultTimedLocked (AccessibilityInteractionClient.java:695)

  at android.view.accessibility.AccessibilityInteractionClient.getFindAccessibilityNodeInfosResultAndClear (AccessibilityInteractionClient.java:590)
- locked <0x022019b2> (a java.lang.Object)

  at android.view.accessibility.AccessibilityInteractionClient.findAccessibilityNodeInfosByViewId (AccessibilityInteractionClient.java:349)

  at android.view.accessibility.AccessibilityNodeInfo.findAccessibilityNodeInfosByViewId (AccessibilityNodeInfo.java:1374)

  at com.myApp.myFct (mySource.java:69)

This error is reported on Android 6, and 7.1, but mostly on android 7.0 此错误是在Android 6和7.1上报告的,但大多数是在android 7.0上报告的

UPDATE: 更新:

  • we don't have a lot of user on android 8 yet, but I also see the problem on android 8. 我们在android 8上没有很多用户,但是我也在android 8上看到了问题。
  • I still got no clue about how to fix that. 我仍然不知道如何解决该问题。

I found issue, actually this is issue due to onedrive-sdk-android 我发现了问题,实际上这是由于onedrive-sdk-android而引起的问题

As per onedrive i use below code 根据一个驱动器,我使用以下代码

repository {
    jcenter()
}

dependency {
    // Include the sdk as a dependency
    compile ('com.onedrive.sdk:onedrive-sdk-android:1.3+') {
        transitive = false
    }

    // Include the gson dependency
    compile ('com.google.code.gson:gson:2.3.1')

    // Include supported authentication methods for your application
    compile ('com.microsoft.services.msa:msa-auth:0.8.+')
    compile ('com.microsoft.aad:adal:1.1.+')
}

and below line 和下面的线

compile ('com.microsoft.aad:adal:1.1.+') 编译('com.microsoft.aad:adal:1.1。+')

create error which i found here , after change compile ('com.microsoft.aad:adal:1.1.+') to compile ('com.microsoft.aad:adal:1.13.1') resolved issue. 创建我在这里发现的错误,将更改compile ('com.microsoft.aad:adal:1.1.+')更改为compile ('com.microsoft.aad:adal:1.13.1')解决的问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM