Android-SystemServer启动

参考资料:

https://cloud.tencent.com/developer/article/1199449

https://duanqz.github.io/2016-07-15-AMS-LaunchProcess

1、 SystemServer 启动

在Android系统开机启动的时候会调用SystemServer的main方法

 /**
     * The main entry point from zygote.
     */
    public static void main(String[] args) {
        new SystemServer().run();
    }

在run里面会设置系统语言,系统属性等,然后加载native的System Server。创建SystemServiceManager,并添加到LocalService中。最后加载启动服务,开启线程循环。

1.1 启动引导服务startBootstrapServices

1.2 启动核心服务

 2、 SystemServiceManager启动

2.1 类图

 2.2 SystemService--服务启动阶段

public abstract class SystemService {
    // 阶段 1: 等待显示设备准备完毕
    // 这个阶段,Installer, AMS, PowerManagerService, DisplayManagerService已经构建完毕
    public static final int PHASE_WAIT_FOR_DEFAULT_DISPLAY = 100;
    // 阶段 2: 锁屏服务已经准备完毕
    // 这个阶段,大部分系统服务已经构建完毕。其他服务可以获取锁屏相关的数据了,譬如锁屏密码等
    public static final int PHASE_LOCK_SETTINGS_READY = 480;
    // 阶段 3: 系统服务已经准备完毕
    // 这个阶段,大部分系统服务已经构建完毕,PackageManagerService,PowerManagerService已经能够提供服务
    public static final int PHASE_SYSTEM_SERVICES_READY = 500;
     // 阶段 4: ActivityManagerService已经能够提供服务了
     // 这个阶段,获取ContentProvider、发送广播等AMS相关的功能已经可以用了
    public static final int PHASE_ACTIVITY_MANAGER_READY = 550;
     // 阶段 5: 已经可以启动应用程序了
     // 这个阶段,用户界面已经启动,数据连接、音频等服务都已可用
    public static final int PHASE_THIRD_PARTY_APPS_CAN_START = 600;
    // 阶段 6: 系统起机完成
    public static final int PHASE_BOOT_COMPLETED = 1000;

    public abstract void onStart();
    public void onBootPhase(int phase) {}

    // ... 省略其他函数
}

部分系统服务的初始化依赖于当前系统已经启动到什么阶段,当系统服务启动时,onStart()函数会被调用; 系统启动到一定的阶段,onBootPhase()函数会被调用。所有系统服务的创建和生命周期的管理都是由SystemServiceManager这个类完成的

 2.3 startService(): 启动系统服务

  public SystemService startService(String className) {
        final Class<SystemService> serviceClass;
        try {
            serviceClass = (Class<SystemService>)Class.forName(className);
        } catch (ClassNotFoundException ex) {
            Slog.i(TAG, "Starting " + className);
       ......
        }
        return startService(serviceClass);
    }

      public <T extends SystemService> T startService(Class<T> serviceClass) {
        try {
            final String name = serviceClass.getName();
            Slog.i(TAG, "Starting " + name);
            Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartService " + name);

            // Create the service.
            if (!SystemService.class.isAssignableFrom(serviceClass)) {
                throw new RuntimeException("Failed to create " + name
                        + ": service must extend " + SystemService.class.getName());
            }
            final T service;
            try {
                Constructor<T> constructor = serviceClass.getConstructor(Context.class);
                service = constructor.newInstance(mContext);
          ......

            startService(service);
            return service;
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
        }
    }

    public void startService(@NonNull final SystemService service) {
        // Register it.
        mServices.add(service);
        // Start it.
        long time = SystemClock.elapsedRealtime();
        try {
            service.onStart();
        ....
    }

 

 

 

Android 12 SystemServer启动流程如下: 1. 引导加载:系统启动时,先加载引导程序,进行硬件初始化、内核加载等操作。 2. Zygote 进程启动:Zygote 是 Android 系统中的一个特殊进程,负责孵化其他应用进程。Zygote 进程会预加载一些常用的类和资源,以加快应用的启动速度。 3. SystemServer 进程启动:Zygote 进程会 fork 出 SystemServer 进程,该进程是 Android 系统中的核心服务进程。SystemServer 进程负责启动和管理系统级别的服务,例如 ActivityManagerService、PackageManagerService、WindowManagerService 等。 4. SystemServer 初始化:SystemServer 进程启动后,会进行一系列的初始化操作。首先会创建 Looper 线程,用于接收消息并处理各个服务的初始化工作。然后依次创建各个系统服务,并调用它们的启动方法。 5. 启动系统服务:SystemServer 进程会按照一定顺序启动各个系统服务。每个系统服务都有自己的初始化流程,例如 PackageManagerService 会加载应用程序列表、数据目录等;ActivityManagerService 会初始化进程间通信机制等。 6. 启动应用进程:在系统服务启动完成后,SystemServer 进程会通过 Zygote 孵化出其他应用进程。应用进程会根据 AndroidManifest.xml 中的配置进行初始化,包括创建 Application、加载资源等。 总结来说,Android 12 SystemServer启动流程包括引导加载、Zygote 进程启动、SystemServer 进程启动、SystemServer 初始化、启动系统服务和启动应用进程等步骤。这些步骤都是为了在系统启动时提供必要的服务和资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值