声明

  • 前阶段在项目中涉及到了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. Android(安卓)在init.rc启动一个c++程序
  2. Android(安卓)控件Edittext详解
  3. 图文详解Android(安卓)Studio搭建Android集成开发环境的过程
  4. Android之AIDL进程之间的通信
  5. Android(安卓)启动过程分析 (一)
  6. android Fragments详解一:概述
  7. Android清单文件详解(四) ---- backupAgent的用法
  8. Android安全模型之Android安全机制(进程通信)
  9. 转:Android内存管理机制

随机推荐

  1. Apple 再挑起戰火,控告 Samsung 15款 Andr
  2. Android撸一个转盘抽奖
  3. android 中隐藏EditText的下划线方法
  4. android:configChanges属性
  5. Android 线程超时的例子
  6. Tips: compilation and creating new pro
  7. Android应用在未启动的情况下无法收到指
  8. 一个现有Android工程作为组件加入到另一
  9. Android RadioGroup 设置默认值之后 Radi
  10. 微信ANDROID客户端-会话速度提升70%的背