学习笔记,整理中;需要再看n遍。
面:
自己思路整理:
1、android启动流程
- boot rom
- boot loader
- kernal
- init(pid=1) :
- 创建和挂载系统所需要的文件和目录: framework的资源;
- 初始化和启动属性服务
- 解析init.rc 配置文件并启动zygote进程: 解析init.rc 创建各种服务进程
- zygote(android runtime) :
- fork -> app进程
- 一个进程所需要的必要资源
- preloadclass
- vm
- fork 大儿子 system_server进程
- system service
- apps
2、zygote启动流程
init.cpp(main) > 解析init.zygote.rc > 启动main类型服务(do_class_start) > 启动zygote服务(start()) > 创建zygote进程(fork()) > app_main.cpp(main())
3、AMS启动过程
(1) system server启动
SystemServer.main初始化SystemServer对象,再调用对象的run()方法;
-
SystemServer.run:
CreateSystemContext;
startBootStrapService 启动引导服务;
startCoreService 启动核心服务;
startOtherService 启动其他服务,80多个;
Looper.loop()进入loop循环
(2)AMS启动过程 startBootstrapServices
- mSystemServiceManager.startService
- 经过一堆 startService --> 创建Lifecycle对象 --> 创建AMS:创建"android.ui"的线程、创建ActiveServices、创建ActivityStackSupervisor对象
- 通过LifeCycle的getService返回AMS对象
- mSystemServiceManager.setInstaller 设置AMS的安装器
- mSystemServiceManager.initPowerManagement 初始化AMS相关的PMS
- mSystemServiceManager.setSystemProcess 设置SystemServer
添加了各种服务:activity AMS;procstats 进程统计;meninfo 进程统计;gfxinfo 图像信息;dbinfo 数据库;cpuinfo cpu;permision 权限;processinfo 进程服务;useagestats 应用的使用情况。
abd shell dumsys 的各种服务来源 暂不懂
-
mSystemThread.installSystemApplicationInfo:
- getSystemContext().installSystemApplicationInfo 最终调用LoadedApk的installSystemApplicationInfo,加载名为“android”的package
- 创建用于性能统计的Profiler对象
创建ProcessRecord对象
(3)AMS启动过程 startOtherServices
- mActivityManagerService.setWindowManager(wm) 与WMS管理
- mActivityManagerService.installSystemProviders
- 安装系统Provider
- 创建核心Settings Observer,用于监控Settings的改变
- mActivityManagerService.systemReady
- startSystemUi 启动系统UI
- 执行一系列服务的systemReady
- startHomeActivityLocked
(4)system_server进程
-
SystemServer.run-->createSystemContext-->
-
ActivityThread.systemMain
-
new ActivityThread
- 创建ApplicationThread对象
- mInitialApplication的赋值
- system_server进程是由ActivityThread.attach()过程赋值
- 普通app进程是由是由ActivityThread.handleBindApplication()过程赋值
- ResourcesManager.getInstance() 获取资料管理实例
-
thread.attach(true) //attach到进程
- 创建Instrumentation
- ContextImpl.createAppContext--> activityThread.getSystemContext-->ContextImpl.createSystemContext 单例模式创建mSystemContext对象
- - - - > 创建LoadedApk对象:创建ApplicationInfo对象、创建ClassLoader
- - - - > 创建ContextImpl:首次执行getSystemContext,会创建LoadedApk和contextImpl对象,接下来利用刚创建的LoadedApk对象来创建新的ContextImpl对象
- makeApplication
--> initializeJavaContextClassLoader 设置当前线程的Context ClassLoader
--> newApplication
- - - - > instantiateApplication 创建Application对象
- - - - > 将新创建的ContextImpl对象保存到Application的父类成员变量mBase
- - - - >将新创建的LoadedApk对象保存到Application的父员变量mLoadedApk
- mInitialApplication.onCreate()
返回systemMain线程
-
mSystemContext.setTheme 设置系统主题
-
SystemServer.run-->开始启动各种服务
(5) App进程启动过程
ActivityThread.main 当Zygote收到AMS请求创建一个新app进程后,会调用到AT.main
- new ActivityThread
- mAppThread = new ApplicationThread() :class ApplicationThread extends IApplicationThread.Stub
- AT.attach -- attachApplication binder通信权限验证 这里来到AMS - - attachApplicationLocked - - thread.bindApplication 这是一个binder通信过程 这里来到App
- 创建一个AppBindData
- sendMessage(H.BIND_APPLICATION, data)-->handleBindApplication
- 创建一个Instrumentation
- data.info = getPackageInfoNoCheck 获取LoadedApk对象-->getPackageInfo
- ContextImpl.createAppContext 创建ContextImpl上下文
- data.info.makeApplication 通过反射创建目标应用Application对象
------> 创建ClassLoader对象
------> ContextImpl.createAppContext
------> mActivityThread.mInstrumentation.newApplicatio 创建Application对象-- newApplication--attach -- attachBaseContext Application的mBase - mInstrumentation.callApplicationOnCreate-->app.onCreate 常见的application的oncreate就是这里调用的
(6) Activity.startActivity
--> startActivityForResult--> Instrumentation.execStartActivity --> AMS.startActivity --> AMS.startActivityAsUser --> mActivityStartController.obtainStarter.execute 这里会调用到ActivityStarter的execute方法 --> ActivityStarter.startActivity 这里有多重调用 --> ActivityStarter.startActivityUnchecked-->
- 根据启动标志位和Activity启动模式来决定如何启动一个Activity以及是否要调用deliverNewIntent方法通知Activity有一个Intent试图重新启动它
- ASS.resumeFocusedStackTopActivityLocked -- ASS.resumeTopActivityUncheckedLocked -- ASS.resumeTopActivityInnerLocked -- ASS.startSpecificActivityLocked
--> ASS.realStartActivityLocked
--> AMS.startProcessLocked 进程还没创建 -- AMS.startProcess -- Process.start--zygoteProcess.start -- zygoteProcess.startViaZygote:zygoteSendArgsAndGetResult 、openZygoteSocketIfNeeded
4、activity启动(APP到AMS再到APP 用binder来处理,app会处理binderproxy给AMS)
APP
- execStartActivity
- ActivityThread(主线程)
Activity1-->instrumentation
- startActivity
- ActivityManagerProxy
- startActivity:跨进程的binder调用
AMS
ActivityManagerService
- startActivityMayWait
- ActivityStackSupervisor
- 处理Activity栈
- ActivityStack-->ActivityRecord
- scheduleLaunchActivity
- ApplicationThreadProxy
- scheduleLaunchActivity:跨进程的binder调用
APP
- handleMessage
- ApplicationThread
Handler-->CallBack
- handleLaunchActivity
- newActivity
- ActivityThread(主线程)
Instrumentation-->ClassLoader
- onCreate
- ActivityThread(主线程)
Activity2
5、 应用程序启动(借图)
- Launcher进程
请求启动根Activity - AMS
请求创建应用程序进程:socket - Zygote进程
创建并启动应用程序进程 - 应用程序进程
应用程序进程准备就绪-->到达AMS-->启动根Activity-->到达应用程序进程