分析的第一个ANR问题,trace:

    1. "Binder:876_B" prio=5 tid=100 Runnable
    2. | group="main" sCount=0 dsCount=0 obj=0x13d36f70 self=0x97c62b00
    3. | sysTid=1958 nice=0 cgrp=default sched=0/0 handle=0x94213920
    4. | state=R schedstat=( 50485139390 8705967032 26706 ) utm=4415 stm=633 core=2 HZ=100
    5. | stack=0x94117000-0x94119000 stackSize=1014KB
    6. | held mutexes= "mutator lock"(shared held)
    7. native: #00 pc 0034f0ad /system/lib/libart.so (_ZN3art15DumpNativeStackERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEEiP12BacktraceMapPKcPNS_9ArtMethodEPv+128)
    8. native: #01 pc 0032f96d /system/lib/libart.so (_ZNK3art6Thread9DumpStackERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEbP12BacktraceMap+632)
    9. native: #02 pc 003418cd /system/lib/libart.so (_ZN3art14DumpCheckpoint3RunEPNS_6ThreadE+620)
    10. native: #03 pc 003304fb /system/lib/libart.so (_ZN3art6Thread21RunCheckpointFunctionEv+146)
    11. native: #04 pc 003f24c1 /system/lib/libart.so (_ZN3artL12GoToRunnableEPNS_6ThreadE+52)
    12. native: #05 pc 003f27e1 /system/lib/libart.so (_ZN3art25JniMethodEndWithReferenceEP8_jobjectjPNS_6ThreadE+12)
    13. native: #06 pc 00015d7f /system/framework/arm/boot.oat (Java_java_lang_Throwable_nativeFillInStackTrace__+82)
    14. at java.lang.Throwable.nativeFillInStackTrace!(Native method)
    15. at java.lang.Throwable.fillInStackTrace(Throwable.java:774)
    16. - locked <0x09c5860b> (a java.lang.NumberFormatException)
    17. at java.lang.Throwable.<init>(Throwable.java:257)
    18. at java.lang.Exception.<init>(Exception.java:66)
    19. at java.lang.RuntimeException.<init>(RuntimeException.java:62)
    20. at java.lang.IllegalArgumentException.<init>(IllegalArgumentException.java:53)
    21. at java.lang.NumberFormatException.<init>(NumberFormatException.java:55)
    22. at java.lang.Integer.parseInt(Integer.java:483)
    23. at java.lang.Integer.parseInt(Integer.java:556)
    24. at com.android.internal.util.XmlUtils.readIntAttribute(XmlUtils.java:1526)
    25. at android.content.res.Configuration.readXmlAttrs(Configuration.java:1948)
    26. at com.android.server.usage.UsageStatsXmlV1.loadEvent(UsageStatsXmlV1.java:111)
    27. at com.android.server.usage.UsageStatsXmlV1.read(UsageStatsXmlV1.java:214)
    28. at com.android.server.usage.UsageStatsXml.read(UsageStatsXml.java:99)
    29. at com.android.server.usage.UsageStatsXml.read(UsageStatsXml.java:63)
    30. at com.android.server.usage.UsageStatsDatabase.queryUsageStats(UsageStatsDatabase.java:449)
    31. - locked <0x0178af01> (a java.lang.Object)
    32. at com.android.server.usage.UserUsageStatsService.queryStats(UserUsageStatsService.java:275)//UserUsageStatsService用于搜集用户的使用app的个人信息
    33. at com.android.server.usage.UserUsageStatsService.queryUsageStats(UserUsageStatsService.java:302)
    34. at com.android.server.usage.UsageStatsService.queryUsageStats(UsageStatsService.java:722)
    35. - locked <0x017b01a6> (a java.lang.Object)//没有释放该锁导致别的线程ANR
    36. at com.android.server.usage.UsageStatsService$BinderService.queryUsageStats(UsageStatsService.java:1270)
    37. at android.app.usage.IUsageStatsManager$Stub.onTransact(IUsageStatsManager.java:61)
    38. at android.os.Binder.execTransact(Binder.java:570)

    是一个native方法导致的线程超时,而没有释放锁<0x017b01a6>:

    1. at java.lang.Throwable.nativeFillInStackTrace!(Native method)

    通过addr2line工具分析;

    1. native: #00 pc 0034f0ad /system/lib/libart.so (_ZN3art15DumpNativeStackERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEEiP12BacktraceMapPKcPNS_9ArtMethodEPv+128)
    2. native: #01 pc 0032f96d /system/lib/libart.so (_ZNK3art6Thread9DumpStackERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEbP12BacktraceMap+632)
    3. native: #02 pc 003418cd /system/lib/libart.so (_ZN3art14DumpCheckpoint3RunEPNS_6ThreadE+620)
    4. native: #03 pc 003304fb /system/lib/libart.so (_ZN3art6Thread21RunCheckpointFunctionEv+146)
    5. native: #04 pc 003f24c1 /system/lib/libart.so (_ZN3artL12GoToRunnableEPNS_6ThreadE+52)
    6. native: #05 pc 003f27e1 /system/lib/libart.so (_ZN3art25JniMethodEndWithReferenceEP8_jobjectjPNS_6ThreadE+12)
    7. native: #06 pc 00015d7f /system/framework/arm/boot.oat (Java_java_lang_Throwable_nativeFillInStackTrace__+82)

    找到libart.so的位置:

    1. qli3@tabletbuild13:~/code/A3AXL3G/out/target$ find -name "libart.so"
    2. ./product/a3a63g_gmo/obj/lib/libart.so
    3. ./product/a3a63g_gmo/obj/SHARED_LIBRARIES/libart_intermediates/PACKED/libart.so
    4. ./product/a3a63g_gmo/obj/SHARED_LIBRARIES/libart_intermediates/LINKED/libart.so
    5. ./product/a3a63g_gmo/symbols/system/fake-libs/libart.so
    6. ./product/a3a63g_gmo/symbols/system/lib/libart.so
    7. ./product/a3a63g_gmo/system/lib/libart.so

    选取symbols下面的对应的:

    1. ./product/a3a63g_gmo/symbols/system/lib/libart.so

    使用命令解析;

    1. qli3@tabletbuild13:~/code/A3AXL3G/out/target$ addr2line -e ./product/a3a63g_gmo/symbols/system/lib/libart.so 003f27e1
    2. /proc/self/cwd/art/runtime/entrypoints/quick/quick_jni_entrypoints.cc:106

    找到对应的代码位置quick_jni_entrypoints.cc:

    1. extern mirror::Object* JniMethodEndWithReference(jobject result, uint32_t saved_local_ref_cookie,
    2. Thread* self) {
    3. GoToRunnable(self);
    4. return JniMethodEndWithReferenceHandleResult(result, saved_local_ref_cookie, self);
    5. }

    接着分析native: #04 pc 003f24c1 /system/lib/libart.so (_ZN3artL12GoToRunnableEPNS_6ThreadE+52):

    1. qli3@tabletbuild13:~/code/A3AXL3G$ addr2line -e ./out/target/product/a3a63g_gmo/symbols/system/lib/libart.so 003f24c1
    2. /proc/self/cwd/art/runtime/thread-inl.h:68

    如果没有addr2line工具,在android源码中可以找使用find -name "addr2line":

    1. ./prebuilts/go/darwin-x86/src/cmd/addr2line
    2. ./prebuilts/go/darwin-x86/pkg/tool/darwin_amd64/addr2line
    3. ./prebuilts/go/linux-x86/src/cmd/addr2line
    4. ./prebuilts/go/linux-x86/pkg/tool/linux_amd64/addr2line
    5. ./prebuilts/tools/gcc-sdk/addr2line

    任意选取其中一个即可.