接上文Android 启动过程分析 (一), 从这里开始android启动分为两条线走,分别是:

startSystemServer(); ---------- Zygote 的子进程

runSelectLoopMode(); /*Zygote进程进入无限循环,不再返回,执行孵化工作具体下面接着分析 */

我们分别分析,先来阐述startSystemServer()进程:

源码位置:frameworks\base\core\java\com\android\internal\os\ZygoteInit.java

/** Prepare the arguments and fork for the system server process.    */    private static boolean startSystemServer()  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,3001,3002,3003",            "--capabilities=130104352,130104352",            "--runtime-init",            "--nice-name=system_server",            "com.android.server.SystemServer",        };        ZygoteConnection.Arguments parsedArgs = null;        int pid;        try {            parsedArgs = new ZygoteConnection.Arguments(args);  /* 将上述参数列表构建为 ZygoteConnection.Arguments 类型   */            /** Enable debugging of the system process if *either* the command line flags             * indicate it should be debuggable or the ro.debuggable system property             * is set to "1" */            int debugFlags = parsedArgs.debugFlags;            if ("1".equals(SystemProperties.get("ro.debuggable")))                debugFlags |= Zygote.DEBUG_ENABLE_DEBUGGER;            /* fork system_server进程 */            pid = Zygote.forkSystemServer(                    parsedArgs.uid, parsedArgs.gid,                    parsedArgs.gids, debugFlags, null,                    parsedArgs.permittedCapabilities,                    parsedArgs.effectiveCapabilities);        } catch (IllegalArgumentException ex) {            throw new RuntimeException(ex);        }        /* 子进程执行下面的代码 */        if (pid == 0) {            handleSystemServerProcess(parsedArgs);        }/* 父进程zygote在这里正常返回 */        return true;    }   /*** Finish remaining work for the newly forked system server process.     */    private static void handleSystemServerProcess(            ZygoteConnection.Arguments parsedArgs)            throws ZygoteInit.MethodAndArgsCaller {        closeServerSocket();  /*在子进程中关闭父进程创建的socket,子进程执行新的工作 */        /* Pass the remaining arguments to SystemServer."--nice-name=system_server com.android.server.SystemServer"      */        RuntimeInit.zygoteInit(parsedArgs.remainingArgs);        /* should never reach here */    }

下面分析具体启动system_server的流程:

源码位置:frameworks\base\core\java\com\android\internal\os\RuntimeInit.java

 public static final void zygoteInit(String[] argv)            throws ZygoteInit.MethodAndArgsCaller {        System.setOut(new AndroidPrintStream(Log.INFO, "System.out"));        System.setErr(new AndroidPrintStream(Log.WARN, "System.err"));        commonInit();        zygoteInitNative();        int curArg = 0;        for ( /* curArg */ ; curArg < argv.length; curArg++) {            String arg = argv[curArg];            if (arg.equals("--")) {                curArg++;                break;            } else if (!arg.startsWith("--")) {                break;            } else if (arg.startsWith("--nice-name=")) {                String niceName = arg.substring(arg.indexOf('=') + 1);                Process.setArgV0(niceName);            }        }        if (curArg == argv.length) {            Slog.e(TAG, "Missing classname argument to RuntimeInit!");            // let the process exit            return;        }        //Remaining arguments are passed to the start class's static main        String startClass = argv[curArg++];        String[] startArgs = new String[argv.length - curArg];        System.arraycopy(argv, curArg, startArgs, 0, startArgs.length);/* 通过该函数调用执行startClass类的main函数,带参数 system_server  */        invokeStaticMain(startClass, startArgs);    }调用如下:  private static void invokeStaticMain(String className, String[] argv)            throws ZygoteInit.MethodAndArgsCaller {        // We want to be fairly aggressive about heap utilization, to avoid        // holding on to a lot of memory that isn't needed.        VMRuntime.getRuntime().setTargetHeapUtilization(0.75f);        Class<?> cl;        try {            cl = Class.forName(className);        } catch (ClassNotFoundException ex) {            throw new RuntimeException(                    "Missing class when invoking static main " + className,                    ex);        }        Method m;        try {            m = cl.getMethod("main", new Class[] { String[].class });        } catch (NoSuchMethodException ex) {            throw new RuntimeException(                    "Missing static main on " + className, ex);        } catch (SecurityException ex) {            throw new RuntimeException(                    "Problem getting static main on " + className, ex);        }        int modifiers = m.getModifiers();        if (! (Modifier.isStatic(modifiers) && Modifier.isPublic(modifiers))) {            throw new RuntimeException(                    "Main method is not public and static on " + className);        }        /*    这里已经获取到了mian方法,已下面的函数调用来执行      */        throw new ZygoteInit.MethodAndArgsCaller(m, argv);    }

调用com.android.server.SystemServer类的main函数:

源码位置:frameworks\base\core\java\android\os\SystemService.java

  public static void main(String[] args) {        if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) {             Slog.w(TAG, "System clock is before 1970; setting to 1970.");            SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);        }        if (SamplingProfilerIntegration.isEnabled()) {            SamplingProfilerIntegration.start();            timer = new Timer();            timer.schedule(new TimerTask() {                @Override                public void run() {                    SamplingProfilerIntegration.writeSnapshot("system_server");                }            }, SNAPSHOT_INTERVAL, SNAPSHOT_INTERVAL);        }        // The system server has to run all of the time, so it needs to be        // as efficient as possible with its memory usage.        VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);        System.loadLibrary("android_servers");        init1(args);    //最主要执行的是init1函数;    }

实际上就是main--->init1(system_init)--->init2(systemThread)之后进入Loop.loop();

init1实际是通过jni层的frameworks\base\services\jni\com_android_server_SystemServer.cpp文件中的jni接口调用system_init();

extern "C" int system_init();static void android_server_SystemServer_init1(JNIEnv* env, jobject clazz){    system_init();}static JNINativeMethod gMethods[] = {    /* name, signature, funcPtr */    { "init1", "([Ljava/lang/String;)V", (void*) android_server_SystemServer_init1 },};system_init 的实现位于frameworks\base\cmds\system_server\library\System_init.cppextern "C" status_t system_init(){    LOGI("Entered system_init()");        sp proc(ProcessState::self());        sp sm = defaultServiceManager();    LOGI("ServiceManager: %p\n", sm.get());        sp grim = new GrimReaper();    sm->asBinder()->linkToDeath(grim, grim.get(), 0);        char propBuf[PROPERTY_VALUE_MAX];    property_get("system_init.startsurfaceflinger", propBuf, "1");    if (strcmp(propBuf, "1") == 0) {        // Start the SurfaceFlinger        SurfaceFlinger::instantiate();    //启动SurfaceFlinger    }    // Start the sensor service    SensorService::instantiate();  //启动SensorService    //在模拟器上 audioflinger 等几个服务与设备上的启动过程不一样,所以我们在这里启动他们;    if (!proc->supportsProcesses()) {        // Start the AudioFlinger        AudioFlinger::instantiate();   //启动AudioFlinger        // Start the media playback service        MediaPlayerService::instantiate();  //启动MediaPlayerService        // Start the camera service        CameraService::instantiate();  //启动CameraService        // Start the audio policy service        AudioPolicyService::instantiate();  //启动AudioPolicyService    }    // And now start the Android runtime.  We have to do this bit    // of nastiness because the Android runtime initialization requires    // some of the core system services to already be started.    // All other servers should just start the Android runtime at    // the beginning of their processes's main(), before calling    // the init function.    LOGI("System server: starting Android runtime.\n");        AndroidRuntime* runtime = AndroidRuntime::getRuntime();    LOGI("System server: starting Android services.\n");    runtime->callStatic("com/android/server/SystemServer", "init2");//在这里执行com.android.server.SystemServer类的init2函数,下面详细分析;            // If running in our own process, just go into the thread    // pool.  Otherwise, call the initialization finished    // func to let this process continue its initilization.    if (proc->supportsProcesses()) {        LOGI("System server: entering thread pool.\n");        ProcessState::self()->startThreadPool();        IPCThreadState::self()->joinThreadPool();        LOGI("System server: exiting thread pool.\n");    }    return NO_ERROR;}

com.android.server.SystemServer类的init2函数执行的是ServerThread线程

public static final void init2() {        Slog.i(TAG, "Entered the Android system server!");        Thread thr = new ServerThread();        thr.setName("android.server.ServerThread");        thr.start();}

ServerThread线程的run函数启动android中大部分的service,并最后进入Loop.loop()

 public void run() {             … ...             // 主要的Service启动        try {            Slog.i(TAG, "Entropy Service");            ServiceManager.addService("entropy", new EntropyService());            Slog.i(TAG, "Power Manager");            power = new PowerManagerService();            ServiceManager.addService(Context.POWER_SERVICE, power);            Slog.i(TAG, "Activity Manager");            context = ActivityManagerService.main(factoryTest);                  Slog.i(TAG, "Window Manager");            wm = WindowManagerService.main(context, power,                    factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL);            ServiceManager.addService(Context.WINDOW_SERVICE, wm);           … …/* 其它大部分的service的启动类似,这里不再贴出代码  ,有兴趣可以查看源文件  *//* 这里说明一下,java部分的servicemanager调用的一系列添加、删除等的service操作盘实际最终还是通过binder机制由之前的servicemanager进程来最终完成的;在java层由一个ServiceManagerNative 类来实现IServiceManager 定义的这些接口 */         Looper.loop();        Slog.d(TAG, "System ServerThread is exiting!");    }}

至此,分支startsystemserver分析完成;

再次回到frameworks\base\core\java\com\android\internal\os\ZygoteInit.java

下面再来分析Zygote进程:runSelectLoopMode();

runSelectLoopMode-----done = peers.get(index).runOnce();


init进程启动MediaServer

init.rc文件中有如下命令:servicemedia /system/bin/mediaserver

执行的mediaserver源码位置:frameworks/base/media/mediaserver/main_mediaserver.cpp


分别调用相关的服务的instantiate函数启动服务;实际上调用的就是

spsm(defaultServiceManager());

sm->addService(String16(SERVICE::getServiceName()),new SERVICE());

最终由servicemanager来将服务的添加到服务列表中,以便处理客户端的查询和访问;

至于如何处理,在各服务部分分析,通信部分就是binder机制,这个也需要单独分析;

本文内容分析到这,以上

2011-07-02 XA




更多相关文章

  1. Android(安卓)UI学习 - Tab的学习和使用
  2. 创建SqliteDatabase
  3. 深入理解Android卷II
  4. 2013.12.23 (2)——— android 代码调用shell
  5. Android(安卓)AIDL 理解及开发要点
  6. Android(安卓)结束进程的方法
  7. 【Android】配置文件属性说明
  8. 新添的Activity 要在 manifest 中注册 否则界面跳转时会崩掉
  9. android 系统关机,重启

随机推荐

  1. Android中关于路径
  2. Android: How To Decode ProGuard’s Obf
  3. java.io.StreamCorruptedException: inva
  4. float/double数据不显示成科学计数法
  5. Fragment 组件使用
  6. 禁止viewpager左右滑动
  7. Android(安卓)Studio Tips Of the Day -
  8. android 禁用返回键
  9. 日期选择器 利用NumberPicker
  10. QuickStart Guide for AdMob Mediation +