Android App的启动流程
1.点击app图标,Launcher进程通过Binder
向System_Server
进程发送一个startActivity请求
2.System_Server
进程收到请求,通过Binder
向zygote进程发送一个创建新进程请求
3.zygote
进程 fork一个新的app进程
4.app进程通过Binder
向System_Server
进程发送一个attachApplication请求
5.System_Server
进程通过Binder
向 app 发送一个scheduleLaunchActivity
请求
6.app 的applicationThread
接受请求(也叫Binder线程),通过handler向主线程发送一个LAUNCH_ACTIVITY
请求。
7.开始正常的activity创建过程。
多次用到Binder 进行多进程通信,可以简单的解释一下
1.client通过获得一个server的代理接口,对server进行调用。
2.代理接口中定义的方法与server中定义的方法时一一对应的。
3.client调用某个代理接口中的方法时,代理接口的方法会将client传递的参数打包成Parcel对象。
代理接口将Parcel发送给内核中的binder driver。
4.server会读取binder driver中的请求数据,如果是发送给自己的,解包Parcel对象,处理并将结果返回。
5.整个的调用过程是一个同步过程,在server处理的时候,client会block住。因此client调用过程不应在主线程。
看上图ApplicationThread
向ActvityThread
发送了一个message
ActivityThread
是先于ApplicationThread
执行的,ApplicationThread
在ActivityThread
里初始化。
app的真正启动过程是从ActivityThread
的main
方法开始的
public static void main(String[] args) {
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ActivityThreadMain");
// CloseGuard defaults to true and can be quite spammy. We
// disable it here, but selectively enable it later (via
// StrictMode) on debug builds, but using DropBox, not logs.
CloseGuard.setEnabled(false);
Environment.initForCurrentUser();
// Set the reporter for event logging in libcore
EventLogger.setReporter(new EventLoggingReporter());
// Make sure TrustedCertificateStore looks in the right place for CA certificates
final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId());
TrustedCertificateStore.setDefaultUserDirectory(configDir);
Process.setArgV0("<pre-initialized>");
// 大名鼎鼎的消息机制Looper在app创建的时候就初始化了,ActivityThread并不是一个线程类,而是在线程里执行了ActivityThread.main方法。
Looper.prepareMainLooper();
ActivityThread thread = new ActivityThread();
// application的创建
thread.attach(false);
if (sMainThreadHandler == null) {
sMainThreadHandler = thread.getHandler();
}
if (false) {
Looper.myLooper().setMessageLogging(new
LogPrinter(Log.DEBUG, "ActivityThread"));
}
// End of event ActivityThreadMain.
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
// 开启循环模式 防止线程结束
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}
网友评论