当前位置: 首页 > news >正文

沈阳网站建设那家好广告主资源哪里找

沈阳网站建设那家好,广告主资源哪里找,淘宝客怎么在网站做推广,沛县可以做网站的单位本文基于 Android 14.0.0_r2 的系统启动流程分析。 SystemServer 进程主要用于创建系统服务,我们熟知的 AMS、WMS 和 PMS 都是由它来创建的,因此掌握 SystemServer 进程是如何启动的,它在启动时做了哪些工作是十分必要的。 一、源码解析 Zyg…

本文基于 Android 14.0.0_r2 的系统启动流程分析。

SystemServer 进程主要用于创建系统服务,我们熟知的 AMS、WMS 和 PMS 都是由它来创建的,因此掌握 SystemServer 进程是如何启动的,它在启动时做了哪些工作是十分必要的。

一、源码解析

  1. ZygoteInit 的 handleSystemServerProcess 下面的子方法去调用了 com.android.server.SystemServermain 方法,至此 SystemServer 就创建和启动完毕了:

    路径:/frameworks/base/core/java/com/android/internal/os/ZygoteInit.javapublic static void main(String[] argv) {...Runnable caller;try {...if (startSystemServer) {Runnable r = forkSystemServer(abiList, zygoteSocketName, zygoteServer);...}...}...
    }
    
    路径:/frameworks/base/core/java/com/android/internal/os/ZygoteInit.javaprivate static Runnable forkSystemServer(String abiList, String socketName,ZygoteServer zygoteServer) {...if (pid == 0) {...return handleSystemServerProcess(parsedArgs);}...
    }
    
    路径:/frameworks/base/core/java/com/android/internal/os/ZygoteInit.javaprivate static Runnable handleSystemServerProcess(ZygoteArguments parsedArgs) {...if (parsedArgs.mInvokeWith != null) {...} else {...return ZygoteInit.zygoteInit(parsedArgs.mTargetSdkVersion,parsedArgs.mDisabledCompatChanges,parsedArgs.mRemainingArgs, cl);}
    }
    
    路径:/frameworks/base/core/java/com/android/internal/os/ZygoteInit.javapublic static Runnable zygoteInit(int targetSdkVersion, long[] disabledCompatChanges,String[] argv, ClassLoader classLoader) {...return RuntimeInit.applicationInit(targetSdkVersion, disabledCompatChanges, argv,classLoader);
    }
    
    路径:/frameworks/base/core/java/com/android/internal/os/RuntimeInit.javaprotected static Runnable applicationInit(int targetSdkVersion, long[] disabledCompatChanges,String[] argv, ClassLoader classLoader) {...return findStaticMain(args.startClass, args.startArgs, classLoader);
    }
    
    路径:/frameworks/base/core/java/com/android/internal/os/RuntimeInit.javaprotected static Runnable findStaticMain(String className, String[] argv,ClassLoader classLoader) {Class<?> cl;try {// 反射拿到 SystemServer 类cl = Class.forName(className, true, classLoader);} catch (ClassNotFoundException ex) {...}Method m;try {// 反射拿到 SystemServer.java 的 main 函数,并启动。m = cl.getMethod("main", new Class[] { String[].class });} catch (NoSuchMethodException ex) {...} catch (SecurityException ex) {...}...return new MethodAndArgsCaller(m, argv);
    }
    
  2. SystemServer.run

    路径:/frameworks/base/services/java/com/android/server/SystemServer.javapublic static void main(String[] args) {new SystemServer().run();
    }
    
    路径:/frameworks/base/services/java/com/android/server/SystemServer.javaprivate void run() {...try {...// 设置系统语言、国家、时区相关。if (!SystemProperties.get("persist.sys.language").isEmpty()) {final String languageTag = Locale.getDefault().toLanguageTag();SystemProperties.set("persist.sys.locale", languageTag);SystemProperties.set("persist.sys.language", "");SystemProperties.set("persist.sys.country", "");SystemProperties.set("persist.sys.localevar", "");}...// 设置 main 线程的优先级,有此可得主线程就是 SystemServer 进程下的其中线程。android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_FOREGROUND);android.os.Process.setCanSelfBackground(false);// 开始主线程的运行,和 Looper.loop 配对使用。// 运行在 Looper.prepareMainLooper() ~ Looper.loop(),之间的就是运行在主线程中。Looper.prepareMainLooper();Looper.getMainLooper().setSlowLogThresholdMs(SLOW_DISPATCH_THRESHOLD_MS, SLOW_DELIVERY_THRESHOLD_MS);...// 初始化 native services,加载 android_servers 库(libandroid_servers.so)。System.loadLibrary("android_servers");...// 通过 ActivityThread 来创建 system 上下文。createSystemContext();// 初始化 ActivityThread,创建 TelephonyServiceManager、StatsServiceManager、MediaServiceManager。ActivityThread.initializeMainlineModules();// 将 SystemServer 加入 ServiceManager(binder 线程池)。// 每个继承自 SystemServer 或属于 SystemServer 进程的服务都将加入到 ServiceManager 中的线程池中。ServiceManager.addService("system_server_dumper", mDumper);mDumper.addDumpable(this);// 每个 server 基本上对应了一个 manager,对外提供的 API 也是只能获取到 manager。// 创建 SystemServiceManager,它会对系统的服务进行创建、启动和生命周期管理,启动系统的各种服务。mSystemServiceManager = new SystemServiceManager(mSystemContext);mSystemServiceManager.setStartInfo(mRuntimeRestart,mRuntimeStartElapsedTime, mRuntimeStartUptime);mDumper.addDumpable(mSystemServiceManager);// LocalServices 是 system_server 进程中各个服务提供的本地服务。// system_server 进程中每个服务都可以往 LocalServices 放对象。// 有些核心服务是继承自 SystemServer,LocalServices 是公开缓存池目的是解耦。LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);...}...// 启动 Services。try {t.traceBegin("StartServices");// 启动系统启动所需的一系列关键服务:AMS,P(power/package)MS,SensorService,DisplayManagerService,LightService 等。startBootstrapServices(t);// 启动核心服务:BatteryService,GpuService 等。startCoreServices(t);// 启动其他服务:VibratorManagerService,闹钟服务,相机服务,网络服务,输入法服务,存储服务等。startOtherServices(t);// 以上的所有服务都由 mSystemServiceManager 来启动,所以都是继承自 SystemServer。// 分别是引导服务、核心服务和其他服务// [引导服务]// Installer                   系统安装 apk 时的一个服务类,启动完成 Installer 服务之后才能启动其他的系统服务。// ActivityManagerService      负责四大组件的启动、切换、调度。// PowerManagerService         计算系统中和Power相关的计算,然后决策系统应该如何反应。// LightsService               管理和显示背光LED。// DisplayManagerService       用来管理所有显示设备。// UserManagerService          多用户模式管理。// SensorService               为系统提供各种感应器服务。// PackageManagerService       用来对 apk 进行安装、解析、删除、卸载等等操作。// [核心服务]// BatteryService              管理电池相关的服务。// UsageStatsService           收集用户使用每一个 APP 的频率、使用时常。// WebViewUpdateService        WebView 更新服务。// [其他服务]// CameraService               摄像头相关服务。// AlarmManagerService         全局定时器管理服务。// InputManagerService         管理输入事件。// WindowManagerService        窗口管理服务。// VrManagerService            VR模式管理服务。// BluetoothService            蓝牙管理服务。// NotificationManagerService  通知管理服务。// DeviceStorageMonitorService 存储相关管理服务。// LocationManagerService      定位管理服务。// AudioService                音频相关管理服务。...}...// 主线程Looper.loop();// 若执行到这里说明主线程意外退出了。// 主线程:Looper.prepareMainlooper ~ Looper.loop 之间。throw new RuntimeException("Main thread loop unexpectedly exited");
    }
    

    以上方法可以看出来关于其他服务的启动都是运行在主线程中的 Looper.prepareMainlooper ~ Looper.loop 之间,每个 SystemServer 中的服务都有一个 binder,会加入到 ServiceManager 的 binder 线程池中统一管理,这样拿到全局的 ServiceManager,根据 AIDL 获取到每个 Service 了。

    • startBootstrapServices(t)

      启动系统启动所需的一系列关键服务:AMS,P(power/package)MS,SensorService,DisplayManagerService,LightService 等。

    • startCoreServices(t)

      启动核心服务:BatteryService,GpuService 等。

    • startOtherServices(t)

      启动其他服务:VibratorManagerService,闹钟服务,相机服务,网络服务,输入法服务,存储服务等。

    在这些启动的服务里(调用了 onStart 启动服务),都会将服务存入 ServiceManager 用来管理系统中的各种 Service,用于系统 C/S 架构中的 Binder 机制通信:Client 端要使用某个 Service,则需要先到 ServiceManager 查询 Service 的相关信息,然后根据 Service 的相关信息与 Service 所在的 Server 进程建立通讯通路,这样 Client 端就可以使用 Service 了。

  3. 各类系统服务的作用

    引导服务(startBootstrapServices)作用
    ActivityManagerService负责四大组件的启动、切换、调度
    PowerManagerService计算系统中和 Power 相关的计算,然后决策系统应该如何反应
    Installer系统安装 apk 时的一个服务类,启动完成 Installer 服务之后才能启动其他的系统服务
    LightsService管理和显示背光 LED
    DisplayManagerService用来管理所有显示设备
    PackageManagerService用来对 apk 进行安装、解析、删除、卸载等等操作
    SensorService为系统提供各种感应器服务
    核心服务(startCoreServices)作用
    BatteryService管理电池相关的服务
    GpuService硬件显示服务
    WebViewUpdateServiceWebView 更新服务
    其他服务(startOtherServices)作用
    CameraService摄像头相关服务
    AlarmManagerService全局定时器管理服务
    InputManagerService管理输入事件
    WindowManagerService窗口管理服务
    BluetoothService蓝牙管理服务
    PackageManagerService用来对 apk 进行安装、解析、删除、卸载等等操作
    SensorService为系统提供各种感应器服务
    LocationManagerService定位管理服务
  4. SystemServer.startBootstrapServices

    路径:/frameworks/base/services/java/com/android/server/SystemServer.javaprivate void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {...// 尽早启动看门狗,以便在早期启动过程中出现死锁时使系统服务器崩溃。t.traceBegin("StartWatchdog");// 启动看门狗,看门狗需要定时喂狗,若喂狗超时则会触发重启,以便知道进程和服务是否正常运行。final Watchdog watchdog = Watchdog.getInstance();watchdog.start();mDumper.addDumpable(watchdog);t.traceEnd();...t.traceBegin("StartInstaller");// 通过 mSystemServiceManager 来启动 Installer 服务,管理应用的安装与卸载。Installer installer = mSystemServiceManager.startService(Installer.class);t.traceEnd();...// 通过 mSystemServiceManager 来启动 UriGrantsManagerService,管理 Uri。t.traceBegin("UriGrantsManagerService");mSystemServiceManager.startService(UriGrantsManagerService.Lifecycle.class);t.traceEnd();// 通过 mSystemServiceManager 来启动 PowerStatsService,管理电源状态。t.traceBegin("StartPowerStatsService");mSystemServiceManager.startService(PowerStatsService.class);t.traceEnd();...t.traceBegin("StartActivityManager");// 通过 mSystemServiceManager 来启动 ActivityTaskManagerService,管理 Activity 任务栈。ActivityTaskManagerService atm = mSystemServiceManager.startService(ActivityTaskManagerService.Lifecycle.class).getService();// 启动 ActivityManagerService,管理 Activity 等。mActivityManagerService = ActivityManagerService.Lifecycle.startService(mSystemServiceManager, atm);// 让 ActivityManagerService 拿到 systemServer,例如可以通过 mSystemServiceManager 来判断系统是否启动完成。mActivityManagerService.setSystemServiceManager(mSystemServiceManager);mActivityManagerService.setInstaller(installer);mWindowManagerGlobalLock = atm.getGlobalLock();t.traceEnd();...// 启用 PowerManagerService 服务,电源管理服务。t.traceBegin("StartPowerManager");mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);t.traceEnd();...// 启动屏幕亮度服务,比如亮度调整。t.traceBegin("StartLightsService");mSystemServiceManager.startService(LightsService.class);t.traceEnd();...// 启动屏幕显示服务。t.traceBegin("StartDisplayManager");mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);t.traceEnd();...try {...// 启动 PMS,包管理服务。mPackageManagerService = PackageManagerService.main(mSystemContext, installer, domainVerificationService,mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF);} finally {Watchdog.getInstance().resumeWatchingCurrentThread("packagemanagermain");}...// 启动传感器服务。t.traceBegin("StartSensorService");mSystemServiceManager.startService(SensorService.class);t.traceEnd();t.traceEnd();
    }
    

    可以看到大多数服务都是通过 mSystemServiceManager.startService 来启动,接下来看看 startService 方法内容。

  5. SystemServiceManager.startService

    路径:/frameworks/base/services/core/java/com/android/server/SystemServiceManager.javapublic <T extends SystemService> T startService(Class<T> serviceClass) {try {final String name = serviceClass.getName();...final T service;try {// 反射拿到该 Java 类Constructor<T> constructor = serviceClass.getConstructor(Context.class);service = constructor.newInstance(mContext);}...// 将当前服务(Java类)加入 SystemService 服务队列中,统一管理。startService(service);return service;} finally {Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);}
    }
    
    路径:/frameworks/base/services/core/java/com/android/server/SystemServiceManager.javapublic void startService(@NonNull final SystemService service) {...// 将当前服务加入 mServices 队列中。mServices.add(service);long time = SystemClock.elapsedRealtime();try {// 调用当前服务的 onStart 来启动服务。service.onStart();} catch (RuntimeException ex) {...}warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onStart");
    }
    

    可以看到 startService 方法就是反射拿到服务类,然后加入队列中,调用其 onStart 方法进行启动。

  6. ServiceManager 服务管理

    每个属于 SystemServer 的服务都将加入到 ServiceManager 的 binder 线程池中,以供后续直接获取和管理。就拿 BatteryService 服务来讲解:

    路径:/frameworks/base/services/java/com/android/server/SystemServer.javamSystemServiceManager.startService(BatteryService.class);
    

    已知 startService 后会调用 BatteryService 服务的 onStart 方法,继续看看 onStart 内部:

    路径:/frameworks/base/services/core/java/com/android/server/BatteryService.java@Override
    public void onStart() {...mBinderService = new BinderService();// 将 BinderService 服务加入 ServiceManager 中。publishBinderService("battery", mBinderService);mBatteryPropertiesRegistrar = new BatteryPropertiesRegistrar();// 将 batteryproperties 服务加入 ServiceManager 中。publishBinderService("batteryproperties", mBatteryPropertiesRegistrar);// 将 BinderService 服务加入到 LocalServices 中。publishLocalService(BatteryManagerInternal.class, new LocalService());
    }
    

    继续看看 mBinderService 具体是什么,又是如何加入到 ServiceManager 中的:

    路径:/frameworks/base/services/core/java/com/android/server/BatteryService.javaprivate final class BinderService extends Binder {...
    }
    

    可以看到 mBinderService 就是一个 Binder,然后调用 publishBinderService 加入到 ServiceManager 中的 binder 线程池中:

    路径:/frameworks/base/services/core/java/com/android/server/SystemService.javaprotected final void publishBinderService(String name, IBinder service,boolean allowIsolated, int dumpPriority) {ServiceManager.addService(name, service, allowIsolated, dumpPriority);
    }
    

    调用 ServiceManager.addService 加入到 binder 线程池中,而 ServiceManager 服务早就在 servicemanager.rc 文件中作为核心服务启动了:

    路径:/frameworks/native/cmds/servicemanager/servicemanager.rcservice servicemanager /system/bin/servicemanagerclass core animationuser systemgroup system readproccriticalfile /dev/kmsg wonrestart setprop servicemanager.ready falseonrestart restart --only-if-running apexdonrestart restart audioserveronrestart restart gatekeeperdonrestart class_restart --only-enabled mainonrestart class_restart --only-enabled halonrestart class_restart --only-enabled early_haltask_profiles ServiceCapacityLowshutdown critical
    

二、总结

SystemServer 作为 Android 系统的核心组成部分之一,通过 fork 自 init 进程,在启动过程中创建并启动各类系统服务(核心服务、引导服务、其他服务),并将这些服务内建的 Binder 实例注册到 ServiceManager 的 binder 线程池中,从而实现了系统服务的高效管理和跨进程通信。

参考

基于Android13的系统启动流程分析(六)之SystemServer内部逻辑分析

http://www.hkea.cn/news/105374/

相关文章:

  • 邯郸哪有做网站的河南百度推广公司
  • 我是做环保类产品注册哪些浏览量大的网站推销自己的产品比较好呢西安网站seo优化公司
  • 网页传奇游戏排行昆明网络推广优化
  • 商城模板网站模板网站软文是什么
  • 校园网站推广方案怎么做网站排名推广工具
  • 深圳罗湖企业网站建设报价网络媒体发稿平台
  • 用别人公司域名做网站线下推广的渠道和方法
  • php mysql的网站开发外贸推广平台
  • 济南网站建设认可搜点网络能百度指数有三个功能模块
  • 网上商城网站建设意义在线代理浏览网页
  • 网站图片切换代码百度下载并安装最新版
  • 微信公众平台号申请注册入口杭州seo公司
  • 本周实时热点新闻事件seo文章代写一篇多少钱
  • 旺店通app手机企业版下载网站seo如何优化
  • 宝山区建设用地事务所网站网络公司有哪些
  • 用sql做简单的博客网站大连谷歌seo
  • 新手怎么学做网站就业培训机构有哪些
  • magento网站建设搭建网站步骤
  • 营销网站如何实现差异化南京seo公司
  • 服务器托管是啥搜索引擎优化排名培训
  • 山西手机网站建设网址大全123
  • b2c平台有哪些平台网址新区seo整站优化公司
  • WordPress突然全站404网站如何添加友情链接
  • 复制别人网站做第一站seo短视频网页入口引流下载
  • 基层建设论文收录在哪个网站百度统计api
  • 购买主机可以做网站吗楚雄今日头条新闻
  • 深圳专业网站建设公司哪家好宁波网络营销公司
  • ps做电商网站流程图百度图片识别搜索引擎
  • 做电影网站程序好用武汉网站建设推广公司
  • 如何做b2c网站下列关于友情链接说法正确的是