Android 系统分析

转载:http://blog.csdn.net/innost/article/details/6041412

ANDROID搞了大概5个月了,总感觉到它的这个java封装非常的不爽。这次下载了Froyo的源码,准备好好分析下Android的运行流程。一直有个暗想--能否替换掉JAVA层?搞android最麻烦的就是老记不住它那几个文件的位置,这里将给出详细的路径,方便其他看客了解。

没有固定的顺序,不过大概就是从启动开始的一些东西吧。我的想法是对android了解越多,才越可能在此基础上做最好最完善的改动。真的很不喜欢它的java层。

 

一 用户空间init

我这里不分析linux启动的那第一个程序init。

 init代码在/system/core/init/init.c。感兴趣的可从main函数开始分析

android的其他重要进程都是init加载init.rc配置文件来fork的。其中,最重要的init.rc位于source/system/core/rootdir下。

init.rc有它特有的语法,可google一下就知道了。

 

二 zygote的诞生

 

zygote程序是有app_process弄出来的,app_process的启动在init.rc中有对应行。

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server

//第一个zygote是这个服务的名字,实际启动的程序位于system/bin下的app_process,后面是这个程序的启动参数
    socket zygote stream 666

//这个表示init将创建一个unix域的socket,666是rwx的读写执行权限。
    onrestart write /sys/android_power/request_state wake
    onrestart write /sys/power/state on
    onrestart restart media

其中,app_process位于/frameworks/base/cmds/app_process/app_main.cpp中。

下面分析它的mian函数。

 

  1. int main(int argc, const charconst argv[])  
  2. {  
  3. //argc =  5   
  4. //argv=["/system/bin/app_process" "-Xzygote" "/system/bin" "--zygote" "--start-system-server"]     
  5.  // These are global variables in ProcessState.cpp   
  6.     mArgC = argc; //全局变量   
  7.     mArgV = argv; //全局变量   
  8.       
  9.     mArgLen = 0;  
  10.     for (int i=0; i<argc; i++) {  
  11.         mArgLen += strlen(argv[i]) + 1;  
  12.     }  
  13.     mArgLen--;  
  14.   
  15.     AppRuntime runtime;//定义AppRuntime   
  16.     const char *arg;  
  17.     const char *argv0;  
  18.   
  19.     argv0 = argv[0]; //argv0="/system/bin/app_process"   
  20.   
  21.     // Process command line arguments   
  22.     // ignore argv[0]   
  23.     argc--;  
  24.     argv++;  
  25.   
  26.     // Everything up to '--' or first non '-' arg goes to the vm   
  27.       
  28.     int i = runtime.addVmArguments(argc, argv);//将参数加到虚拟机,待会分析,应该是把-Xzygote加入虚拟机了   
  29.   
  30.     // Next arg is parent directory   
  31.     if (i < argc) {  
  32.         runtime.mParentDir = argv[i++]; //设置父目录为/system/bin    
  33.     }  
  34.  //   
  35.     // Next arg is startup classname or "--zygote"   
  36.     if (i < argc) {  
  37.         arg = argv[i++];  
  38.         if (0 == strcmp("--zygote", arg)) {  
  39.             bool startSystemServer = (i < argc) ?   
  40.                     strcmp(argv[i], "--start-system-server") == 0 : false;//正常情况是true   
  41.             setArgv0(argv0, "zygote");  
  42.             set_process_name("zygote");  
  43.             runtime.start("com.android.internal.os.ZygoteInit",  
  44.                 startSystemServer);//启动java的zygoteInit   
  45.         } else {  
  46.             set_process_name(argv0);  
  47.   
  48.             runtime.mClassName = arg;  
  49.   
  50.             // Remainder of args get passed to startup class main()   
  51.             runtime.mArgC = argc-i;  
  52.             runtime.mArgV = argv+i;  
  53.   
  54.             LOGV("App process is starting with pid=%d, class=%s./n",  
  55.                  getpid(), runtime.getClassName());  
  56.             runtime.start();  
  57.         }  
  58.     } else {  
  59.         LOG_ALWAYS_FATAL("app_process: no class name or --zygote supplied.");  
  60.         fprintf(stderr, "Error: no class name or --zygote supplied./n");  
  61.         app_usage();  
  62.         return 10;  
  63.     }  
  64.   
  65. }  

从上面代码注释可以看出,很多工作都交给了Runtime对象来处理,这个runtime对象也是在这个cpp文件中定义的。我们来看一下。

 

其中,基类AndroidRuntime.h在frameworks/base/include/android_runtime/AndroidRuntime.h中定义。大概看看里边都定义了些什么。

 

AndroidRuntime类主要是和java打交道,而且好像只能由framework调用才能起作用,一般我自己的jni库都不用AndroidRuntime里边定义的方便函数,虽然都是static。原因如下(必须看看它的实现文件才知道原因)

  1. //看来系统有一个全局的mJavaVM   
  2. JavaVM* AndroidRuntime::mJavaVM = NULL;  
  3. //整个系统范围内,第一次调用构造函数的应该就是在app_process中的吧?!   
  4. AndroidRuntime::AndroidRuntime()  
  5. {  
  6.     SkGraphics::Init();  
  7.     // this sets our preference for 16bit images during decode   
  8.     // in case the src is opaque and 24bit   
  9.     SkImageDecoder::SetDeviceConfig(SkBitmap::kRGB_565_Config);  
  10.     // This cache is shared between browser native images, and java "purgeable"   
  11.     // bitmaps. This globalpool is for images that do not either use the java   
  12.     // heap, or are not backed by ashmem. See BitmapFactory.cpp for the key   
  13.     // java call site.   
  14.     SkImageRef_GlobalPool::SetRAMBudget(512 * 1024);  
  15.     // There is also a global font cache, but its budget is specified in code   
  16.     // see SkFontHost_android.cpp   
  17.   
  18.     // Pre-allocate enough space to hold a fair number of options.   
  19.     mOptions.setCapacity(20);  
  20.   
  21.     assert(gCurRuntime == NULL);        // one per process   
  22.     gCurRuntime = this;  
  23. }  
  24. //刚才那几个onXXX函数就是在这里调用的,估计是java层调用的   
  25. static void com_android_internal_os_RuntimeInit_finishInit(JNIEnv* env, jobject clazz)  
  26. {  
  27.     gCurRuntime->onStarted();  
  28. }  
  29.   
  30. static void com_android_internal_os_RuntimeInit_zygoteInit(JNIEnv* env, jobject clazz)  
  31. {  
  32.     gCurRuntime->onZygoteInit();  
  33. }  
  34.   
  35. static jint com_android_internal_os_RuntimeInit_isComputerOn(JNIEnv* env, jobject clazz)  
  36. {  
  37.     return 1;  
  38. }  
  39.   
  40. static void com_android_internal_os_RuntimeInit_turnComputerOn(JNIEnv* env, jobject clazz)  
  41. {  
  42. }  
  43.   
  44. static jint com_android_internal_os_RuntimeInit_getQwertyKeyboard(JNIEnv* env, jobject clazz)  
  45. {  
  46.     char* value = getenv("qwerty");  
  47.     if (value != NULL && strcmp(value, "true") == 0) {  
  48.         return 1;  
  49.     }  
  50.       
  51.     return 0;  
  52. }  
  53. //略去一些   
  54. int AndroidRuntime::addVmArguments(int argc, const charconst argv[])  
  55. {  
  56.     int i;  
  57.       
  58.     for (i = 0; i<argc; i++) {  
  59.         if (argv[i][0] != '-') {  
  60.             return i;  
  61.         }  
  62.         if (argv[i][1] == '-' && argv[i][2] == 0) {  
  63.             return i+1;  
  64.         }  
  65.   //此时虚拟机还没有起来,先把这些options保存起来   
  66.         JavaVMOption opt;  
  67.         memset(&opt, 0, sizeof(opt));  
  68.         opt.optionString = (char*)argv[i];  
  69.         mOptions.add(opt);  
  70.     }  
  71.     return i;  
  72. }  

该cpp位置在/frameworks/base/core/jni/AndroidRuntime.cpp中。

 回到app_process的main中,此处已运到到runtime.start("com.android.internal.os.ZygoteInit", startSystemServer)这句话来了,应进去看看start到底干了什么。

说来说去,不如看代码分析。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值