Android Framework学习启动流程(四)-Launcher

394 阅读3分钟

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启动完结`

流程图

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启动后会将已安装应用的快捷图标显示到界面上。


    ​ 完