![](https://i-blog.csdnimg.cn/blog_migrate/d357dba15d2b7f01348d07d8fc3e0e7a.webp?x-image-process=image/format,png)
1.前言
- 最近一直在看 《Android进阶解密》 的一本书,这本书编写逻辑、流程都非常好,而且很容易看懂,非常推荐大家去看看(没有收广告费,单纯觉得作者写的很好)。
- 上一篇简单的介绍了Android进阶(二): 应用进程启动过程,最终知道了ActivityThread就是代表应用进程。
- 今天就介绍ActivityThread启动之后,是如何启动
Application
(基于Android 8.0 系统)。
- 文章中实例 linhaojian的Github
2.Application启动过程的时序图
![Application启动流程.png](https://i-blog.csdnimg.cn/blog_migrate/257124521501425fbc88153e0bc5c3c9.webp?x-image-process=image/format,png)
3.源码分析
3.1 ActivityThread初始化:
public static void main(String[] args) {
ActivityThread thread = new ActivityThread();
thread.attach(false, startSeq);
if (sMainThreadHandler == null) {
sMainThreadHandler = thread.getHandler();
}
if (false) {
Looper.myLooper().setMessageLogging(new
LogPrinter(Log.DEBUG, "ActivityThread"));
}
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
Looper.loop();
}
- 主要做了2件事,实例化ActivityThread & 创建主线程Handler与Looper接收信息;
3.2 ActivityThread的attach函数:
private void attach(boolean system, long startSeq) {
RuntimeInit.setApplicationObject(mAppThread.asBinder());
final IActivityManager mgr = ActivityManager.getService();
try {
mgr.attachApplication(mAppThread, startSeq);
} catch (RemoteException ex) {
throw ex.rethrowFromSystemServer();
}
}
- 注释1:获取ActivityManagerService的代理对象;
- 注释2:通过代理对象调用attachApplication(),获取启动application所需信息(应用进程相关数据);
3.3 Ac