0
点赞
收藏
分享

微信扫一扫

SystemServer启动,Launcher启动,onCreate启动

彩虹_bd07 2022-04-15 阅读 51
android

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()forkSystemServerRunnableforkSystemserverrmainpid:pidforkZygoteSystemServerforkZygoteid1000SystemServerid2000forkZygotepid1000SystemServerpid0.pid0>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(管理服务生命周期)

举报

相关推荐

0 条评论