接上文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. C语言函数以及函数的使用
  2. Android 查询天气源码分享
  3. [代码分享] 乐淘Android客户端源码
  4. ubuntu10.10下编译android内核源码
  5. Android EventBus源码分析
  6. android源码添加service
  7. Android PinyinIME 源码笔记 -- 0. 简介
  8. android 源码导入到android studio

随机推荐

  1. android 中让activity全屏幕显示
  2. Android学习中遇到的问题及解决方案
  3. android NDK中使用cRUL库
  4. android mtk6732 camera otp 加载流程
  5. android ImageView 设置背景选择器select
  6. Android高手进阶教程(二十七)之---基于Vi
  7. Android(安卓)TextView各种使用方法
  8. Android(安卓)WebView总结
  9. android AlarmManager
  10. Android应用程序组件Content Provider的