Android 系统9.0.0 启动-launcher
Android系统启动流程的最后一步:Launcher的启动流程
launcher
系统应用的第一个加载的应用就叫launcher 在AndroidManifest.xml文件中配置intent-filter
如:
frameworks/base/services/java/com/android/server/SystemServer.java
1. 启动SystemServer进程后启动所有服务
public static void main(String[] args) {
new SystemServer().run();
}
private void run() {
...
// Start services.
try {
traceBeginAndSlog("StartServices");
startBootstrapServices();
startCoreServices();
startOtherServices();
SystemServerInitThreadPool.shutdown();
} catch (Throwable ex) {
Slog.e("System", "******************************************");
Slog.e("System", "************ Failure starting system services", ex);
throw ex;
} finally {
traceEnd();
}
...
}
2. SyetemServer ->启动 PackageManagerService -> 应用程序安装 ->ActivityManagerService ->启动 Launcher
private void startOtherServices() {
...
mActivityManagerService.systemReady(() -> {
...
mSystemServiceManager.startBootPhase(SystemService.PHASE_ACTIVITY_MANAGER_READY);
}
....
}
3. frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
public void systemReady(final Runnable goingCallback, TimingsTraceLog traceLog) {
...
synchronized (this) {
...
mStackSupervisor.resumeFocusedStackTopActivityLocked();
}
}
4. 继续跟踪 resumeFocusedStackTopActivityLocked frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java
boolean resumeFocusedStackTopActivityLocked() {
return resumeFocusedStackTopActivityLocked(null, null, null);
}
boolean resumeFocusedStackTopActivityLocked(
ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) {
if (!readyToResume()) {
return false;
}
if (targetStack != null && isFocusedStack(targetStack)) {
//启动栈顶activty
return targetStack.resumeTopActivityUncheckedLocked(target, targetOptions);
}
final ActivityRecord r = mFocusedStack.topRunningActivityLocked();
if (r == null || !r.isState(RESUMED)) {
mFocusedStack.resumeTopActivityUncheckedLocked(null, null);
} else if (r.isState(RESUMED)) {
// Kick off any lingering app transitions form the MoveTaskToFront operation.
mFocusedStack.executeAppTransition(targetOptions);
}
return false;
}
5. 继续跟踪 resumeTopActivityUncheckedLocked frameworks/base/services/core/java/com/android/server/am/ActivityStack.java
boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) {
if (mStackSupervisor.inResumeTopActivity) {
// Don't even start recursing.
return false;
}
boolean result = false;
try {
// Protect against recursion.
mStackSupervisor.inResumeTopActivity = true;
//启动launcher
result = resumeTopActivityInnerLocked(prev, options);
...
} finally {
mStackSupervisor.inResumeTopActivity = false;
}
return result;
}
6. resumeTopActivityInnerLocked继续跟踪
private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) {
if (!hasRunningActivity) {
// There are no activities left in the stack, let's look somewhere else.
return resumeTopActivityInNextFocusableStack(prev, options, "noMoreActivities");
}
}
7. resumeTopActivityInNextFocusableStack继续跟踪
private boolean resumeTopActivityInNextFocusableStack(ActivityRecord prev,
ActivityOptions options, String reason) {
//resumeHomeStackTask启动被Home标记栈内activity
return isOnHomeDisplay() && mStackSupervisor.resumeHomeStackTask(prev, reason);
}
8. resumeHomeStackTask继续跟踪frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java
boolean resumeHomeStackTask(ActivityRecord prev, String reason) {
if (!mService.mBooting && !mService.mBooted) {
// Not ready yet!
return false;
}
mHomeStack.moveHomeStackTaskToTop();
ActivityRecord r = getHomeActivity();
...
//这里准备启动launcher的Mainactivity
return mService.startHomeActivityLocked(mCurrentUser, myReason);
}
9. startHomeActivityLocked继续跟踪frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
boolean startHomeActivityLocked(int userId, String reason) {
// mTopAction的值为Intent.ACTION_MAIN
if (mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL && mTopAction == null) {
// We are running in factory test mode, but unable to find
// the factory test app, so just sit around displaying the
// error message and don't try to start anything.
return false;
}
Intent intent = getHomeIntent();
...
//判断符合Action为Intent.ACTION_MAIN,Category为Intent.CATEGORY_HOME的应用程序是否已经启动
if (app == null || app.instr == null) {
intent.setFlags(intent.getFlags() | FLAG_ACTIVITY_NEW_TASK);
final int resolvedUserId UserHandle.getUserId(aInfo.applicationInfo.uid);
// launched.
final String myReason = reason + ":" + userId + ":" + resolvedUserId;
// 这里启动launcher的Mainactivity
mActivityStartController.startHomeActivity(intent, aInfo, myReason);
}
...
}
// 创建Intent
Intent getHomeIntent() {
Intent intent = new Intent(mTopAction, mTopData != null ? Uri.parse(mTopData) : null);
intent.setComponent(mTopComponent);
intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);
if (mFactoryTest != FactoryTest.FACTORY_TEST_LOW_LEVEL) {
//Category设置为Intent.CATEGORY_HOME
intent.addCategory(Intent.CATEGORY_HOME);
}
return intent;
}
launcher启动完结`
流程图
Android系统启动完整流程图
-
启动电源以及系统启动
当电源按下时引导芯片代码开始从预定义的地方(固化在ROM)开始执行。加载引导程序Bootloader到RAM,然后执行。
-
引导程序BootLoader
引导程序BootLoader是在Android操作系统开始运行前的一个小程序,它的主要作用是把系统OS拉起来并运行。
-
Linux内核启动
内核启动时,设置缓存、被保护存储器、计划列表、加载驱动。当内核完成系统设置,它首先在系统文件中寻找init.rc文件,并启动init进程。
-
init进程启动
初始化和启动属性服务,并且启动Zygote进程。
-
Zygote进程启动
创建JavaVM并为JavaVM注册JNI,创建服务端Socket,启动SystemServer进程。
-
SystemServer进程启动
启动Binder线程池和SystemServiceManager,并且启动各种系统服务。
-
Launcher启动
被SystemServer进程启动的ActivityManagerService会启动Launcher,Launcher启动后会将已安装应用的快捷图标显示到界面上。
完