1,Android的启动流程
当手机按下电源键之后,会从内存中Boot Rom读取一般小程序Boot Loader,Boot Loader会拉起linux的系统内核,加载计划缓存,加载驱动等再去拉起系统的OS,继而去内核中运行一个init.rc的初始化脚本,拉起init进程,init进程启动之后,会去启动zygote进程,zygote进程启动之后,会去创建一个System_server进程,在System_server进程中会启动android中三大类服务,引导服务,核心服务和其他服务。
2,Zygote的启动流程
init进程启动之后,回去解析一个init.rc的脚本,启动zygote进程,运行app_main.cpp的main函数
Zygote的工作内容
3,SystemServer进程的启动 运行app_main_cpp会准备好AndroidRuntime,Android环境,启动Android运行虚拟机,registerZygoteSocket创建一个socket服务,Socket是接收AMS创建新进程的请求和命令,startSystemServer()方法会去启动SystemServer进程;Android中app启动时从Zygote进行fork的,如果从init进程fork,会导致fork的进程还没有startAndroidRuntime()和startVM()准备好Android的环境和虚拟机,app进程需要自己去重新启动,预加载一些类文件,是很耗时的,所有从init进行fork是不合理的;从SystemServer进程fork会导致应用进程存在大量并不需要的服务,fork进程时通信使用Socket不使用Binder是因为Binder在这个时候还没有创建好;第二个原因是Binder是并发的使用binder会导致死锁(比如在其他线程给主线程加锁,通过Binder通信后fork进程,导致新创建的应用进程不能解锁) ATMS,AMS,PMS,WMS等都是在SystemServer进程中启动的,启动ATMS的时候会创建生命周期管理对象,进而会去启动AMS对象,在创建AMS对象的时候,会创建栈管理对象createStackSupervisor(),在setSystemProcess()方法中会把AMS添加到ServiceManager中,ATMS是在publishBinderService这个方法中添加到ServiceManager管理类中的,还会添加Binder服务的相关信息。
一个进程一个虚拟机这样的设计的好处在于:进程是系统分配资源的最小单位,每个进程内存是私有的、隔离的,便于虚拟机来管理内存;符合沙盒机制,一个进程挂掉之后不会影响其他进程。
SystemServer进程启动调用
4,AMS的启动流程
SystemServiceManager管理的是SystemService系统启动的服务
Service_manager 管理的是各种binder的服务
mActivityServiceManager = mSystemServiceManager.startService(ActivityServiceManager.Lifecycle.class).getService()
在LifeCycle的构造方法中创建ActivityServiceManager
Public lifeCycle(Context context) { service = new ActivityServiceManager(context) }
在创建ActivityServiceManager过程中会创建很多
mUiHandler = mInjector.getSystemUiContext()
mProcessState = new ProcessStateService(this, new File(systemDir, "processState"))
mStackSupervior = creatStackSupervior()
protect ActivityStackSupervisor creatStackSupervisor(){
final ActivitySupervisor supervisor = new ActivitySupervisor(this, mHandler.getLooper());
supervisor.initialize();
reture supervisor;
}
mLifeCycleManager = new ClientCycleManager()
5,Activity的启动流程
ativity.startActivity ----> startActivityForUser ----> Instrumentation.excuStartActivity ----> ATM ----> startActivity
进入到ATMS的startActivity的时候会去判断要去启动的activity所在所在的进程是否存在
ActivityState.java中的startActivityInner方法中mRootWindowCoontaier.resumeFocusedStackesTopActivities(mTargetStack, mStartActivity, mOptions)
mTargetStack.resumeTopActivityUnCheckedLocked(traget, tragetOptions)
mStartSupervisor.startSpecificActivity(next, true, false)
startSpecificActivity这个方法中回去判断进程是否存在
进程存在:realStartActivityLocked
进程不存在:mService.startProcessAsync用Socket通知Zygote去fork进程,执行AMS的startProcess---> startProcessLocked---> process.processStartResult---process.start---> ZYGOTE_PROCESS.start----> startViaZygote---->zygoteSendArgsAndGetForResult(openZygoteSocketIfNeeded(abi),zygotePolicyFlags,argsForZygote) 在openZygoteSocketIfNeeded方法中创建Socket,两个Socket:attemptConnectToPrimaryZygote和attemptConnectSocketSecondaryZygote,在attemptConnectToPrimaryZygote创建客户端的Socket LocalSocket在调用localSocket.connect(zygoteSocketAdress)最终会去执行realStartActivityLocked
AMS管理新进程
ActivityThread.main ----> thread.attach ----ActivityManager.getService(mgr)拿到AMS ----> mgr.attachApplication(mAppThread, startSeq)通过这个方法把application传给了ams,mAppThread是一个Binder服务