精华内容
参与话题
问答
  • System_Server进程

    千次阅读 2013-07-19 13:58:23
    System_Server进程 运行在system server进程中的服务比较多,这是整个android框架的基础   Native服务 SurfaceFlinger   这是framebuffer合成的服务,将各个应用程序及应用程序中的逻辑窗

    引用:http://www.cnblogs.com/Ashia/archive/2012/05/12/2497583.html

    System_Server进程

    运行在system server进程中的服务比较多,这是整个android框架的基础

     

    Native服务

    SurfaceFlinger

     

    这是framebuffer合成的服务,将各个应用程序及应用程序中的逻辑窗口图像数据(surface)合成到一个物理窗口中显示(framebuffer)的服务程序

     

    Java服务:

    这部分的服务大部分都有一个供应用进程使用的manager类,这就是一个RPC调用,用户通过调用xxxManager的方法,实际上被Binder给迁移到system_server进程中对应的xxxManagerService中对应的方法,并将结果再通过binder带回。 

     

     

    1. EntropyService

    熵服务,周期性的加载和保存随机信息。主要是linux开机后,/dev/random的状态可能是可预知的,这样一些需要随机信息的应用程序就可能会有问题。这个无需提供应用程序接口。

     

    2. PowerManagerService –> PowerManager

    Android 的电源管理也是很重要的一部分。比如在待机的时候关掉不用的设备,待机时屏幕和键盘背光的关闭,用户操作的时候该打开多少设备等等。

     

    3. ActivityManagerService->ActivityManager

    这个是整个Android framework框架中最为核心的一个服务,管理整个框架中任务、进程管理, Intent解析等的核心实现。虽然名为Activity的Manager Service,但它管辖的范围,不只是Activity,还有其他三大组件,和它们所在的进程。也就是说用户应用程序的生命管理,都是由他负责的。

     

    4. TelephonyRegistry->TelephonyManager

    电话注册、管理服务模块,可以获取电话的链接状态、信号强度等等。<可以删掉,但要看的大概明白>

     

    5. PackageManagerService -> PackageManager

    包括对软件包的解包,验证,安装以及升级等等,对于我们现在不能安装.so文件的问题,应该先从这块着手分析原因。

     

    6. AccountManagerService -> AccountManager

    A system service that provides  account, password, and authtoken management for all

     accounts on the device。

     

    7. ContentService -> ContentResolver

    内容服务,主要是数据库等提供解决方法的服务。

     

    8. BatteryService

    监控电池充电及状态的服务,当状态改变时,会广播Intent

     

    9. HardwareService

    一般是ring和vibrate的服务程序

     

    10. SensorService -> SensorManager

    管理Sensor设备的服务,负责注册client设备及当client需要使用sensor时激活Sensor

     

    11. WindowManagerService -> WindowManager -> PhoneWindowManager

    和ActivityManagerService高度粘合

    窗口管理,这里最核心的就是输入事件的分发和管理。

     

    12. AlarmManagerService -> AlarmManager

    闹钟服务程序

     

    13. BluetoothService -> BluetoothDevice

    蓝牙的后台管理和服务程序

     

    14. StatusBarService -> StatusBarManager

    负责statusBar上图标的更新、动画等等的服务,服务不大。

     

    15. ClipboardService -> ClipboardManager

    和其他系统的clipBoard服务类似,提供复制黏贴功过。

     

    16. InputMethodManagerService -> InputMethodManager

    输入法的管理服务程序,包括何时使能输入法,切换输入法等等。

     

    17. NetStatService

    手机网络服务

     

    18. ConnectivityService -> ConnectivityManager

    网络连接状态服务,可供其他应用查询,当网络状态变化时,也可广播改变。

     

    19. AccessibilityManagerService-> AccessibilityManager

    这块可能要仔细看一下,主要是一些View获得点击、焦点、文字改变等事件的分发管理,对整个系统的调试、问题定位等,也需要最这个服务仔细过目一下。

     

    20. NotificationManagerService -> NotificationManager

    负责管理和通知后台事件的发生等,这个和statusbar胶黏在一起,一般会在statusbar上添加响应图标。用户可以通过这知道系统后台发生了什么事情。

     

    21. MountService

    磁盘加载服务程序,一般要和一个linux daemon程序如vold/mountd等合作起作用,主要负责监听并广播device的mount/unmount/bad removal等等事件。

     

    22. DeviceStorageMonitorService

           监控磁盘空间的服务,当磁盘空间不足10%的时候会给用户警告

     

    23. LocationManagerService -> LocationManager

           要加入GPS服务等,这部分要细看,现在应用中的navigation没响应,可以从此处着手看一下

     

    24. SearchManagerService -> SearchManager

    The search manager service handles the search UI, and maintains a registry of searchable activities.

     

    25. Checkin Service(FallbackCheckinService)

    貌似checkin service是google提供的包,没有源代码,源码只有fallbackCheckinService

     

    26. WallpaperManagerService -> WallpaperManager
    管理桌面背景的服务,深度定制化桌面系统,需要看懂并扩展<同时要兼容>这部分

     

    27. AudioService -> AudioManager

    AudioFlinger的上层管理封装,主要是音量、音效、声道及铃声等的管理

     

    28. HeadsetObserver

    耳机插拔事件的监控小循环

     

    29. DockObserver

    如果系统有个座子,当手机装上或拔出这个座子的话,就得靠他来管理了

     

    30. BackupManagerService -> BackupManager

    备份服务

     

    31. AppWidgetService -> AppWidgetManager

    Android可以让用户写的程序以widget的方式放在桌面上,这就是这套管理和服务的接口

     

    32. StatusBarPolicy

    管理哪个图标该在status bar上显示的策略。

     

     

    mediaServer服务进程

    MediaServer服务基本上都是native的services,mediaServer进程也是在init.rc中启动的,它不是一个daemon进程,这点容易搞混。他也是和systemserver进程类似的系统服务进程,提供应用进程的RPC调用的真正服务代码所运行的位置。其服务都是和媒体录播放有关,主要有三个服务:

     

    AudioFlinger

    声音的录播放服务,包括混音等

     

    MediaPlayerService

    提供媒体播放服务,opencore是这块的核心模块,对java端的接口在mediaplayer.java

     

    CameraService

    提供camera的录制、preview等功能的服务

     

    AudioPolicyService

    主要功能有检查输入输出设备的连接状态及系统的音频策略的切换等。


    展开全文
  • system_server进程分析

    2018-01-12 09:37:19
    一、system_server的创建 1 1.1、forkSystemServer()函数 2 1.2、nativeForkSystemServer() 的JNI层实现 3 1.3、forkAndSpecializeCommon( ) 4 1.4、SetSigChldHandler() 4 1.5、SigChldHandler 5 二...
    


    一、system_server的创建 1

    1.1forkSystemServer()函数 2

    1.2nativeForkSystemServer() JNI层实现 3

    1.3forkAndSpecializeCommon( ) 4

    1.4SetSigChldHandler() 4

    1.5SigChldHandler 5

    二、handleSystemServerProcess()方法 6

    2.1zygoteInit()函数 7

    总结 8  

    system_server进程

     

    system_server属于ApplicationFramework层(框架层)。system_server进程开启时,就会初始化AMS,同时,会加载本地系统的服务库,创建系统上下文Context,创建ActivityThread及开启各种服务等等。而在这之后,就会开启系统的Launcher程序,完成系统界面的加载与显示。

    注意,Android中所有系统服务都是由system_server进程启动,如果该进程异常退出,就是整个Java世界的末日。

    system_server的启动入口函数是startSystemServer(),它位于ZygoteInit.java中。下面开始依次分析system_server进程:

    一、system_server的创建

    Path:./frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

    入口函数源码如下:

     /**

         * Prepare the arguments and fork for the system server process.

         */

        private static boolean startSystemServer(String abiList, String socketName, ZygoteServer zygoteServer)

                throws Zygote.MethodAndArgsCaller, RuntimeException {

                .........

                /* Request to fork the system server process */

                pid = Zygote.forkSystemServer(   //调用fork函数创建子进程system_serve

                        parsedArgs.uid, parsedArgs.gid,

                        parsedArgs.gids,

                        parsedArgs.debugFlags,

                        null,

                        parsedArgs.permittedCapabilities,

                        parsedArgs.effectiveCapabilities);

            } catch (IllegalArgumentException ex) {....... }

            /* For child process */

            if (pid == 0) {   //pid如果为0,说明在子进程system_serve

                if (hasSecondZygote(abiList)) {

                    waitForSecondaryZygote(socketName);

                }

                zygoteServer.closeServerSocket();

                handleSystemServerProcess(parsedArgs);

            }

    }

    说明:startSystemServer()函数主要是通过forkSystemServer()创建子进程;以及在子进程system_server启动后便开始调用handleSystemServerProcess()

    1.1forkSystemServer()函数

    forkSystemServer()是一个native方法,它所对应的源文件Path:./frameworks/base/core/java/com/android/internal/os/Zygote.java

    源码如下所示:

     public static int forkSystemServer(int uid, int gid, int[] gids, int debugFlags,

                int[][] rlimits, long permittedCapabilities, long effectiveCapabilities) {

            VM_HOOKS.preFork();

            int pid = nativeForkSystemServer(

                    uid, gid, gids, debugFlags, rlimits, permittedCapabilities, effectiveCapabilities);

            // Enable tracing as soon as we enter the system_server.

            if (pid == 0) {

                Trace.setTracingEnabled(true); //跟踪子进程

            }

            VM_HOOKS.postForkCommon();

            return pid;

        }

        native private static int nativeForkSystemServer(.....) {

            VM_HOOKS.postForkChild(debugFlags, isSystemServer, instructionSet);

    }

     

    说明:其中的nativeForkSystemServer()是个native成员函数,其对应的JNI层函数为com_android_internal_os_Zygote_nativeForkSystemServer

    1.2nativeForkSystemServer() JNI层实现

    Path:./frameworks/base/core/jni/com_android_internal_os_Zygote.cpp

     

    static jint com_android_internal_os_Zygote_nativeForkSystemServer(

            JNIEnv* env, jclass, uid_t uid, gid_t gid, jintArray gids,

            jint debug_flags, jobjectArray rlimits, jlong permittedCapabilities,

            jlong effectiveCapabilities) {

    //间接调用ForkAndSpecializeCommon()函数

      pid_t pid = ForkAndSpecializeCommon(env, uid, gid, gids,

                                          debug_flags, rlimits,

                                          permittedCapabilities, effectiveCapabilities,

                                          MOUNT_EXTERNAL_DEFAULT, NULL, NULL, true, NULL,

                                          NULL, NULL);

      if (pid > 0) {

          // The zygote process checks whether the child process has died or not.

          ALOGI("System server process %d has been created", pid);

          gSystemServerPid = pid;

          int status;

          if (waitpid(pid, &status, WNOHANG) == pid) {

              ALOGE("System server process %d has died. Restarting Zygote!", pid);

          //从这里可以看出zygote进程和system_server进程同生死

              RuntimeAbort(env, __LINE__, "System server process has died. Restarting Zygote!");

          }

      }

      return pid;   //返回进程的id

    }

     

    上述方法会检查System_server子进程是否启动成功,它的启动实际由forkAndSpecializeCommon方法实现。

    1.3forkAndSpecializeCommon( )

    Path:/home/android/3710/frameworks/base/core/jni/com_android_internal_os_Zygote.cpp

    forkAndSpecializeCommon方法中,创建了子进程,并返回了子进程id,接下来检查如果system_server进程是否退出,若是的话则zygote进程也将会被被干掉.其实职责就是监听system_server是否存在。

     

    // Utility routine to fork zygote and specialize the child process.

    static pid_t ForkAndSpecializeCommon(J.......) {

      SetSigChldHandler(); //设置信号处理函数

      sigset_t sigchld;

      sigemptyset(&sigchld);

      sigaddset(&sigchld, SIGCHLD);

      // M: Tracking for flow of zygote forking process

      ALOGI("%s: Begin to fork a new process",__FUNCTION__);

      pid_t pid = fork();  //调用fork()创建进程

      ............

    }

    说明:在通过fork()创建子进程之前,通过SetSigChldHandler()设置信号处理函数。

    1.4SetSigChldHandler()

    static void SetSigChldHandler() {

      struct sigaction sa; //Lihnux注册处理信号的一般流程,sigaction 处理SIGCHLD信号,子进程退出信号

      memset(&sa, 0, sizeof(sa));

      sa.sa_handler = SigChldHandler;

      int err = sigaction(SIGCHLD, &sa, NULL);

      if (err < 0) {

        ALOGW("Error setting SIGCHLD handler: %s", strerror(errno));

      }

    }

    当子进程退出的时候,由SigChldHandler来处理该信号。

    1.5SigChldHandler

    // This signal handler is for zygote mode, since the zygote must reap its children

    static void SigChldHandler(int /*signal_number*/) {

      pid_t pid;

      int status;

      int saved_errno = errno;

      while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {  //wait()系列的函数是父进程调用来收集子进程信息的函数

        if (WIFEXITED(status)) {

          if (WEXITSTATUS(status)) {

            ALOGI("Process %d exited cleanly (%d)", pid, WEXITSTATUS(status));

          }

        } else if (WIFSIGNALED(status)) {

          if (WTERMSIG(status) != SIGKILL) {

            ALOGI("Process %d exited due to signal (%d)", pid, WTERMSIG(status));

          }

          if (WCOREDUMP(status)) {

            ALOGI("Process %d dumped core.", pid);

          }

        }

        if (pid == gSystemServerPid) {

          ALOGE("Exit zygote because system server (%d) has terminated", pid);

          kill(getpid(), SIGKILL);

        }

      }

      if (pid < 0 && errno != ECHILD) {

        ALOGW("Zygote SIGCHLD error in waitpid: %s", strerror(errno));

      }

      errno = saved_errno;

    }

     

    说明:函数waitpid()中的参数-1表示:等待任何子进程;status:表示子进程退出时候的状态;WNOHANG:表示如果没有子进程退出,不必阻塞。从上面的ALOGW可以很清晰的知道它对不同情况下的处理方法。

     

    至此,system_server进程就已经完成创建了。

    二、handleSystemServerProcess()方法

    system_server进程启动起来之后,开始调用handleSystemServerProcess()方法。该方法位于path: ./frameworks/base/core/java/com/android/internal/os/ZygoteInit.java中,主要做一些清理和初始化的工作,完成system-serve进程的使命。

     

        /**

         * Finish remaining work for the newly forked system server process.

         */

        private static void handleSystemServerProcess(

                ZygoteConnection.Arguments parsedArgs)

                throws ZygoteInit.MethodAndArgsCaller {

            closeServerSocket();  //关闭从zygote进程继承来的socket

            // set umask to 0077 so new files and directories will default to owner-only permissions.

            Os.umask(S_IRWXG | S_IRWXO);

            if (parsedArgs.niceName != null) {

                Process.setArgV0(parsedArgs.niceName); //设置一些进程的参数

            }

           //加载进程对应的文件

            final String systemServerClasspath = Os.getenv("SYSTEMSERVERCLASSPATH");

            if (systemServerClasspath != null) {

                performSystemServerDexOpt(systemServerClasspath);

            }

            if (parsedArgs.invokeWith != null) {   //根据invoke参数会执行一个Shell命令

                String[] args = parsedArgs.remainingArgs;

                // If we have a non-null system server class path, we'll have to duplicate the

                // existing arguments and append the classpath to it. ART will handle the classpath

                // correctly when we exec a new process.

                if (systemServerClasspath != null) {

                    String[] amendedArgs = new String[args.length + 2];

                    amendedArgs[0] = "-cp";

                    amendedArgs[1] = systemServerClasspath;

                    System.arraycopy(parsedArgs.remainingArgs, 0, amendedArgs, 2, parsedArgs.remainingArgs.length);

                }

                WrapperInit.execApplication(parsedArgs.invokeWith,

                        parsedArgs.niceName, parsedArgs.targetSdkVersion,

                        VMRuntime.getCurrentInstructionSet(), null, args);

            } else {

            //利用systemServerClass对应的路径构建对应的ClassLoader

                ClassLoader cl = null;

                if (systemServerClasspath != null) {

                    cl = createSystemServerClassLoader(systemServerClasspath,

                            parsedArgs.targetSdkVersion);

                    Thread.currentThread().setContextClassLoader(cl);

                }

                /*

                 * Pass the remaining arguments to SystemServer.

               //将剩余参数及classLoader递交给RuntimeInitzygoteInit函数

                 */

                RuntimeInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl);

            }

        }

    2.1zygoteInit()函数

    接下来的流程进入到RuntimeInit中的zygoteInit函数。zygoteInit函数将根据classLoader和参数,完成不同进程所需要的初始化工作(SystemServer进程与zygote的其它子进程均将使用zygoteInit函数)。

     

    Path:./frameworks/base/core/java/com/android/internal/os/RuntimeInit.java

        public static final void zygoteInit(int targetSdkVersion, String[] argv, ClassLoader classLoader)

            throws ZygoteInit.MethodAndArgsCaller {

            if (DEBUG) Slog.d(TAG, "RuntimeInit: Starting application from zygote");

            Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "RuntimeInit");

            redirectLogStreams();   //重定向标准I/O操作

            commonInit();         //初始化一些通用的设置

            nativeZygoteInit();      //开启Binder通信

            applicationInit(targetSdkVersion, argv, classLoader); //虚拟机设置并转换参数

        }

    说明:上述标注红色字体的方法是zygoteinit()函数封装了对四个方法的调用实现它的职责。注意在zygoteinit函数里面它会抛出一个异常MethodAndArgsCaller;另外捕获这个异常是在main()函数中实现。(这个main函数会启动一些列服务)

    MethodAndArgsCaller比较特殊,它既是一个异常类也是一个线程;当捕获到这个异常之后,都会执行它的run()方法。

    而在main()函数启动服务之前,首先要初始化一些系统变量,加载类库,创建Context对象,创建SystemServiceManager对象等。这个过程涉及到的内容还是挺多的,后续再专门写篇关于SystemServer启动系统服务过程的文章吧。

     

    总结system_server进程大致分成两个过程:线程的创建——fork();履行进程的职责handleSystemProcess()。上述的分析就是根据这两个方向去解析system_server进程的。

    用张思维导图展示一下大致的流程,如下所示

                           

    1.system_server进程

    展开全文
  • android System_Server进程

    2012-10-11 22:11:00
    运行在system server进程中的服务比较多,这是整个android框架的基础 Native服务 SurfaceFlinger 这是framebuffer合成的服务,将各个应用程序及应用程序中的逻辑窗口图像数据(surface)合成到一个物理窗口中...

      

    运行在system server进程中的服务比较多,这是整个android框架的基础

     

    Native服务

    SurfaceFlinger

     

    这是framebuffer合成的服务,将各个应用程序及应用程序中的逻辑窗口图像数据(surface)合成到一个物理窗口中显示(framebuffer)的服务程序

     

    Java服务:

    这部分的服务大部分都有一个供应用进程使用的manager类,这就是一个RPC调用,用户通过调用xxxManager的方法,实际上被Binder给迁移到system_server进程中对应的xxxManagerService中对应的方法,并将结果再通过binder带回。


     

     

    1. EntropyService

    熵服务,周期性的加载和保存随机信息。主要是linux开机后,/dev/random的状态可能是可预知的,这样一些需要随机信息的应用程序就可能会有问题。这个无需提供应用程序接口。

     

    2. PowerManagerService –> PowerManager

    Android 的电源管理也是很重要的一部分。比如在待机的时候关掉不用的设备,待机时屏幕和键盘背光的关闭,用户操作的时候该打开多少设备等等。

     

    3. ActivityManagerService->ActivityManager

    这个是整个Android framework框架中最为核心的一个服务,管理整个框架中任务、进程管理, Intent解析等的核心实现。虽然名为Activity的Manager Service,但它管辖的范围,不只是Activity,还有其他三大组件,和它们所在的进程。也就是说用户应用程序的生命管理,都是由他负责的。

     

    4. TelephonyRegistry->TelephonyManager

    电话注册、管理服务模块,可以获取电话的链接状态、信号强度等等。<可以删掉,但要看的大概明白>

     

    5. PackageManagerService -> PackageManager

    包括对软件包的解包,验证,安装以及升级等等,对于我们现在不能安装.so文件的问题,应该先从这块着手分析原因。

     

    6. AccountManagerService -> AccountManager

    A system service that provides  account, password, and authtoken management for all

    accounts on the device。

     

    7. ContentService -> ContentResolver

    内容服务,主要是数据库等提供解决方法的服务。

     

    8. BatteryService

    监控电池充电及状态的服务,当状态改变时,会广播Intent

     

    9. HardwareService

    一般是ring和vibrate的服务程序

     

    10. SensorService -> SensorManager

    管理Sensor设备的服务,负责注册client设备及当client需要使用sensor时激活Sensor

     

    11. WindowManagerService -> WindowManager -> PhoneWindowManager

    和ActivityManagerService高度粘合

    窗口管理,这里最核心的就是输入事件的分发和管理。

     

    12. AlarmManagerService -> AlarmManager

    闹钟服务程序

     

    13. BluetoothService -> BluetoothDevice

    蓝牙的后台管理和服务程序

     

    14. StatusBarService -> StatusBarManager

    负责statusBar上图标的更新、动画等等的服务,服务不大。

     

    15. ClipboardService -> ClipboardManager

    和其他系统的clipBoard服务类似,提供复制黏贴功过。

     

    16. InputMethodManagerService -> InputMethodManager

    输入法的管理服务程序,包括何时使能输入法,切换输入法等等。

     

    17. NetStatService

    手机网络服务

     

    18. ConnectivityService -> ConnectivityManager

    网络连接状态服务,可供其他应用查询,当网络状态变化时,也可广播改变。

     

    19. AccessibilityManagerService-> AccessibilityManager

    这块可能要仔细看一下,主要是一些View获得点击、焦点、文字改变等事件的分发管理,对整个系统的调试、问题定位等,也需要最这个服务仔细过目一下。

     

    20. NotificationManagerService -> NotificationManager

    负责管理和通知后台事件的发生等,这个和statusbar胶黏在一起,一般会在statusbar上添加响应图标。用户可以通过这知道系统后台发生了什么事情。

     

    21. MountService

    磁盘加载服务程序,一般要和一个linux daemon程序如vold/mountd等合作起作用,主要负责监听并广播device的mount/unmount/bad removal等等事件。

     

    22. DeviceStorageMonitorService

           监控磁盘空间的服务,当磁盘空间不足10%的时候会给用户警告

     

    23. LocationManagerService -> LocationManager

           要加入GPS服务等,这部分要细看,现在应用中的navigation没响应,可以从此处着手看一下

     

    24. SearchManagerService -> SearchManager

    The search manager service handles the search UI, and maintains a registry of searchable activities.

     

    25. Checkin Service(FallbackCheckinService)

    貌似checkin service是google提供的包,没有源代码,源码只有fallbackCheckinService

     

    26. WallpaperManagerService -> WallpaperManager
    管理桌面背景的服务,深度定制化桌面系统,需要看懂并扩展<同时要兼容>这部分

     

    27. AudioService -> AudioManager

    AudioFlinger的上层管理封装,主要是音量、音效、声道及铃声等的管理

     

    28. HeadsetObserver

    耳机插拔事件的监控小循环

     

    29. DockObserver

    如果系统有个座子,当手机装上或拔出这个座子的话,就得靠他来管理了

     

    30. BackupManagerService -> BackupManager

    备份服务

     

    31. AppWidgetService -> AppWidgetManager

    Android可以让用户写的程序以widget的方式放在桌面上,这就是这套管理和服务的接口

     

    32. StatusBarPolicy

    管理哪个图标该在status bar上显示的策略。

     

     

    mediaServer服务进程

    MediaServer服务基本上都是native的services,mediaServer进程也是在init.rc中启动的,它不是一个daemon进程,这点容易搞混。他也是和systemserver进程类似的系统服务进程,提供应用进程的RPC调用的真正服务代码所运行的位置。其服务都是和媒体录播放有关,主要有三个服务:

     

    AudioFlinger

    声音的录播放服务,包括混音等

     

    MediaPlayerService

    提供媒体播放服务,opencore是这块的核心模块,对java端的接口在mediaplayer.java

     

    CameraService

    提供camera的录制、preview等功能的服务

     

    AudioPolicyService

    主要功能有检查输入输出设备的连接状态及系统的音频策略的切换等。

     

    版权声明:本文为博主原创文章,未经博主允许不得转载。

    转载于:https://www.cnblogs.com/zsw-1993/archive/2012/10/11/4880817.html

    展开全文
  • /base/core/java/com/android/internal/os/ - ZygoteInit.java - Zygote.java - RuntimeInit.java /base/core/jni/ - .../base/services/java/com/android/server/ - SystemSe...
    /base/core/java/com/android/internal/os/
     - ZygoteInit.java
     - Zygote.java
     - RuntimeInit.java
    /base/core/jni/
     - com_android_internal_os_Zygote.cpp
    /base/services/java/com/android/server/
     - SystemServer.java
    /base/core/java/android/app/
     - ActivityThread.java
    复制代码

    phone进程是由system_server进程的startOtherServices发起创建的,有必要了解system_server进程启动过程。

    1 启动zygote进程

    zygote进程创建后,会进入ZygoteInit的main方法,main会去调用startSystemServer方法,开始创建system_server进程。

    /base/core/java/com/android/internal/os/ZygoteInit.java
    复制代码
    public static void main(String argv[]) {
        try{
            if (startSystemServer) {
                startSystemServer(abiList, socketName);
            }
        } catch (MethodAndArgsCaller caller) {
        //RuntimeInit的invokeStaticMain抛出MethodAndArgsCaller被捕获,
        //反射进入SystemServer的main方法
                caller.run();
        } 
    }
    
     private static boolean startSystemServer(String abiList, String socketName)
                throws MethodAndArgsCaller, RuntimeException {
        /* Hardcoded command line to start the system server */
            String args[] = {
                "--setuid=1000",
                "--setgid=1000",
                "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1032,3001,3002,3003,3006,3007",
                "--capabilities=" + capabilities + "," + capabilities,
                "--nice-name=system_server",
                "--runtime-args",
                "com.android.server.SystemServer",
            };
            ...
            /* Request to fork the system server process */
            //创建systemserver进程
                pid = Zygote.forkSystemServer(
                        parsedArgs.uid, parsedArgs.gid,
                        parsedArgs.gids,
                        parsedArgs.debugFlags,
                        null,
                        parsedArgs.permittedCapabilities,
                        parsedArgs.effectiveCapabilities);
            ...
            //进入systemserver进程,继续处理system_server中的任务
            handleSystemServerProcess(parsedArgs);
    }
    复制代码

    2 native方式forksystem_server进程

    参数 "--nice-name=system_server"中可以看出,startSystemServer将创建system_server进程,而且是通过JNI方式调用native方法nativeForkSystemServer。

    base/core/java/com/android/internal/os/Zygote.java
    复制代码
    public static int forkSystemServer(int uid, int gid, int[] gids, int debugFlags,
                int[][] rlimits, long permittedCapabilities, long effectiveCapabilities) {
            VM_HOOKS.preFork();
            int pid = nativeForkSystemServer(
    复制代码

    nativeForkSystemServer的实现在/base/core/jni/com_android_internal_os_Zygote.cpp,最终会去调用fork方法,创建system_server进程。

    /base/core/jni/com_android_internal_os_Zygote.cpp
    复制代码
    static jint com_android_internal_os_Zygote_nativeForkSystemServer(
            JNIEnv* env, jclass, uid_t uid, gid_t gid, jintArray gids,
            jint debug_flags, jobjectArray rlimits, jlong permittedCapabilities,
            jlong effectiveCapabilities) {
      pid_t pid = ForkAndSpecializeCommon(env, uid, gid, gids,
                                          debug_flags, rlimits,
                                          permittedCapabilities, effectiveCapabilities,
                                          MOUNT_EXTERNAL_DEFAULT, NULL, NULL, true, NULL,
                                          NULL, NULL);
    }
    static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArray javaGids,
                                         jint debug_flags, jobjectArray javaRlimits,
                                         jlong permittedCapabilities, jlong effectiveCapabilities,
                                         jint mount_external,
                                         jstring java_se_info, jstring java_se_name,
                                         bool is_system_server, jintArray fdsToClose,
                                         jstring instructionSet, jstring dataDir) {
      SetSigChldHandler();
    
      pid_t pid = fork();//fork子进程
      }
    复制代码

    3 进程创建完成,继续初始化进程参数

    system_server进程创建完之后,继续进入handleSystemServerProcess。

    /base/core/java/com/android/internal/os/ZygoteInit.java
    复制代码
    private static void handleSystemServerProcess(
                ZygoteConnection.Arguments parsedArgs)
                throws ZygoteInit.MethodAndArgsCaller {
                /*
                 * Pass the remaining arguments to SystemServer.
                 */
                RuntimeInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl);进入system_server进程
        }
    复制代码

    在ZygoteInit的startSystemServer方法中传递的参数中有"com.android.server.SystemServer",继续传给zygoteInit,最终作为invokeStaticMain反射调用的参数。

    4 抛出MethodAndArgsCaller

    ./base/core/java/com/android/internal/os/RuntimeInit.java
    复制代码
    public static final void zygoteInit(int targetSdkVersion, String[] argv, ClassLoader classLoader)
                throws ZygoteInit.MethodAndArgsCaller {
                applicationInit(targetSdkVersion, argv, classLoader);
                }
    private static void applicationInit(int targetSdkVersion, String[] argv, ClassLoader classLoader)
                throws ZygoteInit.MethodAndArgsCaller {
                // Remaining arguments are passed to the start class's static main
            //args.startClass为com.android.server.SystemServer
            invokeStaticMain(args.startClass, args.startArgs, classLoader);
    }
    private static void invokeStaticMain(String className, String[] argv, ClassLoader classLoader)
                throws ZygoteInit.MethodAndArgsCaller {
            try {
                m = cl.getMethod("main", new Class[] { String[].class });
            }
            ...
            throw new ZygoteInit.MethodAndArgsCaller(m, argv);
    }
    复制代码

    5 ZygoteInit捕获MethodAndArgsCaller,反射进入SystemServer的main

    在RuntimeInit的invokeStaticMain抛出MethodAndArgsCaller,并被ZygoteInit的main方法捕获,进入ZygoteInit.MethodAndArgsCaller的run方法

    /base/core/java/com/android/internal/os/ZygoteInit.java
    复制代码
    public static void main(String argv[]) {
        try{
            if (startSystemServer) {
                startSystemServer(abiList, socketName);
            }
        } catch (MethodAndArgsCaller caller) {
                caller.run();
        } 
    }
    public static class MethodAndArgsCaller extends Exception
                implements Runnable {
                public void run() {
                    mMethod.invoke(null, new Object[] { mArgs });
                }
    复制代码

    6 system_server启动

    开始进入SystemServer的main方法

    ./base/services/java/com/android/server/SystemServer.java
    复制代码
    public static void main(String[] args) {
            new SystemServer().run();
        }
        
    private void run() {
                // Initialize the system context.
                createSystemContext();
                ...
                startBootstrapServices();
                startCoreServices();
                startOtherServices();//发起创建phone进程
    }
    
        private void createSystemContext() {
            ActivityThread activityThread = ActivityThread.systemMain();
            mSystemContext = activityThread.getSystemContext();
            mSystemContext.setTheme(android.R.style.Theme_DeviceDefault_Light_DarkActionBar);
        }
    复制代码

    至此system_server进程就可以进行初始化,创建application对象,并启动一些核心服务,包括发起fork phone进程Android Phone进程启动过程

    7 创建system_server进程的application对象

    frameworks/base/core/java/android/app/ActivityThread.java
    复制代码
        public static ActivityThread systemMain() {
            // The system process on low-memory devices do not get to use hardware
            // accelerated drawing, since this can add too much overhead to the
            // process.
            ActivityThread thread = new ActivityThread();
            thread.attach(true);
            return thread;
        }
    
    private void attach(boolean system) {
        if (!system) {
        ...
        }else {
                // Don't set application object here -- if the system crashes,
                // we can't display an alert, we just want to die die die.
                android.ddm.DdmHandleAppName.setAppName("system_process",
                        UserHandle.myUserId());
                try {
                    mInstrumentation = new Instrumentation();
                    ContextImpl context = ContextImpl.createAppContext(
                            this, getSystemContext().mPackageInfo);
                    mInitialApplication = context.mPackageInfo.makeApplication(true, null);
                    mInitialApplication.onCreate();
                } catch (Exception e) {
                    throw new RuntimeException(
                            "Unable to instantiate Application():" + e.toString(), e);
                }
            }
    }
    复制代码

    zygote进程启动过程

    转载于:https://juejin.im/post/5c7cdd806fb9a049dc02fa6b

    展开全文
  • Android system_server进程启动

    千次阅读 2013-09-04 18:49:47
    开机启动脚本init.rc中启动app_process进程...service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server app_process进程main函数中 if (strcmp(arg, "--start-system-server")
  • Android源码分析--system_server进程分析

    千次阅读 2015-03-07 15:43:48
    在上一篇博文中我们进行了有关Zygote进程的分析,我们知道Zygote进程创建了一个重要的进程–system_server进程后就进入了无限循环中,之后Android系统中的重要任务就交给了system_server进程,作为zygote的嫡长子...
  • 为什么80%的码农都做不了架构师?>>> ...
  • system_server进程 文章目录system_server进程1. 初始化参数2. forkSystemServer 创建一个进程3. handleSystemServerProcess4. systemServer的main方法4.1 startBootstrapServices4.2 startCoreServices4.3 ...
  • system_server 进程承载着整个framework的核心服务,例如创建 ActivityManagerService、PowerManagerService、DisplayManagerService、PackageManagerService、WindowManagerService、LauncherAppsService等80多个...
  • 本文参考: https://blog.csdn.net/Frakie_Kwok/article/details/70196986 ... SystemServer是Zygote孵化的第一个进程 System Server负责启动和管理整个Java framework Systemserver这...
  • Android应用进程创建流程大揭秘 Android四大组件之bindService源码实现详解 Android四大组件之Activity启动流程源码实现详解概要 Android四大组件之Activity启动流程源码实现详解(一) Android四大组件之Activity启动...

空空如也

1 2 3 4 5 ... 20
收藏数 691
精华内容 276
关键字:

system_server进程