Android启动流程(二):android服务启动

1. init进程

2. zygote进程

2.1 AndroidRuntime

2.2 ZygoteInit

3. system_server进程

3.1 init1阶段

3.2 init2阶段


接着Linux启动部分 http://blog.csdn.net/qianjin0703/article/details/6881107

1. init进程


系统在内核空间初始化进程,内存,文件系统,驱动模块之后,调用init_post()函数,开启第一个用户进程init,进入用户空间。

/kernel/init/main.c (仅截取部分重要代码)

[plain]  view plain copy
  1. static noinline int init_post(void)  
  2. {  
  3.   
  4.     run_init_process("/sbin/init");  
  5.     run_init_process("/etc/init");  
  6.     run_init_process("/bin/init");  
  7.     run_init_process("/bin/sh");  
  8. }  

终端下查看1号进程,


可见,init是系统守护进程和zygote的父进程。

/system/core/init/init.c 

[plain]  view plain copy
  1. int main(int argc, char **argv)  
  2. {  
  3.   
  4.     mkdir("/dev", 0755);  
  5.     mkdir("/proc", 0755);  
  6.     mkdir("/sys", 0755);  
  7.   
  8.     mount("devpts", "/dev/pts", "devpts", 0, NULL);  
  9.     mount("proc", "/proc", "proc", 0, NULL);  
  10.     mount("sysfs", "/sys", "sysfs", 0, NULL);  
  11.   
  12.     open_devnull_stdio();  
  13.     klog_init();  
  14.     property_init();  
  15.   
  16.     get_hardware_name(hardware, &revision);  
  17.     process_kernel_cmdline();  
  18.   
  19.     init_parse_config_file("/init.rc");  
  20.     action_for_each_trigger("early-init", action_add_queue_tail);  
  21.   
  22.     queue_builtin_action(wait_for_coldboot_done_action, "wait_for_coldboot_done");  
  23.     queue_builtin_action(keychord_init_action, "keychord_init");  
  24.     queue_builtin_action(console_init_action, "console_init");  
  25.     action_for_each_trigger("init", action_add_queue_tail);  
  26.   
  27.     for(;;) {  
  28.   
  29.         execute_one_command();  
  30.         restart_processes();  
  31.   
  32.         nr = poll(ufds, fd_count, timeout);  
  33.   
  34.         for (i = 0; i < fd_count; i++) {  
  35.             if (ufds[i].revents == POLLIN) {  
  36.                 if (ufds[i].fd == get_property_set_fd())  
  37.                     handle_property_set_fd();  
  38.                 else if (ufds[i].fd == get_keychord_fd())  
  39.                     handle_keychord();  
  40.                 else if (ufds[i].fd == get_signal_fd())  
  41.                     handle_signal();  
  42.             }  
  43.         }  
  44.     }  
  45.   
  46.     return 0;  
  47. }  
init进程归纳如下
  • 解析init.rc和init.*.rc
  • 挂载文件系统,建立文件夹和文件,设置权限,为一些文件写入初值
  • 初始化property属性
  • 启动系统守护进程如adbd, vold, rild等
  • 启动zygote进程



2. zygote进程

zygote既是Android系统创建Java世界的盘古,又是繁殖system_server和所有应用程序的女娲。

终端下查看zygote进程,


2.1 AndroidRuntime

/frameworks/base/cmds/app_process/app_main.cpp

[cpp]  view plain copy
  1. int main(int argc, const charconst argv[])  
  2. {  
  3.   
  4.     AppRuntime runtime;  
  5.   
  6.     if (zygote) {  
  7.         runtime.start("com.android.internal.os.ZygoteInit",  
  8.                 startSystemServer ? "start-system-server" : "");  
  9. }  
AppRuntime是从AndroidRuntime类派生的,最后由runtime.start()进入Java世界。

/frameworks/base/core/jni/AndroidRuntime.cpp

[cpp]  view plain copy
  1. void AndroidRuntime::start(const char* className, const char* options)  
  2. {  
  3.   
  4.     /* start the virtual machine */  
  5.     JNIEnv* env;  
  6.     if (startVm(&mJavaVM, &env) != 0) {  
  7.         return;  
  8.     }  
  9.     onVmCreated(env);  
  10.   
  11.     /* 
  12.      * Register android functions. 
  13.      */  
  14.     if (startReg(env) < 0) {  
  15.         ALOGE("Unable to register all android natives\n");  
  16.         return;  
  17.     }  
  18.   
  19.     /* 
  20.      * Start VM.  This thread becomes the main thread of the VM, and will 
  21.      * not return until the VM exits. 
  22.      */  
  23.     char* slashClassName = toSlashClassName(className);  
  24.     jclass startClass = env->FindClass(slashClassName);  
  25.   
  26.     jmethodID startMeth = env->GetStaticMethodID(startClass, "main",  
  27.             "([Ljava/lang/String;)V");  
  28.   
  29.     env->CallStaticVoidMethod(startClass, startMeth, strArray);  
  30.   
  31. }  

-> 创建虚拟机

注意这里会设置虚拟机的heapsize,默认16M,一般32M,不能太小,否则在操作大尺寸图片时无法分配所需内存。

-> 注册jni函数

这里注册了本地方法,这些方法最终被编译进动态链接库libandroid_runtime.so,供上层Java调用。

[cpp]  view plain copy
  1. static const RegJNIRec gRegJNI[] = {  
  2.     REG_JNI(register_android_debug_JNITest),  
  3.     REG_JNI(register_com_android_internal_os_RuntimeInit),  
  4.     REG_JNI(register_android_os_SystemClock),  
  5.     REG_JNI(register_android_util_Log),  
  6.     REG_JNI(register_android_os_Process),  
  7.     REG_JNI(register_android_os_SystemProperties),  
  8.     REG_JNI(register_android_os_Binder),  
  9.     REG_JNI(register_android_view_Display),  
  10.     REG_JNI(register_android_graphics_Bitmap),  
  11.     REG_JNI(register_android_graphics_Camera),  
  12.     REG_JNI(register_android_database_SQLiteDatabase),  
  13.     REG_JNI(register_android_os_Power),  
  14.     REG_JNI(register_android_os_StatFs),  
  15.     REG_JNI(register_android_net_NetworkUtils),  
  16.     REG_JNI(register_android_nfc_NdefMessage),  
  17.     REG_JNI(register_com_android_internal_os_ZygoteInit),  
  18.     REG_JNI(register_android_hardware_Camera),  
  19.     REG_JNI(register_android_hardware_SensorManager),  
  20.     REG_JNI(register_android_hardware_UsbDevice),  
  21.     REG_JNI(register_android_media_AudioRecord),  
  22.     REG_JNI(register_android_media_AudioSystem),  
  23.     REG_JNI(register_android_media_AudioTrack),  
  24.     REG_JNI(register_android_opengl_classes),  
  25.     REG_JNI(register_android_bluetooth_BluetoothSocket),  
  26.     REG_JNI(register_android_server_BluetoothService),  
  27.   
  28.     REG_JNI(register_android_app_ActivityThread),  
  29.     REG_JNI(register_android_app_NativeActivity),  
  30.     REG_JNI(register_android_view_InputChannel),  
  31.     REG_JNI(register_android_view_InputQueue),  
  32.     REG_JNI(register_android_view_KeyEvent),  
  33.     REG_JNI(register_android_view_MotionEvent),  
  34.     REG_JNI(register_android_view_PointerIcon),  
  35.   
  36. };  


2.2 ZygoteInit

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

[java]  view plain copy
  1. public static void main(String argv[]) {  
  2.     try {  
  3.         SamplingProfilerIntegration.start();  
  4.   
  5.         registerZygoteSocket();  
  6.   
  7.         preload();  
  8.   
  9.         SamplingProfilerIntegration.writeZygoteSnapshot();  
  10.   
  11.         if (argv[1].equals("start-system-server")) {  
  12.             startSystemServer();  
  13.         }   
  14.   
  15.             runSelectLoopMode();  
  16.   
  17.         closeServerSocket();  
  18.     }   
  19. }  

-> 建立服务端Socket

zygote及系统中其他程序的通信没有使用Binder,而是采用了基于AF_UNIX类型的Socket.

-> 预加载类和资源

预加载的类可以在 /frameworks/base/preloaded-classes 查看。预加载的资源生成framewrok-res.apk,主要是一些图标,刷机达人经常修改它。

-> 启动system_server进程

zygote进程fork出system_server子进程,把任务繁重的系统服务全部托管出去,自己负责循环监听所有应用程序的请求。

-> 等待应用程序的请求

zygote通过runSelectLoopMode()处理应用程序客户端的请求,由ZygoteConnection的runOnce()孵化出新的应用程序。


综上所述,zygote进程归纳如下

  • 创建虚拟机
  • 注册jni函数
  • 预加载类和资源
  • 启动system_server进程
  • 监听应用程序请求


3. system_server进程

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

[java]  view plain copy
  1. public static void main(String[] args) {  
  2.   
  3.     System.loadLibrary("android_servers");  
  4.     init1(args);  
  5. }  
3.1 init1阶段
加载libandriod_server.so库,实现init1

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

[cpp]  view plain copy
  1. extern "C" status_t system_init()  
  2. {  
  3.   
  4.     sp<GrimReaper> grim = new GrimReaper();  
  5.     sm->asBinder()->linkToDeath(grim, grim.get(), 0);  
  6.   
  7.     char propBuf[PROPERTY_VALUE_MAX];  
  8.     property_get("system_init.startsurfaceflinger", propBuf, "1");  
  9.     if (strcmp(propBuf, "1") == 0) {  
  10.         // Start the SurfaceFlinger  
  11.         SurfaceFlinger::instantiate();  
  12.     }  
  13.   
  14.     property_get("system_init.startsensorservice", propBuf, "1");  
  15.     if (strcmp(propBuf, "1") == 0) {  
  16.         // Start the sensor service  
  17.         SensorService::instantiate();  
  18.     }  
  19.   
  20.     AndroidRuntime* runtime = AndroidRuntime::getRuntime();  
  21.   
  22.     jclass clazz = env->FindClass("com/android/server/SystemServer");  
  23.     jmethodID methodId = env->GetStaticMethodID(clazz, "init2""()V");  
  24.     env->CallStaticVoidMethod(clazz, methodId);  
  25.   
  26.     return NO_ERROR;  
  27. }  


3.2 init2阶段

init2回到Java层,启动一个ServerThread线程,启动系统的各项服务。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值