Android SystemServer学习

Linux内核启动后,Android系统启动有4个步骤;

(1)init进程启动

(2)Native服务启动

(3)System Server及Java服务启动

(4)Home启动


Init进程启动后,将根据init.rc及initXXX.rc的内容执行一系列的命令,包括创建mount目录,安装文件系统,设置属性,启动adb,systemserver,mediaserver


system/core/rootdir/init.rc 内容如下:

  1. <span style="font-size:18px;"># setup the global environment                 //设置环境变量  
  2.     export PATH /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin  
  3.     export LD_LIBRARY_PATH /vendor/lib:/system/lib  
  4. ...  
  5.     # Filesystem image public mount points.    //mount文件系统  
  6.     mkdir /mnt/obb 0700 root system  
  7.     mount tmpfs tmpfs /mnt/obb mode=0755,gid=1000  
  8. ...  
  9. </span>  

  1. <span style="font-size:18px;"># Define the oom_adj values for the classes of processes that can be  
  2. # killed by the kernel.  These are used in ActivityManagerService.  
  3.     setprop ro.FOREGROUND_APP_ADJ 0  
  4. ...   
  5.   
  6. service servicemanager /system/bin/servicemanager           //在其他服务启动前必须启动ServiceManager  
  7.     class pre_zygote_services  
  8.     user system  
  9.     group system  
  10.     critical  
  11.     onrestart restart zygote  
  12.     onrestart restart media  
  13. </span>  

  1. <span style="font-size:18px;">service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server   //启动SystemServer  
  2.     class zygote_services  
  3.     socket zygote stream 666  
  4.     onrestart write /sys/android_power/request_state wake  
  5.     onrestart write /sys/power/state on  
  6.     onrestart restart media  
  7.     onrestart restart netd  
  8.   
  9. service media /system/bin/mediaserver    //启动mediaserver,启动多媒体相关的camera/playback等服务  
  10.     class zygote_services  
  11.     user media  
  12.     group system audio camera graphics inet net_bt net_bt_admin net_raw mot_drm input mot_tpapi mot_secclkd mot_pwric mot_caif  
  13.     ioprio rt 4</span>  

代码中service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server将启动systemserver。



具体调用路径如下:

frameworks/base/cmds/app_process/app_main.cpp

  1. <span style="font-size:18px;">int main(int argc, const charconst argv[])  
  2. {  
  3. ...  
  4.     // Next arg is startup classname or "--zygote"  
  5.     if (i < argc) {  
  6.         arg = argv[i++];  
  7.         if (0 == strcmp("--zygote", arg)) { //命令行必须含 --zygote  
  8.             bool startSystemServer = (i < argc) ?   
  9.                     strcmp(argv[i], "--start-system-server") == 0 : false//命令行是否含--start-system-server  
  10.             setArgv0(argv0, "zygote");  
  11.             set_process_name("zygote");  
  12.             runtime.start("com.android.internal.os.ZygoteInit",  
  13.                 startSystemServer);          //此处启动systemserver  
  14.         } else {  
  15. ...  
  16. }</span>  


frameworks/base/core/jni/AndroidRuntime.cpp

  1. <span style="font-size:18px;">void AndroidRuntime::start(const char* className, const bool startSystemServer)  
  2. {  
  3. ...  
  4.     /* start the virtual machine */  
  5.     if (startVm(&mJavaVM, &env) != 0)  
  6.         goto bail;  
  7.   
  8.     /* 
  9.      * Register android functions. 
  10.      */  
  11.     if (startReg(env) < 0) {  
  12.         LOGE("Unable to register all android natives\n");  
  13.         goto bail;  
  14.     }  
  15. ...  
  16.     if (startClass == NULL) {  
  17.         LOGE("JavaVM unable to locate class '%s'\n", slashClassName);  
  18.         /* keep going */  
  19.     } else {  
  20.         startMeth = env->GetStaticMethodID(startClass, "main",  
  21.             "([Ljava/lang/String;)V");  
  22.         if (startMeth == NULL) {  
  23.             LOGE("JavaVM unable to find main() in '%s'\n", className);  
  24.             /* keep going */  
  25.         } else {  
  26.             env->CallStaticVoidMethod(startClass, startMeth, strArray); //调用com.android.internal.os.ZygoteInit的main()方法  
  27.         }  
  28.     }  
  29.   
  30. bail:  
  31.     free(slashClassName);  
  32. }</span>  

frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

  1. <span style="font-size:18px;">    public static void main(String argv[]) {  
  2.         try {  
  3.             VMRuntime.getRuntime().setMinimumHeapSize(5 * 1024 * 1024);  
  4. ...            registerZygoteSocket();  
  5. ...            preloadClasses();  
  6. ...            preloadResources();  
  7.             // Do an initial gc to clean up after startup  
  8.             gc();  
  9. ...  
  10.             if (argv[1].equals("true")) { //只支持true参数  
  11.                 startSystemServer();       //此处启动systemserver  
  12.             }  
  13. ...  
  14.             if (ZYGOTE_FORK_MODE) { //目前为false  
  15.                 runForkMode();  
  16.             } else {  
  17.                 runSelectLoopMode(); //将在Loop中顺序处理以后的For请求  
  18.             }  
  19.   
  20.             closeServerSocket();  
  21.         } catch (MethodAndArgsCaller caller) {  
  22.             caller.run();  
  23.         } catch (RuntimeException ex) {  
  24.             Log.e(TAG, "Zygote died with exception", ex);  
  25.             closeServerSocket();  
  26.             throw ex;  
  27.         }  
  28.     }</span>  

  1. <span style="font-size:18px;">    private static boolean startSystemServer()  
  2.             throws MethodAndArgsCaller, RuntimeException {  
  3.         /* Hardcoded command line to start the system server */  
  4.         String args[] = {  
  5.             "--setuid=1000",  
  6.             "--setgid=1000",              
  7. ...         "--capabilities=130104352,130104352",  
  8.             "--runtime-init",  
  9.             "--nice-name=system_server",  
  10.             "com.android.server.SystemServer"//指定要启动的类名  
  11.         };  
  12.         ZygoteConnection.Arguments parsedArgs = null;...  
  13.         try {  
  14.             parsedArgs = new ZygoteConnection.Arguments(args);  
  15. ...  
  16.             /* Request to fork the system server process */  
  17.             pid = Zygote.forkSystemServer(                   //fork出进程  
  18.                     parsedArgs.uid, parsedArgs.gid,  
  19.                     parsedArgs.gids, debugFlags, null,  
  20.                     parsedArgs.permittedCapabilities,  
  21.                     parsedArgs.effectiveCapabilities);  
  22.         } catch (IllegalArgumentException ex) {  
  23.             throw new RuntimeException(ex);  
  24.         }  
  25.   
  26.         /* For child process */  
  27.         if (pid == 0) {  
  28.             handleSystemServerProcess(parsedArgs);         //在fork出的进程里执行systemserver启动  
  29.         }  
  30.   
  31.         return true;  
  32.     }</span>  

  1. <span style="font-size:18px;">    private static void handleSystemServerProcess(  
  2.             ZygoteConnection.Arguments parsedArgs)  
  3.             throws ZygoteInit.MethodAndArgsCaller {  
  4.         closeServerSocket();  
  5.         RuntimeInit.zygoteInit(parsedArgs.remainingArgs);  
  6.     }</span>  

frameworks/base/core/java/com/android/internal/os/RuntimeInit.java
  1. <span style="font-size:18px;">    public static final void zygoteInit(String[] argv)  
  2.             throws ZygoteInit.MethodAndArgsCaller {  
  3. ...  
  4.         commonInit();  //初始化时区,设置agent  
  5.         zygoteInitNative();    //调用到com_android_internal_os_RuntimeInit_zygoteInit@AndroidRuntime.cpp -> gCurRuntime->onZygoteInit(),此处启动ThreadPool  
  6. ...  
  7.         invokeStaticMain(startClass, startArgs); //调用com.android.server.SystemServer的main方法  
  8.     }</span>  



frameworks/base/cmds/app_process/app_main.cpp

  1. <span style="font-size:18px;">    virtual void onZygoteInit()  
  2.     {  
  3.         sp<ProcessState> proc = ProcessState::self();  
  4.         if (proc->supportsProcesses()) {  
  5.             LOGV("App process: starting thread pool.\n");  
  6.             proc->startThreadPool(); //启动线程池处理Binder事件  
  7.         }          
  8.     }</span>  


frameworks/base/services/java/com/android/server/SystemServer.java

  1. <span style="font-size:18px;">    public static void main(String[] args) {  
  2. ...  
  3.         // The system server has to run all of the time, so it needs to be  
  4.         // as efficient as possible with its memory usage.  
  5.         VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);  
  6.   
  7.         System.loadLibrary("android_servers"); //Load JNI library here that is used by SystemServer  
  8.         init1(args);     //这里调用到android_server_SystemServer_init1@com_android_server_SystemServer.cpp  
  9.     }</span>  


frameworks/base/services/jni/com_android_server_SystemServer.cpp

  1. <span style="font-size:18px;">static void android_server_SystemServer_init1(JNIEnv* env, jobject clazz)  
  2. {  
  3.     system_init();  
  4. }</span>  

frameworks/base/cmds/system_server/library/system_init.cpp

  1. <span style="font-size:18px;">extern "C" status_t system_init()  
  2. {  
  3.     sp<ProcessState> proc(ProcessState::self());  
  4.       
  5.     sp<IServiceManager> sm = defaultServiceManager();  
  6.     LOGI("ServiceManager: %p\n", sm.get());  
  7.       
  8.     sp<GrimReaper> grim = new GrimReaper();  
  9.     sm->asBinder()->linkToDeath(grim, grim.get(), 0);  
  10.       
  11.     char propBuf[PROPERTY_VALUE_MAX];  
  12.     property_get("system_init.startsurfaceflinger", propBuf, "1");  
  13.     if (strcmp(propBuf, "1") == 0) {        //可以通过改变属性来设置SurfaceFlinger是否run在systemserver里  
  14.         // Start the SurfaceFlinger  
  15.         SurfaceFlinger::instantiate();  
  16.     }  
  17.   
  18.     // Start the sensor service  
  19.     SensorService::instantiate();       //启动SensorService  
  20.   
  21.     // On the simulator, audioflinger et al don't get started the  
  22.     // same way as on the device, and we need to start them here  
  23.     if (!proc->supportsProcesses()) { //在phone上,这些service在mediaserver中创建。模拟器上,以下service在此进程创建  
  24.   
  25.         // Start the AudioFlinger  
  26.         AudioFlinger::instantiate();  
  27.   
  28.         // Start the media playback service  
  29.         MediaPlayerService::instantiate();  
  30.   
  31.         // Start the camera service  
  32.         CameraService::instantiate();  
  33.   
  34.         // Start the audio policy service  
  35.         AudioPolicyService::instantiate();  
  36.     }  
  37.       
  38.     AndroidRuntime* runtime = AndroidRuntime::getRuntime();  
  39.   
  40.     runtime->callStatic("com/android/server/SystemServer""init2");//调用init2@SystemServer.java,在这里创建工作线程以启动各java服务并进入循环处理各service请求  
  41.           
  42.     if (proc->supportsProcesses()) {  
  43.         ProcessState::self()->startThreadPool();  //启动线程池,注意:由于前面已经调用过startThreadPool,故此次调用不做任何事情  
  44.         IPCThreadState::self()->joinThreadPool(); //主线程加入到线程池里  
  45.     }  
  46.     return NO_ERROR;  
  47. }</span>  

frameworks/base/services/java/com/android/server/SystemServer.java

  1. <span style="font-size:18px;">public class SystemServer  
  2. {  
  3.     public static final void init2() {  
  4.         Slog.i(TAG, "Entered the Android system server!");  
  5.         Thread thr = new ServerThread();               //创建新线程  
  6.         thr.setName("android.server.ServerThread");  
  7.         thr.start();     //启动工作线程  
  8.     }  
  9.   
  10. </span>  

此线程实现Java Service注册初始化及进入SystemServer事件处理循环。
  1. <span style="font-size:18px;">class ServerThread extends Thread {  
  2.     @Override  
  3.     public void run() {  
  4.         Looper.prepare();  
  5.   
  6.         android.os.Process.setThreadPriority(  
  7.                 android.os.Process.THREAD_PRIORITY_FOREGROUND);  
  8.   
  9.         BinderInternal.disableBackgroundScheduling(true);  
  10.         android.os.Process.setCanSelfBackground(false);  
  11.          // Critical services...  
  12.         try {  
  13.             ServiceManager.addService("entropy"new EntropyService()); //注册Service到ServiceManager  
  14.             power = new PowerManagerService();  
  15.             ServiceManager.addService(Context.POWER_SERVICE, power);  
  16.             context = ActivityManagerService.main(factoryTest); //注意:此处启动ActivityManagerService  
  17.  ...  
  18.         wm.systemReady();          //通知SystemReady  
  19.         power.systemReady();  
  20.         try {  
  21.             pm.systemReady();  
  22.         } catch (RemoteException e) {  
  23.         }  
  24. ...  
  25.         // We now tell the activity manager it is okay to run third party  
  26.         // code.  It will call back into us once it has gotten to the state  
  27.         // where third party code can really run (but before it has actually  
  28.         // started launching the initial applications), for us to complete our  
  29.         // initialization.  
  30.         ((ActivityManagerService)ActivityManagerNative.getDefault())  
  31.                 .systemReady(new Runnable() {       //此处启动Home  
  32.             public void run() {  
  33.                 if (statusBarF != null) statusBarF.systemReady2();  
  34.                 if (batteryF != null) batteryF.systemReady();  
  35.                 if (connectivityF != null) connectivityF.systemReady();  
  36.                 if (dockF != null) dockF.systemReady();  
  37.                 if (usbF != null) usbF.systemReady();  
  38.                 if (uiModeF != null) uiModeF.systemReady();  
  39.                 if (recognitionF != null) recognitionF.systemReady();  
  40.                 Watchdog.getInstance().start();  
  41.   
  42.                 // It is now okay to let the various system services start their  
  43.                 // third party code...  
  44.   
  45.                 if (appWidgetF != null) appWidgetF.systemReady(safeMode);  
  46.                 if (wallpaperF != null) wallpaperF.systemReady();  
  47.                 if (immF != null) immF.systemReady();  
  48.                 if (locationF != null) locationF.systemReady();  
  49.                 if (throttleF != null) throttleF.systemReady();  
  50.             }  
  51. ...  
  52.         Looper.loop(); //进入循环,处理请求  
  53.     }  
  54. }  
  55. </span>  


frameworks/base/services/java/com/android/server/am/ActivityManagerService.java


  1. public static final Context main(int factoryTest) {  
  2.     AThread thr = new AThread();  
  3.     thr.start();  
  4.   
  5.     synchronized (thr) { //等待<span style="font-size:18px;"><span style="font-size:18px;">ActivityManagerService</span></span>对象创建完成  
  6.         while (thr.mService == null) {  
  7.             try {  
  8.                 thr.wait();  
  9.             } catch (InterruptedException e) {  
  10.             }  
  11.         }  
  12.     }  
  13.   
  14.   
  15.     ActivityThread at = ActivityThread.systemMain(); //把此线程作为<span style="font-size:18px;"><span style="font-size:18px;">ActivityManagerService</span></span>的system线程  
  16.     mSystemThread = at;  
  17.     Context context = at.getSystemContext();  
  18.     m.mContext = context;  
  19.     m.mFactoryTest = factoryTest;  
  20.     m.mMainStack = new ActivityStack(m, context, true);  
  21.       
  22.     m.mBatteryStatsService.publish(context);  
  23.     m.mUsageStatsService.publish(context);  
  24.   
  25.     synchronized (thr) {  
  26.         thr.mReady = true;  
  27.         thr.notifyAll();  
  28.     }  
  29.   
  30.     m.startRunning(nullnullnullnull); //初始化变量  
  31.       
  32.     return context;  
  33. }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值