在android中使用Accessibility服务获取很多ANR

我从报告中获取ANR

意向广播{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.translate flg = 0x4000010 cmp = xx.xx.xx / com.microsoft.aad.adal.ApplicationReceiver(has extras) }

“主”prio = 5 tid = 1 TimedWaiting | group =“main”sCount = 1 dsCount = 0 obj = 0x7527b598 self = 0xe9105400 | 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 | stack = 0xff733000-0xff735000 stackSize = 8MB
| 持有mutexes =在java.lang.Object.wait! (Native方法) - 在android.view.accessibility.AccessibilityInteractionClient.waitForResultTimedLocked(AccessibilityInteractionClient.java:685)上的java.lang.Object.wait(Object.java:407)处等待<0x0fa0a2fe>(java.lang.Object) at android.view.accessibility.AccessibilityInteractionClient.getFindAccessibilityNodeInfosResultAndClear(AccessibilityInteractionClient.java:580) - 在android.android.view.accessibility.AccessibilityInteractionClient.findAccessibilityNodeInfoByAccessibilityId(AccessibilityInteractionClient.java:292)上锁定<0x0fa0a2fe>(一个java.lang.Object)。 xxx.traverseNode(FooAccessibilityService.java:85)位于xxx.traverseNode(FooAccessibilityService.java:86)位于xxx.traverseNode(FooAccessibilityService.java:86)位于xxx处的view.accessibility.AccessibilityNodeInfo.getChild(AccessibilityNodeInfo.java:851)位于xxx.traverseNode(FooAccessibilityService.java:85)处。在xxx.collectNodes(FooAccessibilityService.java:66)处的xxx.onAccessibilityEvent(FooAccessibilityService.java:365)处的traverseNode(FooAccessibilityService.java:86) 在com.android.internal.os.HandlerCaller $ MyHandler.handleMessage(HandlerCaller.java)上的android.accessibilityservice.AccessibilityService $ IAccessibilityServiceClientWrapper.executeMessage :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! (Native方法)at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:872)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:762)

我的代码是

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

任何想法如何解决这个问题


我发现问题,实际上这是由于onedrive-sdk-android问题

根据onedrive我使用下面的代码

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.+')
}

和下线

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

创建错误,我发现这里,更改后compile ('com.microsoft.aad:adal:1.1.+') compile ('com.microsoft.aad:adal:1.13.1')解决问题。


我有一个非常类似的问题:

"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)

此错误在Android 6和7.1上报告,但主要在Android 7.0上报告

更新:

  • 我们还没有很多用户在Android 8上,但我也看到了Android 8上的问题。
  • 我仍然不知道如何解决这个问题。
  • 链接地址: http://www.djcxy.com/p/61983.html

    上一篇: Getting lot of ANR using Accessibility service in android

    下一篇: main thread is blocked by itself by Object.wait?