Android 之 SystemService
SystemServer是Android系統的一個核心程式,它是由zygote程式建立的,因此在android的啟動過程中位於zygote之後。android的所有服務迴圈都是建立在 SystemServer之上的。在SystemServer中,將可以看到它建立了android中的大部分服務,並通過ServerManager的add_service方法把這些服務加入到了ServiceManager的svclist中。從而完成ServcieManager對服務的管理。
先看下SystemServer的main函式:
- 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中
- static voidandroid_server_SystemServer_init1(JNIEnv* env, jobject clazz)
- {
- system_init();
- }
進一步來看system_init,在這裡面看到了閉合迴圈管理框架:
- 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的註冊。
- 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方法中:
- 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之動畫Android動畫
- Android之AlarmManagerAndroid
- Android之StrictModeAndroid
- Android之FragmentAndroidFragment
- Android之CrashHandlerAndroid
- Android之HandlerAndroid
- Android之ActivityAndroid
- Android之ServiceAndroid
- Android之ListViewAndroidView
- Android之android exported="false"作用AndroidExportFalse
- android開發 之 Bolts-AndroidAndroid
- android之 Android訊息機制Android
- Android之BroadcastReceiverAndroidAST
- Android OCR之tesseractAndroid
- Android之MVC模式AndroidMVC模式
- Android 通知之 NotificationAndroid
- Android 之 SharedPreferencesAndroid
- android之Notification通知Android
- Android之Service設定android:process作用Android
- Android API開發之OpenGL開發之Android OpenGL STL詳解AndroidAPI
- Android之Window與WindowManagerAndroid
- Android IPC 之AIDLAndroidAI
- 再學Android之WebViewAndroidWebView
- Android 基礎之 HandlerAndroid
- Android之Zygote介紹AndroidGo
- Android之APP保活AndroidAPP
- Android修煉之混淆Android
- Android Jetpack 之 LiveDataAndroidJetpackLiveData
- Android Jetpack 之 LifecycleAndroidJetpack
- Android Jetpack 之 ViewModelAndroidJetpackView
- Android Jetpack之ViewModelAndroidJetpackView
- Android之Activity全面解析Android
- Android 之Service使用攻略Android
- Android之Apk加殼AndroidAPK
- Android之Material DesignAndroidMaterial Design
- Android JNI 之 Bitmap 操作Android
- Android 冷兵器之 toolsAndroid
- Android Apt之Activity RouteAndroidAPT