在冷启动优化的时候少不了对Application的优化,所以这一篇文章是对Application的创建流程的学习。Zygote创建应用程序进程后实例化ActivityThread,ActivityThread的main方法创建Application的流程。打开frameworks/base/core/java/android/app/ActivityThread.java 我们从ActivityThread.java的main方法开始分析:
public static void main(String[] args) {
...
//初始化主线程的Looper
Looper.prepareMainLooper();
...
//实例化一个ActivityThread
ActivityThread thread = new ActivityThread();
//需要关注的方法
thread.attach(false, startSeq);
...
//在主线程中运行消息队列
Looper.loop();
}
在main方法中使用了Handler机制,先初始化Looper,然后实例化一个ActivityThread对象,该对象中有final修饰的H内部类(该类继承Handler)并进行了实例化,最后调用Looper.loop()开启了主线程的消息循环。
接着看一下thread.attach(false, startSeq)这一段执行的代码:
private void attach(boolean system, long startSeq) {
sCurrentActivityThread = this;
mSystemThread = system;//是否是系统进程
if (!system) {
android.ddm.DdmHandleAppName.setAppName("<pre-initialized>",
UserHandle.myUserId());
//在RuntimeInit中设置ApplicationThread的Binder
RuntimeInit.setApplicationObject(mAppThread.asBinder());
//获取AMS服务
final IActivityManager mgr = ActivityManager.getService();
try {
//调用AMS服务的attachApplication来启动一个Application, 需要关注的方法
mgr.attachApplication(mAppThread, startSeq);
} catch (RemoteException ex) {
throw ex.rethrowFromSystemServer();
}
...
} else {
//系统进程的处理
...
}
}
在ActivityThread的attach方法中调用AMS服务的attachApplication来启动一个Application,接下来我们看一下mgr.attachApplication(mAppThread, startSeq)。打开ActivityManagerService.java