Android 之 SystemService

yangxi_001發表於2013-11-15

SystemServer是Android系統的一個核心程式,它是由zygote程式建立的,因此在android的啟動過程中位於zygote之後。android的所有服務迴圈都是建立在 SystemServer之上的。在SystemServer中,將可以看到它建立了android中的大部分服務,並通過ServerManager的add_service方法把這些服務加入到了ServiceManager的svclist中。從而完成ServcieManager對服務的管理。

先看下SystemServer的main函式:

[java] view plaincopy
  1. native public static void init1(String[]args);  
  2. public static void main(String[] args) {  
  3.        if(SamplingProfilerIntegration.isEnabled()) {  
  4.           SamplingProfilerIntegration.start();  
  5.            timer = new Timer();  
  6.            timer.schedule(new TimerTask() {  
  7.                @Override  
  8.                public void run() {  
  9.                   SamplingProfilerIntegration.writeSnapshot("system_server");  
  10.                }  
  11.            }, SNAPSHOT_INTERVAL,SNAPSHOT_INTERVAL);  
  12.        }  
  13.        // The system server has to run all ofthe time, so it needs to be  
  14.        // as efficient as possible with itsmemory usage.  
  15.       VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);  
  16.       System.loadLibrary("android_servers"); //載入本地庫android_servers  
  17.        init1(args);  
  18.    }  

在main函式中主要是呼叫了本地方法init1(args), 他的實現位於../base/services/jni/com_android_server_SystemService.cpp中

[java] view plaincopy
  1. static voidandroid_server_SystemServer_init1(JNIEnv* env, jobject clazz)  
  2. {  
  3.     system_init();  
  4. }  

   進一步來看system_init,在這裡面看到了閉合迴圈管理框架:

[java] view plaincopy
  1. runtime->callStatic("com/android/server/SystemServer","init2");//回撥了SystemServer.java中的init2方法  
  2.     if (proc->supportsProcesses()) {  
  3.         LOGI("System server: enteringthread pool.\n");  
  4.        ProcessState::self()->startThreadPool();  
  5.        IPCThreadState::self()->joinThreadPool();  
  6.         LOGI("System server: exitingthread pool.\n");  
  7.     }  

通過呼叫com/android/server/SystemServer.java中的init2方法完成service的註冊。在init2方法中主要建立了以ServerThread執行緒,然後啟動執行緒來完成service的註冊。

[java] view plaincopy
  1. public static final void init2() {  
  2.     Slog.i(TAG, "Entered the Androidsystem server!");  
  3.     Thread thr = new ServerThread();  
  4.    thr.setName("android.server.ServerThread");  
  5.     thr.start();  
  6. }  

具體實現service的註冊在ServerThread的run方法中:

[java] view plaincopy
  1.  try {  
  2.             Slog.i(TAG, "EntropyService");  
  3.            ServiceManager.addService("entropy"new EntropyService());  
  4.             Slog.i(TAG, "PowerManager");  
  5.             power = new PowerManagerService();  
  6.            ServiceManager.addService(Context.POWER_SERVICE, power);  
  7.             Slog.i(TAG, "ActivityManager");  
  8.             context =ActivityManagerService.main(factoryTest);  
  9.             Slog.i(TAG, "TelephonyRegistry");  
  10.            ServiceManager.addService("telephony.registry", newTelephonyRegistry(context));  
  11.   
  12. }  

相關文章