2024年3月13日发(作者:翦艳卉)
Android系统启动流程(四)Launcher
启动过程与系统启动流程
前言
此前的文章我们学习了init进程、Zygote进程和SyetemServer进程的启动过程,这一篇文章
我们就来学习Android系统启动流程的最后一步:Launcher的启动流程,并结合本系列的前
三篇文章的内容来讲解Android系统启动流程。建议读这篇文章前要通读本系列的前三篇文
章,否则你可能不会理解我在讲什么。
er概述
Android系统启动的最后一步是启动一个Home应用程序,这个应用程序用来显示系统中已
经安装的应用程序,这个Home应用程序就叫做Launcher。应用程序Launcher在启动过程
中会请求PackageManagerService返回系统中已经安装的应用程序的信息,并将这些信息封
装成一个快捷图标列表显示在系统屏幕上,这样用户可以通过点击这些快捷图标来启动相应
的应用程序。
er启动流程
SyetemServer进程在启动的过程中会启动PackageManagerService,PackageManagerService
启动后会将系统中的应用程序安装完成。在此前已经启动的ActivityManagerService会将
Launcher启动起来。
启动Launcher的入口为ActivityManagerService的systemReady函数,如下所示。
frameworks/base/services/Java/com/android/server/
private void startOtherServices() {
...
Ready(new Runnable() {
@Override
public void run() {
Slog.i(TAG, "Making services ready");
ootPhase(
_ACTIVITY_MANAGER_READY);
...
}
...
}
在startOtherServices函数中,会调用ActivityManagerService的systemReady函数:
frameworks/base/services/core/java/com/android/server/am/
public void systemReady(final Runnable goingCallback) {
...
synchronized (this) {
...
FocusedStackTopActivityLocked();
erSwitchBroadcastsLocked(-1, currentUserId);
}
}
systemReady函数中调用了ActivityStackSupervisor的resumeFocusedStackTopActivityLocked
函数:
frameworks/base/services/core/java/com/android/server/am/
boolean resumeFocusedStackTopActivityLocked(
ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) {
if (targetStack != null && isFocusedStack(targetStack)) {
return TopActivityUncheckedLocked(target, targetOptions);//1
}
final ActivityRecord r = ningActivityLocked();
if (r == null || != RESUMED) {
TopActivityUncheckedLocked(null, null);
}
return false;
}
在注释1处会调用ActivityStack的resumeTopActivityUncheckedLocked函数,ActivityStack
对象是用来描述Activity堆栈的,resumeTopActivityUncheckedLocked函数如下所示。
frameworks/base/services/core/java/com/android/server/am/
boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) {
if (meTopActivity) {
// Don't even start recursing.
return false;
}
boolean result = false;
try {
// Protect against recursion.
meTopActivity = true;
if (creenShown ==
_SCREEN_LEAVING) {
creenShown =
_SCREEN_HIDDEN;
SleepIfNeededLocked();
}
2024年3月13日发(作者:翦艳卉)
Android系统启动流程(四)Launcher
启动过程与系统启动流程
前言
此前的文章我们学习了init进程、Zygote进程和SyetemServer进程的启动过程,这一篇文章
我们就来学习Android系统启动流程的最后一步:Launcher的启动流程,并结合本系列的前
三篇文章的内容来讲解Android系统启动流程。建议读这篇文章前要通读本系列的前三篇文
章,否则你可能不会理解我在讲什么。
er概述
Android系统启动的最后一步是启动一个Home应用程序,这个应用程序用来显示系统中已
经安装的应用程序,这个Home应用程序就叫做Launcher。应用程序Launcher在启动过程
中会请求PackageManagerService返回系统中已经安装的应用程序的信息,并将这些信息封
装成一个快捷图标列表显示在系统屏幕上,这样用户可以通过点击这些快捷图标来启动相应
的应用程序。
er启动流程
SyetemServer进程在启动的过程中会启动PackageManagerService,PackageManagerService
启动后会将系统中的应用程序安装完成。在此前已经启动的ActivityManagerService会将
Launcher启动起来。
启动Launcher的入口为ActivityManagerService的systemReady函数,如下所示。
frameworks/base/services/Java/com/android/server/
private void startOtherServices() {
...
Ready(new Runnable() {
@Override
public void run() {
Slog.i(TAG, "Making services ready");
ootPhase(
_ACTIVITY_MANAGER_READY);
...
}
...
}
在startOtherServices函数中,会调用ActivityManagerService的systemReady函数:
frameworks/base/services/core/java/com/android/server/am/
public void systemReady(final Runnable goingCallback) {
...
synchronized (this) {
...
FocusedStackTopActivityLocked();
erSwitchBroadcastsLocked(-1, currentUserId);
}
}
systemReady函数中调用了ActivityStackSupervisor的resumeFocusedStackTopActivityLocked
函数:
frameworks/base/services/core/java/com/android/server/am/
boolean resumeFocusedStackTopActivityLocked(
ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) {
if (targetStack != null && isFocusedStack(targetStack)) {
return TopActivityUncheckedLocked(target, targetOptions);//1
}
final ActivityRecord r = ningActivityLocked();
if (r == null || != RESUMED) {
TopActivityUncheckedLocked(null, null);
}
return false;
}
在注释1处会调用ActivityStack的resumeTopActivityUncheckedLocked函数,ActivityStack
对象是用来描述Activity堆栈的,resumeTopActivityUncheckedLocked函数如下所示。
frameworks/base/services/core/java/com/android/server/am/
boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) {
if (meTopActivity) {
// Don't even start recursing.
return false;
}
boolean result = false;
try {
// Protect against recursion.
meTopActivity = true;
if (creenShown ==
_SCREEN_LEAVING) {
creenShown =
_SCREEN_HIDDEN;
SleepIfNeededLocked();
}