转发自:http://blog.csdn.net/rickleaf/archive/2011/04/28/6369720.aspx1.System Services首先我要声明一下,我讲的System Services并非Android 开发应用程序时,所涉及的Service(后台应用服务程序)的概念。 我要讲的System Services是Android操作系统Java应用程序下层的,伴随操作系统启动而运行的系统后台服务程序。 它是Android系统运行的基石,它配合binder(Android多进程通讯方法)、dalvik虚拟机和Android应用程序构成了一个多进程 交互通讯,交互服务的Android系统。 2.浏览一下Android系统的service启动shell adb shell 执行下面指令 #service list Found 47 services:
3.什么是Service Manager里面理解一下就可以了,Service manager是管理以上services的一个进程,他是实际存在的。 您可以在adb shell中运行ps看看进程列表就知道了。 源代码位于: frameworks/base/cmds/servicemanager 执行方式: 他是用c和c++语言编写的natvie可以执行文件。在Android中称之为EXECUTABLE,这个名称很重要因为Android.mk文件中 用这个名字来确定他是可以执行的二进制文件。 4.探究一下Service Manager的启动过程和方法开始有点复杂了,也该开始进入真正的Linux阶段了。 众所周知Linux的启动和文件系统的加载需要一个ramdisk,ramdisk负责让Linux kernel加载第一个进程init进程 在Android的ramdisk中就有这样一个可执行文件init, 在深入一下,我们可以去看一下 system/core/init/init.c int main(int argc, char
**argv) 对的,没看错。这个文件会编译出一个init的二进制可执行文件,并且去读init.rc文件。 至此,我们称init.rc文件为Android启动配置脚本。 现在我们打开init.rc文件,(如果您不知道init.rc,请参考google吧) ## Daemon processes to be run by init. 看到吗,servicemanager 是init通过init.rc加载的第一个进程 接下来启动了zygote和media 4.system server进程继续阅读init.rc servicemanager进程运行起来以后,我们就可以应用binder来应用servicemanager提供的服务函数去创建 system-server和mediaserver了,下面是init.rc中的代码 service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server #system-server的创建是通过app_process这个二进制程序去加载的 5.回过头再看系统的进程列表
# ps 有点复杂了,请大家跟上思路。我们注意观察进程列表的PID和PPID,我们要通过实际的列表去理清他们的亲缘关系。 servicemanager是init的子进程 mediaserver是init的子进程 zygote是init的子进程 system_server和所有的java应用程序是zygote的子进程 休息一下我们看看他们的应用程序代码方式 Java script caller
(executable) app_process是android系统下面基于命令行的java的应用程序的调用工具 system_server executable(c/c++写的程序)
system_main.cpp SystemServer (java程序)
6.分析具体的调用过程(很痛苦)app_main 调用 zygoteInit p { margin-bottom: 0.21cm; } / Next arg is startup classname or "--zygote" if ( i < argc ) { arg = argv [ i ++]; if ( 0 == strcmp ( "--zygote" , arg )) { bool startSystemServer = ( i < argc ) ? strcmp ( argv [ i ], "--start-system-server" ) == 0 : false ; setArgv0 ( argv0 , "zygote" ); set_process_name ( "zygote" ); runtime. start ( "com.android.internal.os.ZygoteInit" , startSystemServer ); } else { set_process_name ( argv0 ); runtime. mClassName = arg ; // Remainder of args get passed to startup class main () runtime. mArgC = argc - i ; runtime. mArgV = argv + i ; LOGV ( "App process is starting with pid=%d, class=%s. \n " , getpid (), runtime. getClassName ()); runtime. start (); } } Zygote
分裂出
system_server p { margin-bottom: 0.21cm; } public static void main ( String argv []) { try { // Start profiling the zygote initialization. if ( argv [ 1 ] . equals ( "true" )) { startSystemServer (); } Log. i ( TAG, "Accepting command socket connections" );
if ( ZYGOTE_FORK_MODE ) { runForkMode (); } else { runSelectLoopMode (); } } frameworks/base/core/java/com/android/internal/os/ p { margin-bottom: 0.21cm; } private static boolean startSystemServer() throws MethodAndArgsCaller, RuntimeException {
try {
pid = Zygote. forkSystemServer ( parsedArgs. uid , parsedArgs. gid , parsedArgs. gids , debugFlags, null ); } catch
( IllegalArgumentException throw new RuntimeException (ex); }
if (pid == 0 ) { handleSystemServerProces } return true ; } 1.如果大家还能看到这里请复习一下 Linux的两个系统调用 fork和exec frameworks/base/services/java/com/android/server/SystemService.java p { margin-bottom: 0.21cm; } public static void main ( String [] args ) { if ( SamplingProfilerIntegrat SamplingProfilerIntegrat timer = new Timer (); timer . schedule ( new TimerTask () { @ Override public void run () { SamplingProfilerIntegrat } } , SNAPSHOT_INTERVAL, SNAPSHOT_INTERVAL ); } VMRuntime. getRuntime
() . setTargetHeapUtilization System . loadLibrary ( "android_servers" ); init1 ( args );------------------> } public static final void init2 () { Log. i ( TAG, "Entered the Android system server!" ); Thread thr = new ServerThread (); thr. setName ( "android.server.ServerThread" );--------------> thr.start(); }
frameworks/base/cmds/system_server/ Init2 这里启动了java的system service p { margin-bottom: 0.21cm; } class ServerThread extends Thread { @ Override public void run () { Log. i ( TAG, "System Content Providers" ); ActivityManagerService. installSystemProviders (); Log. i ( TAG, "Battery Service" ); battery = new BatteryService ( context ); ServiceManager. addService ( "battery" , battery ); Log. i ( TAG, "Hardware Service" ); hardware = new HardwareService ( context ); ServiceManager. addService ( "hardware" , hardware ); Log. i ( TAG, "Alarm Manager" ); AlarmManagerService alarm = new AlarmManagerService ( context ); ServiceManager. addService ( Context . ALARM_SERVICE , alarm ); } } 原创文章欢迎转载,转载请注明住处rickleaf 7. 整理Android系统启动流程至此System Service的服务环境启动起来了 |
|
来自: techres > 《AndroidFramework》