声明

  • 前阶段在项目中涉及到了Android系统定制任务,Android系统定制前提要知道Android系统是如何启动的。
  • 本文参考了一些书籍的若干章节,比如《Android进阶解密-第2章-Android系统启动》、《深入理解Android虚拟机-第8/9/10章-init进程详解/Dalvik VM的进程系统/Dalvik VM运作流程详解》、《深入理解Android系统-第6/7/8章-init启动进程详解/Zygote进程详解/System进程详解》等。
  • 本文使用的代码是LineageOS的cm-14.1,对应Android 7.1.2,可以参考我的另一篇博客:如何下载Nexus5的LineageOS14.1(cm-14.1)系统源码并编译、刷机。
  • 很多代码注释待详细写

0 写在前面的

    等本章结束,Android系统的启动基本就结束了,因为对于用户来说可以看到显示屏上的Launcher界面就代表系统已经启动完成了。Launcher在启动过程中会请求 PackageManagerService 返回系统中已经安装的应用程序的信息,并将这些信息封装成一个快捷图标列表显示在系统屏幕上,这样用户可以通过点击这些快捷图标来启动相应的应用程序。

    Launcher 就是 Android 系统的桌面,它的作用主要有以下两点:

  1. 用于启动应用程序。
  2. 用于显示和管理应用程序的快捷图标或者其他桌面组件。

0 Launcher启动过程

    SystemServer 进程在启动的过程中会启动PackageManagerService, PackageManagerService 启动后会将系统中的预置的应用程序安装(其中就包含Launcher应用),然后系统服务 AMS 会将 Launcher 启动起来。

...... SystemServer AMS ActivityStackSupervisor ActivityStack startOtherServices systemReady resumeFocusedStack resumeTopActivity... resumeTopActivityInnerLocked resumeHomeStackTask startHomeActivityLocked ...... SystemServer AMS ActivityStackSupervisor ActivityStack

    启动Launcher的入口为AMS的systemReady方法,它在SystemServer的startOtherServices 方告中被调用。其在源码目录:~/LineageOS/frameworks/base/services/java/com/android/server/SystemServer.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 (but before it has actually        // started launching the initial applications), for us to complete our        // initialization.        mActivityManagerService.systemReady(new Runnable() {            @Override            public void run() {                Slog.i(TAG, "Making services ready");                mSystemServiceManager.startBootPhase(                        SystemService.PHASE_ACTIVITY_MANAGER_READY);                Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "PhaseActivityManagerReady");                Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartObservingNativeCrashes");                try {                    mActivityManagerService.startObservingNativeCrashes();                } catch (Throwable e) {                    reportWtf("observing native crashes", e);                }                Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);                if (!mOnlyCore) {                    Slog.i(TAG, "WebViewFactory preparation");                    Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "WebViewFactoryPreparation");                    mWebViewUpdateService.prepareWebViewInSystemServer();                    Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);                }                                Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartSystemUI");                try {                    startSystemUi(context);                } catch (Throwable e) {                    reportWtf("starting System UI", e);                }                Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);                Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "MakeNetworkScoreReady");                try {                    if (networkScoreF != null) networkScoreF.systemReady();                } catch (Throwable e) {                    reportWtf("making Network Score Service ready", e);                }                Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);                Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "MakeNetworkManagementServiceReady");                try {                    if (networkManagementF != null) networkManagementF.systemReady();                  } catch (Throwable e) {                    reportWtf("making Network Managment Service ready", e);                }                Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);                Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "MakeNetworkStatsServiceReady");                try {                    if (networkStatsF != null) networkStatsF.systemReady();                } catch (Throwable e) {                    reportWtf("making Network Stats Service ready", e);                }                Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);                Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "MakeNetworkPolicyServiceReady");                try {                    if (networkPolicyF != null) networkPolicyF.systemReady();                } catch (Throwable e) {                    reportWtf("making Network Policy Service ready", e);                }                Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);                Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "MakeConnectivityServiceReady");                try {                    if (connectivityF != null) connectivityF.systemReady();                } catch (Throwable e) {                    reportWtf("making Connectivity Service ready", e);                }                Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);                Watchdog.getInstance().start();                // It is now okay to let the various system services start their                // third party code...                Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);                Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "PhaseThirdPartyAppsCanStart");                mSystemServiceManager.startBootPhase(                        SystemService.PHASE_THIRD_PARTY_APPS_CAN_START);                try {                    if (locationF != null) locationF.systemRunning();                } catch (Throwable e) {                    reportWtf("Notifying Location Service running", e);                }                try {                    if (countryDetectorF != null) countryDetectorF.systemRunning();                } catch (Throwable e) {                    reportWtf("Notifying CountryDetectorService running", e);                }                try {                    if (networkTimeUpdaterF != null) networkTimeUpdaterF.systemRunning();                } catch (Throwable e) {                    reportWtf("Notifying NetworkTimeService running", e);                }                try {                    if (commonTimeMgmtServiceF != null) {                        commonTimeMgmtServiceF.systemRunning();                    }                } catch (Throwable e) {                    reportWtf("Notifying CommonTimeManagementService running", e);                }                try {                    if (atlasF != null) atlasF.systemRunning();                } catch (Throwable e) {                    reportWtf("Notifying AssetAtlasService running", e);                }                try {                    // TODO(BT) Pass parameter to input manager                    if (inputManagerF != null) inputManagerF.systemRunning();                } catch (Throwable e) {                    reportWtf("Notifying InputManagerService running", e);                }                try {                    if (telephonyRegistryF != null) telephonyRegistryF.systemRunning();                } catch (Throwable e) {                    reportWtf("Notifying TelephonyRegistry running", e);                }                try {                    if (mediaRouterF != null) mediaRouterF.systemRunning();                } catch (Throwable e) {                    reportWtf("Notifying MediaRouterService running", e);                }                try {                    if (mmsServiceF != null) mmsServiceF.systemRunning();                } catch (Throwable e) {                    reportWtf("Notifying MmsService running", e);                }                try {                    if (networkScoreF != null) networkScoreF.systemRunning();                } catch (Throwable e) {                    reportWtf("Notifying NetworkScoreService running", e);                }                Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);            }        });    }

下面来查看 AMS systernReady 方法做了什么:

更多相关文章

  1. Android5.1系统通过包名给应用开放系统权限的方法
  2. Gartner:Android将在2012年成为第二大手机系统
  3. Android清单文件详解(四) ---- backupAgent的用法
  4. 浅析android系统设计中的回调思想
  5. android Fragments详解一:概述
  6. Android之AIDL进程之间的通信

随机推荐

  1. Android 源码(收集)
  2. Android如何拍照或选择图片并裁剪
  3. 如何解决:Android中 Error generating fin
  4. Android Kotlin开发语言学习笔记
  5. Android开发应用汇总
  6. Android(安卓)自己动手写ListView学习其
  7. android页面用jquery窗口大小获取错误问
  8. Android Paging - PagedListAdapter
  9. androd 事件分发机制的初步理解
  10. 在Android 2.3中如何使用native_activity