基于Android 8.0
相关源码太多,不利于阅读和记忆,因此本文时序图为主,重要源码为辅。请注意,本文讲的是应用根Activity的启动流程,和普通Activity的启动流程有些不一样。
作为一个应用层开发者,掌握应用启动流程是必须的。
Android Binder通信步骤:1.注册服务。2.请求服务。3.传输数据。
Binder机制模型:C/S模型。
Activity启动分为两种,根Activity和普通Activity。根Activity启动我将它分为7步。
第一步:Launcher 通过binder机制请求AMS启动Activity
这里面有个“监视”思想值得我们学习,我们组件化开发的时候可以给我们各个组件加一个监视类,来监视组件的交互。Instrumentation主要监视应用程序和系统的交互,这里的系统包含Framework层,也就是说应用程序和系统的交互都需要经过这个类。这一步涉及到两个进程Launcher进程和system_server进程,通过Binder机制通信。Binder机制是C/S模型的,此处 Launcher是C端,AMS是S端。
第二步:配置Activity的信息 AMS接收到请求后通过ActivityStarter解析Intent和Flag,在通过ActivityStack为Activity配置栈信息。并判断是否需要创建应用进程。
第三步:配置应用进程信息并通过Socket请求Zygote创建子进程 通过系统进程管理类Process配置应用进程信息,这一步涉及到连个进程system_server进程和 Zygote进程,通过Socket通信。
第四步:创建应用进程(启动进程) ZygoteServer接收到AMS的Socket请求,通过ZygoteConnection fork应用进程。fork进程后会返回一个pid,通过判断pid进入到应用进程。Zygote进程在初始化的的时候就创建了Socket并Loop等待AMS的请求。
第五步:应用进程初始化(进程准备工作,进程Loop) 初始化Binder线程池(通过ZygoteInit),初始化运行时环境(通过RunntimeInit)。通过ActivityThread创建主线程,创建H类,开始Loop循环。并通过Binder向AMS发送绑定Application的请求。
第六步:绑定Application AMS接收到ActivityThread发送的请求后,把Application和进程进程绑定(这就是每个进程只有一个Application的原因)。最后通过Binder机制请求启动Activity。
第七步:启动Activity ApplicationThread接收到请求后调用ActivityThread#performLaunchActivity来间接调用Activity的onCreate方法。这里有个注意点ActivityThread调用Activity也通过了Instrumention。
Launcher请求AMS
Launcher和AMS从Binder机制模型来说前者是Client后者是Server。这一 过程从Binder通信步骤来说是请求服务(Launcher请求AMS)和传输数据(请求 启动目标Activity)。
Launcher请求AMS的过程,从Binder机制角度来看,包含请求服务 和 传输数据.
涉及类的作用
Instrumentation.java:监视应用程序和 系统(包含framework)的所有交互。跟踪Appllication和Activity的生命周期。用于android 应用测试框架中,被做为基类使用。
ActivityManager.java:该类提供关于activity、service和进程的信息,并与之交互。该类中的许多方法都是用于调试和提供信息的.
//Instrumentation.java 这个类主要用于监控应用程序和系统的交互。
execStartActivity{
...
ActivityManager.getService() //Binder机制角度分析 获取服务:Launcher获取AMS服务。注册服务:AMS已经注册好了
//AIDL角度分析 得到AMS的代理对象,8.0之前是通过AMN.getDefault得到代理对象
.startActivity(whoThread, who.getBasePackageName(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()),
token, target != null ? target.mEmbeddedID : null,
requestCode, 0, null, options);//Bind机制角度分析 传输数据。
//最终调用的是AMS的startActivity方法。在此将处理逻辑交给AMS,实现跨进程通信
...
}
//ActivityManager.java
getService{
//AIDL的形式,8.0之前用的不是AIDL
return IActivityManagerSingleton.get();
}
private static final Singleton<IActivityManager> IActivityManagerSingleton =
new Singleton<IActivityManager>() {
@Override
protected IActivityManager create() {
//获得AMS的引用
final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
final IActivityManager am = IActivityManager.Stub.asInterface(b);
return am;
}
};
复制代码
AMS请求Zygote创建应用进程
这一部分可以分为两步,第一步AMS通过Socket请求Zygote。第二步Zygote接收到请求后创建目标进程(运行此Activity的进程)。
AMS通过Socket请求Zygote
相关类简介:
AMS(ActivityManagerService):管理所有APP的四大组件通信。
ActivityStarter: 控制器,用于解释如何启动活动。该类收集所有逻辑,用于确定Intent和flag应如何转换为活动以及相关的任务和堆栈。
ActivityStackSupervisor.java:AMS的stack管理主要有三个类,栈的大管家ActivityStackSupervisor,ActivityStack和TaskRecord
ActivityStack.java:管理类,用来管理系统所有的Activity,内部维护了Activity的所有状态和Activity相关的列表等数据。
Process.java:管理操作系统进程。
ZygoteProcess.java:维护与Zygote进程的通信状态。
//ActivityStarter.java Android 7.0新加的类,加载Activity的控制类。并将Activity和Task和Stack相关联。
//ActivityStackSupervisor.java
void startSpecificActivityLocked(ActivityRecord r, boolean andResume, boolean checkConfig) {
// 当前Activity所需的应用进程
ProcessRecord app = mService.getProcessRecordLocked(r.processName,
r.info.applicationInfo.uid, true);
r.task.stack.setLaunchTime(r);
// 如果应用进程已经存在
if (app != null && app.thread != null) {
try {
if ((r.info.flags&ActivityInfo.FLAG_MULTIPROCESS) == 0
|| !"android".equals(r.info.packageName)) {
app.addPackage(r.info.packageName, r.info.applicationInfo.versionCode,
mService.mProcessStats);
}
realStartActivityLocked(r, app, andResume, checkConfig);
return;
} catch (RemoteException e) {
Slog.w(TAG, "Exception when starting activity "
+ r.intent.getComponent().flattenToShortString(), e);
}
}
//创建应用进程
mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
"activity", r.intent.getComponent(), false, false, true);
}
//ZygoteProcess.java
zygoteSendArgsAndGetResult(){
...
openZygoteSocketIfNeeded(){
...
primaryZygoteState = ZygoteState.connect(mSocket);//与Zygote进程 建立Socket连接
...
}
...
}
复制代码
Zygote创建进程
Zygote接收AMS请求后创建目标进程。Zygote进程在做准备工作时已经把Socket的Server端创建好了,并一直等待着AMS的请求。
相关类简介:
ZygoteServer:Zygote进程的Socket Server实现类(接收AMS 的请求)。并派生继承VM初始状态的子进程。
ZygoteConnection.java:真正生成子进程的类。当子进程创建完毕后进入子进程。
RuntimeInit.java:进程 运行时 初始化入口。
ZygoteInit.java:Zygote进程启动类。
ActivityThread.java:负责应用程序进程中主线程的执行,按照Activity Manager的请求调度和执行Activity、Broadcast和其他操作。
//ZygoteServer.java
runSelectLoop(){
...
while(true){//此处一直循环
...
//当有AMS的请求到来时,runOnce方法就会执行。
boolean done = peers.get(i).runOnce(this);
...
}
}
//ZygoteConnection.java
runOnce(){
...
Zygote.forkAndSpecialize();//创建目标进程。此方法调用native方法fork进程。
...
//处理目标进程。也就是说由Zygote转入到目标进程(应用进程)
handleChildProc();
...
}
//ZygoteInit.java
zygoteInit(){
...
ZygoteInit.nativeZygoteInit();//目标进程创建Binde线程池
RuntimeInit.applicationInit();
...
}
//RunntimeInit.java
invokeStaticMain(){
...
cl = Class.forName(className, true, classLoader);//通过反射获取ActivityThread类
...
m = cl.getMethod("main", new Class[] { String[].class });//通过反射得到ActivityThread的Main方法
...
throw new Zygote.MethodAndArgsCaller(m, argv);//抛出异常,ZygoteInit捕获到。
}
//ZygoteInit.java
try{}catch(MethodAndArgsCaller caller){
caller.run();//调用ZygoteInit.MethodAndArgsCaller.run()
}
//ZygoteInit.MethodAndArgsCaller.java
run(){
mMethod.invoke();//调用ActivityThread的main方法。
}
//ActivityThread.java
public static void main(String[] args) {
...
//创建主线程 Looper
Looper.prepareMainLooper();
ActivityThread thread = new ActivityThread();
thread.attach(false);
if (sMainThreadHandler == null) {
//创建主线程H类
sMainThreadHandler = thread.getHandler();
}
//主线程进入轮询状态
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}
//至此目标进程创建完毕。
复制代码
ActivityThread启动Activity
接着上一小节分析。
//ActivityThread.java
attach(boolean system) {
...
//Binder机制角度分析 获取服务:应用进程获取AMS服务。
final IActivityManager mgr = ActivityManager.getService();
try {
//Binder机制角度分析 传输数据:Client请求调用AMS#attachApplication。
mgr.attachApplication(mAppThread);
} catch (RemoteException ex) {
throw ex.rethrowFromSystemServer();
}
...
}
//ActivityStackSupervisor.java
realStartActivityLocked(ActivityRecord r, ProcessRecord app,
boolean andResume, boolean checkConfig) {
...
//Binder机制角度分析 传输数据:Server返回请求调用ActivityThread#scheduleLaunchActivity。
app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
System.identityHashCode(r), r.info,
mergedConfiguration.getGlobalConfiguration(),
mergedConfiguration.getOverrideConfiguration(), r.compat,
r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle,
r.persistentState, results, newIntents, !andResume,
mService.isNextTransitionForward(), profilerInfo);
...
}
//ActivityThread.java
performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
...
// attach 到 Window 上
activity.attach(appContext, this, getInstrumentation(), r.token,
r.ident, app, r.intent, r.activityInfo, title, r.parent,
r.embeddedID, r.lastNonConfigurationInstances, config,
r.referrer, r.voiceInteractor);
...
if (theme != 0) {
activity.setTheme(theme);//设置主题
}
activity.mCalled = false;
if (r.isPersistable()) {
mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
} else {
mInstrumentation.callActivityOnCreate(activity, r.state);
}
...
}
//Activity.java
final void performCreate(Bundle icicle, PersistableBundle persistentState) {
restoreHasCurrentPermissionRequest(icicle);
onCreate(icicle, persistentState);//执行Activity
mActivityTransitionState.readState(icicle);
performCreateCommon();
}
复制代码