三个进程:
Launcher进程:整个App启动流程的起点,负责接收用户点击屏幕事件,它其实就是一个Activity,里面实现了点击事件,长按事件,触摸等事件,可以这么理解,把Launcher想象成一个总的Activity,屏幕上各种App的Icon就是这个Activity的button,当点击Icon时,会从Launcher跳转到其他页面。
SystemServer进程:这个进程在整个的Android进程中是非常重要的一个,地位和Zygote等同,它是属于Application Framework层的,Android中的所有服务,例如AMS, WindowsManager, PackageManagerService等等都是由这个SystemServer fork出来的。
App进程:你要启动的App所运行的进程。
六个大类:
ActivityManagerService:(AMS)AMS是Android中最核心的服务之一,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块相类似,因此它在Android中非常重要,它本身也是一个Binder的实现类。
Instrumentation:监控应用程序和系统的交互。
ActivityThread:应用的入口类,通过调用main方法,开启消息循环队列。ActivityThread所在的线程被称为主线程。
ApplicationThread:ApplicationThread提供Binder通讯接口,AMS则通过代理调用此App进程的本地方法。
ActivityManagerProxy:AMS服务在当前进程的代理类,负责与AMS通信。
ApplicationThreadProxy:ApplicationThread在AMS服务中的代理类,负责与ApplicationThread通信。
1. 安卓手机系统的桌面其实也是一个Activity
可以在命令行通过 adb shell dumpsys activity activities
来查看正在运行的activities

2. 点击桌面app图标,桌面Activity响应点击事件,通过startActivity(intent)或LauncherApps的startMainActivity方法以启动app的主activity。

因此,每个app都需要设置一个主Activity:
<activity
android:name=".MainActivity"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
3. startActivity(Intent) 最终会执行Instrumentation类的execStartActivity,并通过ActivityManagerService启动主Activity;

可以看到,
ActivityManager.getService()
是获取ActivityManagerService的代理类实例, 然后来启动app的主Activity
4. 然后Zygote进程会创建app应用进程,完成了进程创建的操作后就会执行主线程ActivityThread的main()方法。
进入到ActivityThread的main方法以后,首先进行一些初始化(包括参数设置、性能安全监控之类的),然后初始化Looper(Looper、Handler消息机制),创建ActivityThread,存储线程的Handler,最后启动Looper监听消息。
再之后ActivityThread通过Binder将ApplicationThread对象传递给ActivityManagerService,并完成启动Activity的后续工作。


attachApplication(mAppThread, startSeq)
会调用ActivityManagerService的attachApplicationLocked方法
这里的
thread.bindApplication
即调用ActivityThread中的bindApplication方法;
在bindApplication中通过sendMessage(H.BIND_APPLICATION, data)
调起ActivityThread中的handleBindApplication(data)
方法;
在handleBindApplication中,通过Instrumentation的callApplicationOnCreate调用了Application的onCreate()
。

5. app的进程和主线程创建&初始化完成后,获取应用的ActivityStack,并取出主Activity,并在ActivityThread中通过mInstrumentation.callActivityOnCreate
调起Activity。
推荐阅读:
Android App启动流程详解
(部分内容参考于网络,如有不妥,请联系删除~)
网友评论