您的位置:首页 > 移动开发 > Android开发

Android入门进阶教程(12)-SystemService详解

2013-06-01 18:23 573 查看
SystemServer是Android系统的一个核心进程,它是由zygote进程创建的,因此在android的启动过程中位于zygote之后。android的所有服务循环都是建立在 SystemServer之上的。在SystemServer中,将可以看到它建立了android中的大部分服务,并通过ServerManager的add_service方法把这些服务加入到了ServiceManager的svclist中。从而完成ServcieManager对服务的管理。

先看下SystemServer的main函数:

[java] view
plaincopy

native public static void init1(String[]args);  

public static void main(String[] args) {  

       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 ofthe time, so it needs to be  

       // as efficient as possible with itsmemory usage.  

      VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);  

      System.loadLibrary("android_servers"); //加载本地库android_servers  

       init1(args);  

   }  

在main函数中主要是调用了本地方法init1(args), 他的实现位于../base/services/jni/com_android_server_SystemService.cpp中

[java] view
plaincopy

static voidandroid_server_SystemServer_init1(JNIEnv* env, jobject clazz)  

{  

    system_init();  

}  

   进一步来看system_init,在这里面看到了闭合循环管理框架:

[java] view
plaincopy

runtime->callStatic("com/android/server/SystemServer","init2");//回调了SystemServer.java中的init2方法  

    if (proc->supportsProcesses()) {  

        LOGI("System server: enteringthread pool.\n");  

       ProcessState::self()->startThreadPool();  

       IPCThreadState::self()->joinThreadPool();  

        LOGI("System server: exitingthread pool.\n");  

    }  

通过调用com/android/server/SystemServer.java中的init2方法完成service的注册。在init2方法中主要建立了以ServerThread线程,然后启动线程来完成service的注册。

[java] view
plaincopy

public static final void init2() {  

    Slog.i(TAG, "Entered the Androidsystem server!");  

    Thread thr = new ServerThread();  

   thr.setName("android.server.ServerThread");  

    thr.start();  

}  

具体实现service的注册在ServerThread的run方法中:

[java] view
plaincopy

 try {  

            Slog.i(TAG, "EntropyService");  

           ServiceManager.addService("entropy", new EntropyService());  

            Slog.i(TAG, "PowerManager");  

            power = new PowerManagerService();  

           ServiceManager.addService(Context.POWER_SERVICE, power);  

            Slog.i(TAG, "ActivityManager");  

            context =ActivityManagerService.main(factoryTest);  

            Slog.i(TAG, "TelephonyRegistry");  

           ServiceManager.addService("telephony.registry", newTelephonyRegistry(context));  

  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android