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));}



更多相关文章

  1. C语言函数以及函数的使用
  2. Android实现无标题栏全屏的方法
  3. Android菜鸟之路-多线程下载
  4. Android中EditText 设置 imeOptions 无效问题的解决方法
  5. Android有两种方法检测USB设备插入
  6. android android屏幕禁止休眠和锁屏的方法
  7. Android向服务器传接和接收数据的方法汇总
  8. android spinner默认样式不支持换行和修改字体样式 的解决方法

随机推荐

  1. Android使用文件管理器打开指定文件夹,浏
  2. Android判断当前应用程序处于前台还是后
  3. 使用 IntelliJ 查看 Android 源码
  4. Android与Vue的交互的方法示例
  5. 更新Activity的几个方法
  6. Android Too many classes in --main-dex
  7. Android技能树 - Rxjava源码(1) 之 初步
  8. Android(安卓)中API之Drawable资源详解及
  9. 【错误问题系列】android sdk content lo
  10. android:drawSelectorOnTop含义