Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2149259
  • 博文数量: 438
  • 博客积分: 3871
  • 博客等级: 中校
  • 技术积分: 6075
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-10 00:11
个人简介

邮箱: wangcong02345@163.com

文章分类

全部博文(438)

文章存档

2017年(15)

2016年(119)

2015年(91)

2014年(62)

2013年(56)

2012年(79)

2011年(16)

分类: Android平台

2014-06-30 13:39:59


init.rc
  1. service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
  2.     class main
  3.     socket zygote stream 660 root system
  4.     onrestart write /sys/android_power/request_state wake
  5.     onrestart write /sys/power/state on
  6.     onrestart restart media
  7.     onrestart restart netd


1.
app_process是通过下面这个文件编译出来的,
在./frameworks/base/cmds/app_process/app_main.cpp中
  1. int main(int argc, const char* const argv[])
  2. {
  3.     //将进程名改为zygote
  4.     if (niceName && *niceName) {
  5.         setArgv0(argv0, niceName);
  6.         set_process_name(niceName);
  7.     }
  8.     //调用AndroidRuntime的start
  9.     AppRuntime runtime;
  10.     runtime.addVmArguments(argc, argv);
  11.     runtime.mParentDir = parentDir;
  12.     runtime.start("com.android.internal.os.ZygoteInit", "start-system-server" );
  13. }
其中class AppRuntime : public AndroidRuntime,所以上面的start就是调用AndroidRuntime的start
a.运行的进程是app_process为什么看到的却是zygote呢?
    set_process_name
       --> prctl(PR_SET_NAME, (unsigned long) new_name, 0, 0, 0);   ;;system/core/libcutils/process_name.c
    将进程的名字改为zygote了
2.
在./frameworks/base/core/jni/AndroidRuntime.cpp中
  1. void AndroidRuntime::start(const char* className, const char* options)
  2. {
  3.     if (strcmp(options, "start-system-server") == 0)
  4.         const int LOG_BOOT_PROGRESS_START = 3000;

  5.     JNIEnv* env;
  6.     startVm(&mJavaVM, &env);   //创建java虚拟机
  7.         --> JNI_CreateJavaVM
  8.     
  9.     onVmCreated(env);

  10.     startReg(env);
  11.   
  12.     //将 "com.android.internal.os.ZygoteInit", "start-system-server"都放在strArray中
  13.      ...

  14.     //找到"com.android.internal.os.ZygoteInit"这个类
  15.     char* slashClassName = toSlashClassName(className);
  16.     jclass startClass = env->FindClass(slashClassName);
  17.     //并找到"com.android.internal.os.ZygoteInit"这个类的main方法
  18.     jmethodID startMeth = env->GetStaticMethodID(startClass, "main", "([Ljava/lang/String;)V");
  19.     //调用"com.android.internal.os.ZygoteInit"这个类的main方法
  20.     env->CallStaticVoidMethod(startClass, startMeth, strArray);
  21. }


阅读(800) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~