android - home键及launcher启动流程分析(一)

2014-11-24 08:49:18 · 作者: · 浏览: 0
android - home键及launcher启动流程分析
launcher,也就是android的桌面应用程序,开机启动的第一个应用程序及按home键进入的都是这个程序。
如果需要修改启动流程或者制作一个新的launcher,都有必要了解一下这个流程。
第一部分:系统默认Home应用程序(launcher)启动流程
1、frameworks/base/services/java/com/android/server/SystemServer.java
一直以来大家都记得"hello world"程序就是写一个main函数,那么我们这里也从main函数开始:
public static void main(String[] args)
这里分为两个过程:
SystemServer.init1
启动几个重要navtive service,比如 SurfaceFlinger、SensorService
SystemServer.init2
启动java service,比如 ContentService、PowerManagerService、MountService、WindowManagerService 等等
2、frameworks/base/services/java/com/android/server/am/ActivityManagerSer vcie.java
启动 ActivityManagerService跳到如下:
[java]
Slog.i(TAG, "Activity Manager");
context = ActivityManagerService.main(factoryTest);
public static final Context main(int factoryTest) {
AThread thr = new AThread();
thr.start();
synchronized (thr) {
while (thr.mService == null) {
try {
thr.wait();
} catch (InterruptedException e) {
}
}
}
ActivityManagerService m = thr.mService;
mSelf = m;
ActivityThread at = ActivityThread.systemMain();
mSystemThread = at;
Context context = at.getSystemContext();
context.setTheme(android.R.style.Theme_Holo);
m.mContext = context;
m.mFactoryTest = factoryTest;
m.mMainStack = new ActivityStack(m, context, true);
m.mBatteryStatsService.publish(context);
m.mUsageStatsService.publish(context);
synchronized (thr) {
thr.mReady = true;
thr.notifyAll();
}
m.startRunning(null, null, null, null);
return context;
}
这个函数首先通过AThread线程对象来内部创建了一个ActivityManagerService实例,然后将这个实例保存其成员变量
mService中,接着又把这个ActivityManagerService实例保存在ActivityManagerService类的静态成员变量mSelf中,
最后初始化其它成员变量,就结束了。
AThread 线程启动代码如下:
[java]
AThread thr = new AThread();
thr.start();
static class AThread extends Thread {
ActivityManagerService mService;
boolean mReady = false;
public AThread() {
super("ActivityManager");
}
public void run() {
Looper.prepare();
android.os.Process.setThreadPriority(
android.os.Process.THREAD_PRIORITY_FOREGROUND);
android.os.Process.setCanSelfBackground(false);
ActivityManagerService m = new ActivityManagerService();
synchronized (this) {
mService = m;
notifyAll();
}
synchronized (this) {
while (!mReady) {
try {
wait();
} catch (InterruptedException e) {
}
}
}
...
}
3、ActivityManagerService.systemReady
ServerThread.run函数在将系统中的一系列服务都初始化完毕之后才调用
[java]
SystemService.java:
// We now tell the activity manager it is okay to run third party
// code. It will call back into us once it has gotten to the state
// where third party code can really run (b