首页 > 其他分享 >Android系统启动-SystemServer下篇-1

Android系统启动-SystemServer下篇-1

时间:2023-08-14 15:34:16浏览次数:34  
标签:... systemReady 服务 mSystemServiceManager 系统启动 java Android SystemServer

基于Android 6.0,在Android 12 上文件状态:

frameworks/base/services/java/com/android/server/
  - SystemServer.java

frameworks/base/services/core/java/com/android/server/
  - SystemServiceManager.java
  - ServiceThread.java
  - am/ActivityManagerService.java

frameworks/base/core/java/android/app/
  - ActivityThread.java
  - LoadedApk.java
  - ContextImpl.java

 

一、SystemServer启动

上篇文章《Android系统启动-systemServer上篇》从 Zygote 一路启动到 SystemServer 的过程。 简单回顾下,在 RuntimeInit.java 中 invokeStaticMain 方法通过创建并抛出异常 ZygoteInit.MethodAndArgsCaller,在 ZygoteInit.java 中的 main() 方法会捕捉该异常,并调用 caller.run(),再通过反射便会调用到 SystemServer.main() 方法,该方法主要执行流程:

SystemServer.main
    SystemServer.run
        createSystemContext
        startBootstrapServices();
        startCoreServices();
        startOtherServices();
        Looper.loop();

接下来,从其 main 方法说起。


1.1 SystemServer.main

public final class SystemServer {
    ...
    public static void main(String[] args) {
        //先初始化SystemServer对象,再调用对象的run()方法,【见小节1.2】
        new SystemServer().run();
    }
}

 

1.2 SystemServer.run

private void run() {
    //当系统时间比1970年更早,就设置当前系统时间为1970年
    if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) {
        SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);
    }

    //变更虚拟机的库文件,对于Android 6.0默认采用的是libart.so
    SystemProperties.set("persist.sys.dalvik.vm.lib.2", VMRuntime.getRuntime().vmLibrary());

    if (SamplingProfilerIntegration.isEnabled()) {
        ...
    }

    //清除vm内存增长上限,由于启动过程需要较多的虚拟机内存空间
    VMRuntime.getRuntime().clearGrowthLimit();

    //设置内存的可能有效使用率为0.8
    VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);
    // 针对部分设备依赖于运行时就产生指纹信息,因此需要在开机完成前已经定义
    Build.ensureFingerprintProperty();

    //访问环境变量前,需要明确地指定用户
    Environment.setUserRequired(true);

    //确保当前系统进程的binder调用,总是运行在前台优先级(foreground priority)
    BinderInternal.disableBackgroundScheduling(true);
    android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_FOREGROUND);
    android.os.Process.setCanSelfBackground(false);

    // 主线程looper就在当前线程运行
    Looper.prepareMainLooper();

    //加载android_servers.so库,该库包含的源码在frameworks/base/services/目录下
    System.loadLibrary("android_servers");

    //检测上次关机过程是否失败,该方法可能不会返回[见小节1.2.1]
    performPendingShutdown();

    //初始化系统上下文 【见小节1.3】
    createSystemContext();

    //创建系统服务管理
    mSystemServiceManager = new SystemServiceManager(mSystemContext);
    //将mSystemServiceManager添加到本地服务的成员sLocalServiceObjects
    LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);


    //启动各种系统服务
    try {
        startBootstrapServices(); // 启动引导服务【见小节1.4】
        startCoreServices();      // 启动核心服务【见小节1.5】
        startOtherServices();     // 启动其他服务【见小节1.6】
    } catch (Throwable ex) {
        Slog.e("System", "************ Failure starting system services", ex);
        throw ex;
    }

    //用于debug版本,将log事件不断循环地输出到dropbox(用于分析)
    if (StrictMode.conditionallyEnableDebugLogging()) {
        Slog.i(TAG, "Enabled StrictMode for system server main thread.");
    }
    //一直循环执行
    Looper.loop();
    throw new RuntimeException("Main thread loop unexpectedly exited");
}

LocalServices 通过用静态Map变量 sLocalServiceObjects,来保存以服务类名为key,以具体服务对象为value的Map结构。


1.2.1 performPendingShutdown

[–>SystemServer.java]

private void performPendingShutdown() {
    final String shutdownAction = SystemProperties.get(ShutdownThread.SHUTDOWN_ACTION_PROPERTY, "");
    if (shutdownAction != null && shutdownAction.length() > 0) {
        boolean reboot = (shutdownAction.charAt(0) == '1');

        final String reason;
        if (shutdownAction.length() > 1) {
            reason = shutdownAction.substring(1, shutdownAction.length());
        } else {
            reason = null;
        }
        // 当"sys.shutdown.requested"值不为空,则会重启或者关机
        ShutdownThread.rebootOrShutdown(null, reboot, reason);
    }
}

 

1.3 createSystemContext

[–>SystemServer.java]

private void createSystemContext() {
    //创建system_server进程的上下文信息
    ActivityThread activityThread = ActivityThread.systemMain();
    mSystemContext = activityThread.getSystemContext();
    //设置主题
    mSystemContext.setTheme(android.R.style.Theme_DeviceDefault_Light_DarkActionBar);
}

《理解Application创建过程》已介绍过 createSystemContext() 过程, 该过程会创建对象有 ActivityThread,Instrumentation, ContextImpl,LoadedApk,Application。


1.4 startBootstrapServices

[–>SystemServer.java]

private void startBootstrapServices() {
    //阻塞等待与installd建立socket通道
    Installer installer = mSystemServiceManager.startService(Installer.class);

    //启动服务ActivityManagerService
    mActivityManagerService = mSystemServiceManager.startService(ActivityManagerService.Lifecycle.class).getService();
    mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
    mActivityManagerService.setInstaller(installer);

    //启动服务PowerManagerService
    mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);

    //初始化power management
    mActivityManagerService.initPowerManagement();

    //启动服务LightsService
    mSystemServiceManager.startService(LightsService.class);

    //启动服务DisplayManagerService
    mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);

    //Phase100: 在初始化package manager之前,需要默认的显示.
    mSystemServiceManager.startBootPhase(SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);

    //当设备正在加密时,仅运行核心
    String cryptState = SystemProperties.get("vold.decrypt");
    if (ENCRYPTING_STATE.equals(cryptState)) {
        mOnlyCore = true;
    } else if (ENCRYPTED_STATE.equals(cryptState)) {
        mOnlyCore = true;
    }

    //启动服务PackageManagerService
    mPackageManagerService = PackageManagerService.main(mSystemContext, installer, 
        mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
    mFirstBoot = mPackageManagerService.isFirstBoot();
    mPackageManager = mSystemContext.getPackageManager();

    //启动服务UserManagerService,新建目录/data/user/
    ServiceManager.addService(Context.USER_SERVICE, UserManagerService.getInstance());

    AttributeCache.init(mSystemContext);

    //设置AMS
    mActivityManagerService.setSystemProcess();

    //启动传感器服务
    startSensorService();
}

该方法所创建的服务:ActivityManagerService, PowerManagerService, LightsService, DisplayManagerService, PackageManagerService, UserManagerService, sensor服务.


1.5 startCoreServices

private void startCoreServices() {
    //启动服务BatteryService,用于统计电池电量,需要LightService.
    mSystemServiceManager.startService(BatteryService.class);

    //启动服务UsageStatsService,用于统计应用使用情况
    mSystemServiceManager.startService(UsageStatsService.class);
    mActivityManagerService.setUsageStatsManager(LocalServices.getService(UsageStatsManagerInternal.class));

    mPackageManagerService.getUsageStatsIfNoPackageUsageInfo();

    //启动服务WebViewUpdateService
    mSystemServiceManager.startService(WebViewUpdateService.class);
}

启动服务 BatteryService,UsageStatsService,WebViewUpdateService。


1.6 startOtherServices

该方法比较长,有近千行代码,逻辑很简单,主要是启动一系列的服务,这里就不具体列举源码了,在第四节直接对其中的服务进行一个简单分类。

private void startOtherServices() {
    ...
    SystemConfig.getInstance();
    mContentResolver = context.getContentResolver(); //resolver
    ...
    mActivityManagerService.installSystemProviders(); //provider
    mSystemServiceManager.startService(AlarmManagerService.class); //alarm
    // watchdog
    watchdog.init(context, mActivityManagerService); 
    inputManager = new InputManagerService(context); // input
    wm = WindowManagerService.main(...); // window
    inputManager.start();  //启动input
    mDisplayManagerService.windowManagerAndInputReady();
    ...
    mSystemServiceManager.startService(MOUNT_SERVICE_CLASS); //mount
    mPackageManagerService.performBootDexOpt();  // dexopt操作
    ActivityManagerNative.getDefault().showBootMessage(...); //显示启动界面
    ...
    statusBar = new StatusBarManagerService(context, wm); //statusBar
    //dropbox
    ServiceManager.addService(Context.DROPBOX_SERVICE,
                new DropBoxManagerService(context, new File("/data/system/dropbox")));
     mSystemServiceManager.startService(JobSchedulerService.class); //JobScheduler
     lockSettings.systemReady(); //lockSettings

    //phase480 和phase500
    mSystemServiceManager.startBootPhase(SystemService.PHASE_LOCK_SETTINGS_READY);
    mSystemServiceManager.startBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY);
    ...
    // 准备好window, power, package, display服务
    wm.systemReady();
    mPowerManagerService.systemReady(...);
    mPackageManagerService.systemReady();
    mDisplayManagerService.systemReady(...);
    
    //重头戏[见小节2.1]
    mActivityManagerService.systemReady(new Runnable() {
        public void run() {
          ...
        }
    });
}

SystemServer启动各种服务中最后的一个环节便是AMS.systemReady(),详见《ActivityManagerService启动过程》.

到此, System_server 主线程的启动工作总算完成, 进入 Looper.loop() 状态,等待其他线程通过 handler 发送消息到主线再处理.


二、服务启动阶段

SystemServiceManager 的 startBootPhase() 贯穿 system_server 进程的整个启动过程:

其中 PHASE_BOOT_COMPLETED=1000,该阶段是发生在Boot完成和home应用启动完毕。系统服务更倾向于监听该阶段,而不是注册广播 ACTION_BOOT_COMPLETED,从而降低系统延迟。

各个启动阶段所在源码的大致位置:

public final class SystemServer {

    private void startBootstrapServices() {
      ...
      //phase100
      mSystemServiceManager.startBootPhase(SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);
      ...
    }

    private void startCoreServices() {
      ...
    }

    private void startOtherServices() {
      ...
      //phase480 && 500
      mSystemServiceManager.startBootPhase(SystemService.PHASE_LOCK_SETTINGS_READY);
      mSystemServiceManager.startBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY);
      
      ...
      mActivityManagerService.systemReady(new Runnable() {
         public void run() {
             //phase550
             mSystemServiceManager.startBootPhase(
                     SystemService.PHASE_ACTIVITY_MANAGER_READY);
             ...
             //phase600
             mSystemServiceManager.startBootPhase(
                     SystemService.PHASE_THIRD_PARTY_APPS_CAN_START);
          }
      }
    }
}

接下来再说说简单每个阶段的大概完成的工作:


2.1 Phase0

创建四大引导服务:

ActivityManagerService
PowerManagerService
LightsService
DisplayManagerService

 

2.2 Phase100

进入阶段 PHASE_WAIT_FOR_DEFAULT_DISPLAY=100 回调服务

onBootPhase(100)
    DisplayManagerService
//然后创建大量服务下面列举部分:
    PackageManagerService
    WindowManagerService
    InputManagerService
    NetworkManagerService
    DropBoxManagerService
    FingerprintService
    LauncherAppsService
    …

 

2.3 Phase480

进入阶段 PHASE_LOCK_SETTINGS_READY=480 回调服务

onBootPhase(480)
    DevicePolicyManagerService

阶段480后马上就进入阶段500.


2.4 Phase500

PHASE_SYSTEM_SERVICES_READY=500,进入该阶段服务能安全地调用核心系统服务.

onBootPhase(500)
    AlarmManagerService
    JobSchedulerService
    NotificationManagerService
    BackupManagerService
    UsageStatsService
    DeviceIdleController
    TrustManagerService
    UiModeManagerService

    BluetoothService
    BluetoothManagerService
    EthernetService
    WifiP2pService
    WifiScanningService
    WifiService
    RttService

各大服务执行 systemReady(): 

WindowManagerService.systemReady():
PowerManagerService.systemReady():
PackageManagerService.systemReady():
DisplayManagerService.systemReady():

接下来就绪 AMS.systemReady 方法.


2.5 Phase550

PHASE_ACTIVITY_MANAGER_READY=550, AMS.mSystemReady=true, 已准备就绪,进入该阶段服务能广播Intent;但是 system_server 主线程并没有就绪.

onBootPhase(550)
    MountService
    TelecomLoaderService
    UsbService
    WebViewUpdateService
    DockObserver
    BatteryService

接下来执行: (AMS启动native crash监控, 加载WebView,启动SystemUi等),如下:

mActivityManagerService.startObservingNativeCrashes();
WebViewFactory.prepareWebViewInSystemServer();
startSystemUi(context);

networkScoreF.systemReady();
networkManagementF.systemReady();
networkStatsF.systemReady();
networkPolicyF.systemReady();
connectivityF.systemReady();
audioServiceF.systemReady();
Watchdog.getInstance().start();

 

2.6 Phase600

PHASE_THIRD_PARTY_APPS_CAN_START=600

onBootPhase(600)
    JobSchedulerService
    NotificationManagerService
    BackupManagerService
    AppWidgetService
    GestureLauncherService
    DreamManagerService
    TrustManagerService
    VoiceInteractionManagerService

接下来,各种服务的 systemRunning() 过程:

WallpaperManagerService
InputMethodManagerService
LocationManagerService
CountryDetectorService
NetworkTimeUpdateService
CommonTimeManagementService
TextServicesManagerService
AssetAtlasService
InputManagerService
TelephonyRegistry
MediaRouterService
MmsServiceBroker

这些服务依次执行其 systemRunning()方法。


2.7 Phase1000

在经过一系列流程,再调用 AMS.finishBooting() 时,则进入阶段 Phase1000。

到此,系统服务启动阶段完成就绪,system_server 进程启动完成则进入 Looper.loop()状态,随时待命,等待消息队列 MessageQueue 中的消息到来,则马上进入执行状态。


三、服务类别

system_server 进程,从源码角度划分为引导服务、核心服务、其他服务3类。 以下这些系统服务的注册过程, 见《Android系统服务的注册方式》

引导服务(7个):ActivityManagerService、PowerManagerService、LightsService、DisplayManagerService、PackageManagerService、UserManagerService、SensorService;
核心服务(3个):BatteryService、UsageStatsService、WebViewUpdateService;
其他服务(70个+):AlarmManagerService、VibratorService等。合计总大约80个系统服务:

ActivityManagerService PackageManagerService WindowManagerService
PowerManagerService BatteryService BatteryStatsService
DreamManagerService DropBoxManagerService SamplingProfilerService
UsageStatsService DiskStatsService DeviceStorageMonitorService
SchedulingPolicyService AlarmManagerService DeviceIdleController
ThermalObserver JobSchedulerService AccessibilityManagerService
DisplayManagerService LightsService GraphicsStatsService
StatusBarManagerService NotificationManagerService WallpaperManagerService
UiModeManagerService AppWidgetService LauncherAppsService
TextServicesManagerService ContentService LockSettingsService
InputMethodManagerService InputManagerService MountService
FingerprintService TvInputManagerService DockObserver
NetworkManagementService NetworkScoreService NetworkStatsService
NetworkPolicyManagerService ConnectivityService BluetoothService
WifiP2pService WifiService WifiScanningService
AudioService MediaRouterService VoiceInteractionManagerService
MediaProjectionManagerService MediaSessionService  
DevicePolicyManagerService PrintManagerService BackupManagerService
UserManagerService AccountManagerService TrustManagerService
SensorService LocationManagerService VibratorService
CountryDetectorService GestureLauncherService PersistentDataBlockService
EthernetService WebViewUpdateService ClipboardService
TelephonyRegistry TelecomLoaderService NsdService
UpdateLockService SerialService SearchManagerService
CommonTimeManagementService AssetAtlasService ConsumerIrService
MidiServiceCameraService TwilightService RestrictionsManagerService
MmsServiceBroker RttService UsbService

 

四、补充

1. SystemServer中通过判断 Build.IS_DEBUGGABLE 来判断是否是debug版本。

2. 特征函数调用位置

onStart() --> publishBinderServices() //SensorService.java
onBootPhase(int phase) //SensorService.java 服务内只在指定启动阶段进行响应
startOtherServices() --> wm.systemReady() //SystemServer.java

3. 这个属性指示使用哪个库

/ # getprop | grep persist.sys.dalvik.vm.lib.2
[persist.sys.dalvik.vm.lib.2]: [libart.so]

 

标签:...,systemReady,服务,mSystemServiceManager,系统启动,java,Android,SystemServer
From: https://www.cnblogs.com/hellokitty2/p/17628777.html

相关文章

  • Android 5.0(Lollipop)中的SurfaceTexture,TextureView, SurfaceView和GLSurfaceView
    https://blog.csdn.net/jinzhuojun/article/details/44062175SurfaceView,GLSurfaceView,SurfaceTexture以及TextureView是Android当中名字比较绕,关系又比较密切的几个类。本文基于Android5.0(Lollipop)的代码理一下它们的基本原理,联系与区别。SurfaceView从Android1.0(API......
  • Android 编译速度提升黑科技 - RocketX
    怎么做编译优化,当时说了个方案,就是编译时将所有的模块依赖修改为aar,然后每次编译将变动的模块改成源码依赖,同时编译完成再将修改模块上传为aar,这样可以始终做到仅有最少的模块参与源码编译,从而提升编译速度。当然说起来轻松,做起来没有那么容易,终于有位小伙伴将上述描述开发成一个......
  • 对 Android 应用换肤方案的总结
    虽然现在已经有很多不错的换肤方案,但是这些方案或多或少都存在自己的问题。在这篇文章中,我将对Android现有的一些动态换肤方案进行梳理,对其底层实现原理进行分析,然后对开发一个新的换肤方案的可能性进行总结。1、通过自定义style换肤1.1方案的基本原理这种方案是我之前用得比......
  • 这是一份详细&清晰的 上传Android Library到JCenter 教程:如何使得自己的代码被别人优
    前言在日常Android开发中,我们经常会通过远程引用别人的代码(AndroidLibrary)来实现一些功能,如引用网络请求库Okhttp//通过在AndroidStudio的build.gradle文件中添加依赖dependencies{compile'com.squareup.okhttp:okhttp:2.4.0'}那么,该如何使得自己的代码(AndroidLibrary......
  • 跨平台xamarin.Android 开发之 :适配各架构(X86_64 、 X86、arm64-v8a、 armeabi-v7a )
    此代码的编写花费了脑细胞:在每次编码开启编码器到只需要一次编码器的开启优化前提:编译好FFMpeg的各平台的动态库基本上Android X86_64、X86、arm64-v8a、armeabi-v7a采用FFmpeg编码的方式基本一直。差异是内存分配和取指有所不同,如果分配不对,直接闪退。先看看通用的编码......
  • 跨平台xamarin.Android 开发之 :适配各架构(X86_64 、 X86、arm64-v8a、 armeabi-v7a )
    此代码的编写花费了脑细胞:在每次解码开启解码器到只需要一次解码器的开启优化前提:编译好FFMpeg的各平台的动态库Windows、Android(X86_64、X86、arm64-v8a、armeabi-v7a)解码相对编码要简单一些,因为不涉及到AVFrame取指转换解码包括:创建解码器、解码、释放解码器us......
  • 跨平台xamarin.Android 开发之 :适配各架构(X86_64 、 X86、arm64-v8a、 armeabi-v7a
    从事Windows,项目探索预研跨平台开发,对Android只知道有X86_64、X86、arm64-v8a、  armeabi-v7a这么个东西其他空白。编译入手采用Xamarin.Android开发。通过摸索。在Xamarin.Android中使用FFmpeg编解码,需要获取源码编译成对应Android架构的so动态库,如何编译不在此处讨论,稍......
  • Android平台RTMP推送或GB28181设备接入端如何实现采集audio音量放大?
    我们在做Android平台RTMP推送和GB28181设备对接的时候,遇到这样的问题,有的设备,麦克风采集出来的audio,音量过高或过低,特别是有些设备,采集到的麦克风声音过低,导致播放端听不清前端采集的audio,这时候,就需要针对采集到的audio,做音量放大处理。先说如何采集,android平台通用的做法是采集au......
  • IDEA/Android Studio的gradle控制台输出中文乱码问题解决
    原文地址:IDEA/AndroidStudio的gradle控制台输出中文乱码问题解决-Stars-One的杂货小窝在项目中,有使用到Gradle自定义脚本,会有些输出日志,但是输出中文就变成乱码了..本篇就介绍下解决方法乱码效果如下图所示步骤我是window系统,不知道其他系统会不会出现这个问题乱......
  • Android Studio Giraffe安装与gradle配置
    本机环境:win10专业版,64位,16G内存。原先用的AS2.2,是很早之前在看《第一行代码Android(第2版)》的时候,按书里的链接下载安装的,也不用怎么配置。(PS:第一行代码这本书对新手确实很适合,第1版是eclise,第2版是Androidstudio)最近想给AS升级一下,果不其然碰到很多问题。......