这篇文章主要记录分析monkey出现的一个system server无法正常启动问题
…
注:文章分析过程比较长,阅读分析过程前,可以先参考文章末尾的问题主线图
Socket原理
Pipe原理
分析工具
问题现象
设备跑monkey过程中system server重启,但是没有成功启动,system server被block,出现卡白米的现象。
问题分析
首先看看system server main线程当前的状态:
"main" prio=5 tid=1 Waiting
| group="main" sCount=1 dsCount=0 flags=1 obj=0x75b72710 self=0x7ed70c2a00
| sysTid=22740 nice=-2 cgrp=default sched=0/0 handle=0x7f5bcaa9a8
| state=S schedstat=( 2377978501 402005404 2887 ) utm=174 stm=63 core=2 HZ=100
| stack=0x7fed985000-0x7fed987000 stackSize=8MB
| held mutexes=
at java.lang.Object.wait(Native method)
- waiting on <0x053add86> (a java.lang.Object)
at java.lang.Thread.parkFor$(Thread.java:2137)
- locked <0x053add86> (a java.lang.Object)
at sun.misc.Unsafe.park(Unsafe.java:358)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:190)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:868)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1021)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1328)
at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:232)
at com.android.server.NetworkManagementService.create(NetworkManagementService.java:377)
at com.android.server.NetworkManagementService.create(NetworkManagementService.java:386)
at com.android.server.SystemServer.startOtherServices(SystemServer.java:1070)
at com.android.server.SystemServer.run(SystemServer.java:407)
at com.android.server.SystemServer.main(SystemServer.java:283)
at java.lang.reflect.Method.invoke(Native method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:518)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:801)
从打印出的栈信息来看,system server正在启动NetworkManagementService,并且在等待一个CountDownLatch的完成,那么这个需要等待的任务是什么呢?
private class NetdCallbackReceiver implements INativeDaemonConnectorCallbacks {
@Override
public void onDaemonConnected() {
Slog.i(TAG, "onDaemonConnected()");
// event is dispatched from internal NDC thread, so we prepare the
// daemon back on main thread.
if (mConnectedSignal != null) {
// The system is booting and we're connecting to netd for the first time.
mConnectedSignal.countDown();
mConnectedSignal = null;
}
// ...
}
// ...
}
当NetworkManagementService create的时候,会创建一个NativeDaemonConnector并与netd通过socket进行连接,只有socket连接建立完成,NetworkManagementService才算真正创建完成。而这里,显然是因为与netd之间的socket一直没有创建成功才导致的等待。
02-04 08:42:05.532 1000 22740 22900 E NetdConnector: Communications error: java.io<