Android SystemServer ANR总结

在Android 中SystemServer的ANR多发现于Monkey测试中,用户的操作引发SystemServer ANR的概率反而不高。

SystemServer的进程名system_server

 在抓取的ANR log,SystemServer的ANR log

----- pid 2803 at 2018-01-01 00:04:51 -----
Cmd line: system_server
Build fingerprint: '.......'
ABI: 'arm64'
Build type: optimized
Zygote loaded classes=11522 post zygote classes=2718
Intern table: 80959 strong; 1881 weak
JNI: CheckJNI is off; globals=1279 (plus 86 weak)
Libraries: /system/lib64/libandroid.so /system/lib64/libandroid_servers.so /system/lib64/libcar-framework-service-jni.so /system/lib64/libcompiler_rt.so /system/lib64/libjavacrypto.so /system/lib64/libjnigraphics.so /system/lib64/libsoundpool.so /system/lib64/libwebviewchromium_loader.so /system/lib64/libwifi-service.so libjavacore.so libopenjdk.so (11)
Heap: 17% free, 26MB/32MB; 246617 objects
Dumping cumulative Gc timings
Start Dumping histograms for 60 iterations for concurrent copying
ProcessMarkStack:	Sum: 6.549s 99% C.I. 3.860ms-346.240ms Avg: 109.158ms Max: 351.348ms
ScanImmuneSpaces:	Sum: 1.205s 99% C.I. 6.715ms-66.560ms Avg: 20.095ms Max: 72.473ms
VisitConcurrentRoots:	Sum: 503.876ms 99% C.I. 3.081ms-25.760ms Avg: 8.397ms Max: 28.199ms
ClearFromSpace:	Sum: 265.638ms 99% C.I. 0.302ms-32.880ms Avg: 4.427ms Max: 40.210ms
FlipOtherThreads:	Sum: 195.863ms 99% C.I. 0.386ms-13.100ms Avg: 3.264ms Max: 13.818ms
EnqueueFinalizerReferences:	Sum: 142.947ms 99% C.I. 0.053ms-44.640ms Avg: 2.382ms Max: 47.237ms
ForwardSoftReferences:	Sum: 77.755ms 99% C.I. 0.037ms-6.140ms Avg: 1.295ms Max: 6.740ms
ProcessReferences:	Sum: 74.814ms 99% C.I. 0.869us-6239.999us Avg: 623.450us Max: 7135us
SweepSystemWeaks:	Sum: 64.778ms 99% C.I. 0.087ms-7.970ms Avg: 1.079ms Max: 9.443ms
GrayAllDirtyImmuneObjects:	Sum: 62.935ms 99% C.I. 0.293ms-11.580ms Avg: 1.048ms Max: 13.009ms
MarkingPhase:	Sum: 56.659ms 99% C.I. 26us-14600us Avg: 944.316us Max: 17576us
EmptyRBMarkBitStack:	Sum: 55.581ms 99% C.I. 46us-12600us Avg: 926.350us Max: 15517us

思路:

        发生ANR,两个关键节点,一个是AMS log打印的点,一个是/data/anr目录下anr文件写入的点,通过这两个节点可以知道发生了anr。

App的anr发生节点是AppErrors(frameworks/base/services/core/java/com/android/server/am)

AppErrors:appNotResponding(....)能够知道anr发生的app包名和pid

SystemServer的ANR发生的节点在Watchdog:run()函数中

如果是SystemServer的anr,会执行这段函数

                    } else if (waitState == WAITED_HALF) {
                        if (!waitedHalf) {
                            // We've waited half the deadlock-detection interval.  Pull a stack
                            // trace and wait another half.
                            ArrayList<Integer> pids = new ArrayList<Integer>();
                            pids.add(Process.myPid());
                            ActivityManagerService.dumpStackTraces(true, pids, null, null,
                                getInterestingNativePids());
                            waitedHalf = true;
                        }
                        continue;
                    }

而app则不会执行这段。

ActivityManagerService.dumpStackTraces(...)函数就是向/data/anr目录下写anr_文件的地方。

SystemServer ANR会在函数最后kill

                Process.killProcess(Process.myPid());
                System.exit(10);

Zygote会重启。

重启会发生这种log

01-01 00:03:00.495 I/ServiceManager( 2276): service 'usagestats' died
01-01 00:03:00.495 I/ServiceManager( 2276): service 'netpolicy' died
01-01 00:03:00.495 I/ServiceManager( 2276): service 'webviewupdate' died
01-01 00:03:00.495 I/ServiceManager( 2276): service 'binder_calls_stats' died
01-01 00:03:00.495 I/ServiceManager( 2276): service 'sec_key_att_app_id_provider' died
01-01 00:03:00.495 I/ServiceManager( 2276): service 'scheduling_policy' died
01-01 00:03:00.495 I/ServiceManager( 2276): service 'telephony.registry' died
01-01 00:03:00.495 I/ServiceManager( 2276): service 'account' died
01-01 00:03:00.495 I/ServiceManager( 2276): service 'content' died
01-01 00:03:00.495 I/ServiceManager( 2276): service 'settings' died

这个打印的节点是
service_manager.c的svcinfo_death(....)函数打印
/frameworks/native/cmds/servicemanager/service_manager.c

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 12 SystemServer 的启动流程如下: 1. 引导加载:系统启动时,先加载引导程序,进行硬件初始化、内核加载等操作。 2. Zygote 进程启动:Zygote 是 Android 系统中的一个特殊进程,负责孵化其他应用进程。Zygote 进程会预加载一些常用的类和资源,以加快应用的启动速度。 3. SystemServer 进程启动:Zygote 进程会 fork 出 SystemServer 进程,该进程是 Android 系统中的核心服务进程。SystemServer 进程负责启动和管理系统级别的服务,例如 ActivityManagerService、PackageManagerService、WindowManagerService 等。 4. SystemServer 初始化:SystemServer 进程启动后,会进行一系列的初始化操作。首先会创建 Looper 线程,用于接收消息并处理各个服务的初始化工作。然后依次创建各个系统服务,并调用它们的启动方法。 5. 启动系统服务:SystemServer 进程会按照一定顺序启动各个系统服务。每个系统服务都有自己的初始化流程,例如 PackageManagerService 会加载应用程序列表、数据目录等;ActivityManagerService 会初始化进程间通信机制等。 6. 启动应用进程:在系统服务启动完成后,SystemServer 进程会通过 Zygote 孵化出其他应用进程。应用进程会根据 AndroidManifest.xml 中的配置进行初始化,包括创建 Application、加载资源等。 总结来说,Android 12 SystemServer 的启动流程包括引导加载、Zygote 进程启动、SystemServer 进程启动、SystemServer 初始化、启动系统服务和启动应用进程等步骤。这些步骤都是为了在系统启动时提供必要的服务和资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值