4 SystemServer启动:
Zygoteinit.java$main()Zygote进程入口,创建了Zygote server,加载资源,处理其他与申请进程相关的工作。
->
f
o
r
k
S
y
s
t
e
m
S
e
r
v
e
r
(
)
f
o
r
k
S
y
s
t
e
m
S
e
r
v
e
r
进
程
,
返
回
的
R
u
n
n
a
b
l
e
是
f
o
r
k
出
来
的
S
y
s
t
e
m
s
e
r
v
e
r
子
进
程
,
返
回
r
直
接
执
行
m
a
i
n
。
p
i
d
:
p
i
d
值
是
f
o
r
k
之
后
会
变
成
两
个
进
程
,
Z
y
g
o
t
e
进
程
,
和
S
y
s
t
e
m
S
e
r
v
e
r
进
程
,
如
果
f
o
r
k
后
Z
y
g
o
t
e
进
程
i
d
是
1000
,
S
y
s
t
e
m
S
e
r
v
e
r
的
进
程
i
d
为
2000
,
那
f
o
r
k
后
Z
y
g
o
t
e
进
程
的
p
i
d
为
1000
,
S
y
s
t
e
m
S
e
r
v
e
r
进
程
的
p
i
d
为
0.
p
i
d
为
0
用
于
区
别
后
续
逻
辑
流
程
−
>
forkSystemServer() fork SystemServer进程,返回的Runnable是fork 出来的 System_server子进程,返回r直接执行main。 pid:pid值是 fork之后会变成两个进程,Zygote进程,和SystemServer进程,如果fork后Zygote进程id是1000,SystemServer的进程id为2000, 那fork后 Zygote进程的pid为1000,SystemServer进程的pid为0.pid为0 用于区别后续逻辑流程 ->
forkSystemServer()forkSystemServer进程,返回的Runnable是fork出来的Systemserver子进程,返回r直接执行main。pid:pid值是fork之后会变成两个进程,Zygote进程,和SystemServer进程,如果fork后Zygote进程id是1000,SystemServer的进程id为2000,那fork后Zygote进程的pid为1000,SystemServer进程的pid为0.pid为0用于区别后续逻辑流程−>handleSystemServerProcess()
-> KaTeX parse error: Undefined control sequence: \n at position 445: …ng thread pool.\̲n̲"); proc…findStaticMain();反射拿到systemServer类和main方法
->
r
e
t
u
r
n
n
e
w
M
e
t
h
o
d
A
n
d
A
r
g
s
C
a
l
l
e
r
(
m
,
a
r
g
v
)
−
>
return new MethodAndArgsCaller(m, argv) ->
returnnewMethodAndArgsCaller(m,argv)−>run() 子线程执行反射SystemServer main方法
总结:fork SystemServer进程,nativeZygoteInit()通过AndroidRuntime开启binder线程池(binder机制),
applicationInit()通过反射执行SystemServer.main(),返回Runnable,至forkSystemServer()启动。
5 SystemServer.main()执行:
5.0-> new SystemServer().run()
-> run()
创建上下文,systemContext, appContext,一个进程有多个app.
$createSystemContext();
->ActivityThread.systemMain() 创建ActivityThread
$new ActivityThread() 创建activityThread
$thread.attach(true, 0) 绑定
$else
$ContextImpl.createAppContext() 创建appContext
$context.mPackageInfo.makeApplication() 通过反射创建app
->activityThread.getSystemContext()
->ContextImpl.createSystemContext(this) 创建SystemContext
->new LoadedApk(mainThread);一个app 一个LoadedApk(本地状态维持有关目前加载的.apk)
总结:
创建ActivityThread ,通过ActivityThread创建ContextImpl 获取systemServerContext和appContext.
创建application 调用allication.onCreate()方法。
5.1
->new SystemServerManager(),管理服务的生命周期
$startService()通过反射获取继承SystemService的服务类 然后启动
5.2
->startBootstrapServices(t);引导服务比如AMS
(服务阶段标记startBootPhase(t, SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY))
启动ATMS和AMS android 10之后多了一个atms SystemServiceManager调用startService就会执行 ActivityTaskManagerService.Lifecycle.class这个类的onStart方法。
ActivityTaskManagerService atm = mSystemServiceManager.startService(ActivityTaskManagerService.Lifecycle.class).getService()
->$startService()
public SystemService startService(String className) {
//通过反射获取继承SystemService的服务类 然后启动
final Class<SystemService> serviceClass = loadClassFromLoader(className,this.getClass().getClassLoader());
return startService(serviceClass);
}
->$Lifecycle 继承SystemService()
初始化atms
mService = new ActivityTaskManagerService(context);
$onStart()
添加service 到 ServiceManager
publishBinderService(Context.ACTIVITY_TASK_SERVICE, mService);
@匹配于Instrumentation.java->execStartActivity()->ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE);
service为binder 注册Binder服务。
-> ServiceManager.addService(name, service, allowIsolated, dumpPriority);
启动
mService.start()
将指定接口的服务实例添加到本地服务的全局注册表。
->LocalServices.addService(ActivityTaskManagerInternal.class, mInternal);
AMS是一样的逻辑:Lifecycle
总结:
创建ATMS(管理activity),创建AMS(持有ATMS),注册服务。
AMS构造方法:
handler,电量服务,atms,oomAdiProfiler,localService,ActivityTaskManagerInternal。
ATMS.initialize方法,比较重要。
5.3
->startCoreServices(t);核心服务
5.4 launcher启动
->startOtherServices(t);启动launcher进程,其他服务WMS
$mActivityManagerService.systemReady()
$mAtmInternal.resumeTopActivities()
$atms.resumeTopActivities()
->mRootWindowContainer.resumeFocusedStacksTopActivities();
$resumeFocusedStacksTopActivities()这里两次后面还会走一次->targetStack.resumeTopActivityUncheckedLocked(target, targetOptions);
->$resumeTopActivityInnerLocked(prev, options);->resumeNextFocusableActivityWhenStackIsEmpty(prev, options);
->mRootWindowContainer.resumeHomeActivity(prev, reason, getDisplayArea())
->startHomeOnTaskDisplayArea()
-> mService.getActivityStartController().startHomeActivity(homeIntent, aInfo, myReason,taskDisplayArea);
(ActivityStartController.startHomeActivity 关键方法☆)
mLastHomeActivityStartResult = obtainStarter(intent, "startHomeActivity: " + reason)
.execute()
-> ActivityStarter(☆).execute() 关键方法☆ 栈的管理相关
$executeRequest(mRequest)
->startActivityUnchecked()关键方法☆
->startActivityInner
$mRootWindowContainer.resumeFocusedStacksTopActivities()回到上面方法在掉一次
-> resumeFocusedStacksTopActivities()->targetStack.resumeTopActivityUncheckedLocked(target, targetOptions);
-> resumeTopActivityInnerLocked()
-> mStackSupervisor.startSpecificActivity(next, true, false)关键的方法☆;
ActivityStackSupervisor关键☆ //启动launcher 分两种情况:
进程存在(首次不存在)真正的启动 realStartActivityLocked(r, wpc, andResume, checkConfig);
总结:startOtherServices 会启动launcher进程,ActivityManagerService.systemReady(),会执行到
ActivityStartController.startHomeActivity();
ActivityStarter.execute()
最终ActivityStackSupervisor.startSpecificActivity(),该方法里面启动进程。
进程不存在 mService.startProcessAsync()☆
obtainMessage(startProcess)ActivityManagerService 的startProcess()
$startProcessLocked()->startProcess()-> Process.ProcessStartResult startProcess
-> Process.start()进程启动
return ZYGOTE_PROCESS.start(processClass, niceName, uid, gid, gids,
runtimeFlags, mountExternal, targetSdkVersion, seInfo,
abi, instructionSet, appDataDir, invokeWith, packageName,
zygotePolicyFlags, isTopApp, disabledCompatChanges,
pkgDataInfoMap, whitelistedDataInfoMap, bindMountAppsData,
bindMountAppStorageDirs, zygoteArgs);
->ZYGOTE_PROCESS.start()->startViaZygote()->
$zygoteSendArgsAndGetResult(openZygoteSocketIfNeeded(abi),zygotePolicyFlags,argsForZygote)
创建socket进行连接openZygoteSocketIfNeeded()->attemptConnectionToPrimaryZygote();->ZygoteState.connect()
->new LocalSocket() & zygoteSessionSocket.connect(zygoteSocketAddress);
zygoteSendArgsAndGetResult()发送消息->attemptUsapSendArgsAndGetResult()->
usapWriter.write(msgStr);
usapWriter.flush();
总结:进程不存在就会创建socket通知zygote创建进程.
ZygoteInit.java内:
//zygote循环等待,runSelectLoop创建进程,与forkSystemServer类似
//反射启动ActivityThread.main
caller = zygoteServer.runSelectLoop(abiList);
//等待
pollReturnValue = Os.poll(pollFDs, pollTimeoutMs);
//创建进程
final Runnable command = connection.processOneCommand(this);
-> //创建pid进程
pid = Zygote.forkAndSpecialize()
总结:zygote调用runSelectLoop创建进程并反射执行ActivityThread.main().最终也是调用到realStartActivityLocked()
ActivityThread.main():
attach()->//AMS和APP通信使用ApplicationThread,ApplicationThread 是binder
mgr(ams).attachApplication(mAppThread, startSeq) & thread.bindApplication()
&mAtmInternal.attachApplication()->atms.attachApplication()->mRootWindowContainer.attachApplication(wpc);->
RootWindowContainer::startActivityForAttachedApplicationIfNeeded
->mStackSupervisor.realStartActivityLocked()
进程存在与不存在都会执行到realStartActivityLocked方法。
5.5 ActivityStackSupervisor.realStartActivityLocked activity启动:
mService.getLifecycleManager().scheduleTransaction(clientTransaction);
$ClientLifecycleManager.scheduleTransaction()-> transaction.schedule(); -> mClient(ApplicationThread).scheduleTransaction(this);
->//执行父类scheduleTransaction
ActivityThread.this.scheduleTransaction(transaction);
-> sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction); 返回ActivityThread执行handler
-> mTransactionExecutor.execute(transaction);
-> LaunchActivityItem.execute()->ActivityThread(子类).handleLaunchActivity()
-> performLaunchActivity()-> callActivityOnCreate()
总结:ActivityThread执行事务scheduleTransaction,Handler处理消息,EXECUTE_TRANSACTION,最终走到
LaunchActivityItem.execute() ActivityThread(子类).performLaunchActivity()启动activity onCreate()
一个进程可以多个APP 可以的 SystemServer(Systemcontext,Appcontext)createSystemContext()内创建。
一个APP可以是多个进程的
一个App对应一个LoadApk()
ServiceManager(管理Binder服务的):final IBinder b = ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE);
SystemServerManager(管理服务生命周期)