转载: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函数。

[cpp] view plain copy print ?
  1. intmain(intargc,constchar*constargv[])
  2. {
  3. //argc=5
  4. //argv=["/system/bin/app_process""-Xzygote""/system/bin""--zygote""--start-system-server"]
  5. //TheseareglobalvariablesinProcessState.cpp
  6. mArgC=argc;//全局变量
  7. mArgV=argv;//全局变量
  8. mArgLen=0;
  9. for(inti=0;i<argc;i++){
  10. mArgLen+=strlen(argv[i])+1;
  11. }
  12. mArgLen--;
  13. AppRuntimeruntime;//定义AppRuntime
  14. constchar*arg;
  15. constchar*argv0;
  16. argv0=argv[0];//argv0="/system/bin/app_process"
  17. //Processcommandlinearguments
  18. //ignoreargv[0]
  19. argc--;
  20. argv++;
  21. //Everythingupto'--'orfirstnon'-'arggoestothevm
  22. inti=runtime.addVmArguments(argc,argv);//将参数加到虚拟机,待会分析,应该是把-Xzygote加入虚拟机了
  23. //Nextargisparentdirectory
  24. if(i<argc){
  25. runtime.mParentDir=argv[i++];//设置父目录为/system/bin
  26. }
  27. //
  28. //Nextargisstartupclassnameor"--zygote"
  29. if(i<argc){
  30. arg=argv[i++];
  31. if(0==strcmp("--zygote",arg)){
  32. boolstartSystemServer=(i<argc)?
  33. strcmp(argv[i],"--start-system-server")==0:false;//正常情况是true
  34. setArgv0(argv0,"zygote");
  35. set_process_name("zygote");
  36. runtime.start("com.android.internal.os.ZygoteInit",
  37. startSystemServer);//启动java的zygoteInit
  38. }else{
  39. set_process_name(argv0);
  40. runtime.mClassName=arg;
  41. //Remainderofargsgetpassedtostartupclassmain()
  42. runtime.mArgC=argc-i;
  43. runtime.mArgV=argv+i;
  44. LOGV("Appprocessisstartingwithpid=%d,class=%s./n",
  45. getpid(),runtime.getClassName());
  46. runtime.start();
  47. }
  48. }else{
  49. LOG_ALWAYS_FATAL("app_process:noclassnameor--zygotesupplied.");
  50. fprintf(stderr,"Error:noclassnameor--zygotesupplied./n");
  51. app_usage();
  52. return10;
  53. }
  54. }
int main(int argc, const char* const argv[]) { //argc = 5 //argv=["/system/bin/app_process" "-Xzygote" "/system/bin" "--zygote" "--start-system-server"] // These are global variables in ProcessState.cpp mArgC = argc; //全局变量 mArgV = argv; //全局变量 mArgLen = 0; for (int i=0; i<argc; i++) { mArgLen += strlen(argv[i]) + 1; } mArgLen--; AppRuntime runtime;//定义AppRuntime const char *arg; const char *argv0; argv0 = argv[0]; //argv0="/system/bin/app_process" // Process command line arguments // ignore argv[0] argc--; argv++; // Everything up to '--' or first non '-' arg goes to the vm int i = runtime.addVmArguments(argc, argv);//将参数加到虚拟机,待会分析,应该是把-Xzygote加入虚拟机了 // Next arg is parent directory if (i < argc) { runtime.mParentDir = argv[i++]; //设置父目录为/system/bin } // // 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;//正常情况是true setArgv0(argv0, "zygote"); set_process_name("zygote"); runtime.start("com.android.internal.os.ZygoteInit", startSystemServer);//启动java的zygoteInit } 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(); } } else { LOG_ALWAYS_FATAL("app_process: no class name or --zygote supplied."); fprintf(stderr, "Error: no class name or --zygote supplied./n"); app_usage(); return 10; } }

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

[cpp:collapse] + expand source view plain copy print ?
  1. classAppRuntime:publicAndroidRuntime//基类是AndroidRuntime,待会分析下是干嘛的
  2. {
  3. public:
  4. AppRuntime()
  5. :mParentDir(NULL)
  6. ,mClassName(NULL)
  7. ,mArgC(0)
  8. ,mArgV(NULL)
  9. {
  10. }
  11. #if0
  12. //thisappearstobeunused
  13. constchar*getParentDir()const
  14. {
  15. returnmParentDir;
  16. }
  17. #endif
  18. constchar*getClassName()const
  19. {
  20. returnmClassName;
  21. }
  22. virtualvoidonStarted()//下面几个onXXX应该是回调用的,可能是JNI回调
  23. {
  24. sp<ProcessState>proc=ProcessState::self();
  25. if(proc->supportsProcesses()){
  26. LOGV("Appprocess:startingthreadpool./n");
  27. proc->startThreadPool();
  28. }
  29. app_init(mClassName,mArgC,mArgV);
  30. if(ProcessState::self()->supportsProcesses()){
  31. IPCThreadState::self()->stopProcess();
  32. }
  33. }
  34. virtualvoidonZygoteInit()
  35. {
  36. sp<ProcessState>proc=ProcessState::self();
  37. if(proc->supportsProcesses()){
  38. LOGV("Appprocess:startingthreadpool./n");
  39. proc->startThreadPool();
  40. }
  41. }
  42. virtualvoidonExit(intcode)
  43. {
  44. if(mClassName==NULL){
  45. //ifzygote
  46. if(ProcessState::self()->supportsProcesses()){
  47. IPCThreadState::self()->stopProcess();
  48. }
  49. }
  50. AndroidRuntime::onExit(code);
  51. }
  52. constchar*mParentDir;
  53. constchar*mClassName;
  54. intmArgC;
  55. constchar*const*mArgV;
  56. };
  57. }
class AppRuntime : public AndroidRuntime //基类是AndroidRuntime,待会分析下是干嘛的 { public: AppRuntime() : mParentDir(NULL) , mClassName(NULL) , mArgC(0) , mArgV(NULL) { } #if 0 // this appears to be unused const char* getParentDir() const { return mParentDir; } #endif const char* getClassName() const { return mClassName; } virtual void onStarted() //下面几个onXXX应该是回调用的,可能是JNI回调 { sp<ProcessState> proc = ProcessState::self(); if (proc->supportsProcesses()) { LOGV("App process: starting thread pool./n"); proc->startThreadPool(); } app_init(mClassName, mArgC, mArgV); if (ProcessState::self()->supportsProcesses()) { IPCThreadState::self()->stopProcess(); } } virtual void onZygoteInit() { sp<ProcessState> proc = ProcessState::self(); if (proc->supportsProcesses()) { LOGV("App process: starting thread pool./n"); proc->startThreadPool(); } } virtual void onExit(int code) { if (mClassName == NULL) { // if zygote if (ProcessState::self()->supportsProcesses()) { IPCThreadState::self()->stopProcess(); } } AndroidRuntime::onExit(code); } const char* mParentDir; const char* mClassName; int mArgC; const char* const* mArgV; }; }

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

[cpp:collapse] + expand source view plain copy print ?
  1. namespaceandroid{
  2. //这个类是与java虚拟机交互的一个类。
  3. //估计java虚拟机由它启动了
  4. classAndroidRuntime
  5. {
  6. public:
  7. AndroidRuntime();
  8. virtual~AndroidRuntime();
  9. /**
  10. *Registerasetofmethodsinthespecifiedclass.
  11. */
  12. staticintregisterNativeMethods(JNIEnv*env,
  13. constchar*className,constJNINativeMethod*gMethods,intnumMethods);
  14. /**
  15. *CallastaticJavafunctionthattakesnoargumentsandreturnsvoid.
  16. */
  17. status_tcallStatic(constchar*className,constchar*methodName);
  18. /**
  19. *Callaclass'sstaticmainmethodwiththegivenarguments,
  20. */
  21. status_tcallMain(constchar*className,intargc,constchar*constargv[]);
  22. /**
  23. *Findaclass,withtheinputeitheroftheform
  24. *"package/class"or"package.class".
  25. */
  26. staticjclassfindClass(JNIEnv*env,constchar*className);
  27. intaddVmArguments(intargc,constchar*constargv[]);
  28. voidstart(constchar*classname,constboolstartSystemServer);
  29. voidstart();//startinandroid.util.RuntimeInit
  30. staticAndroidRuntime*getRuntime();
  31. /**
  32. *ThisgetscalledaftertheJavaVMhasinitialized.Overrideit
  33. *withthesystem'snativeentrypoint.
  34. */
  35. virtualvoidonStarted()=0;
  36. /**
  37. *ThisgetscalledaftertheJavaVMhasinitializedafteraZygote
  38. *fork.Overrideittoinitializethreads,etc.Uponreturn,the
  39. *correctstaticmainwillbeinvoked.
  40. */
  41. virtualvoidonZygoteInit(){};
  42. /**
  43. *CalledwhentheJavaapplicationexits.Thedefault
  44. *implementationcallsexit(code).
  45. */
  46. virtualvoidonExit(intcode);
  47. /**createanewthreadthatisvisiblefromJava*/
  48. staticvoidcreateJavaThread(constchar*name,void(*start)(void*),
  49. void*arg);
  50. /**returnapointertotheVMrunninginthisprocess*/
  51. staticJavaVM*getJavaVM(){returnmJavaVM;}
  52. /**returnapointertotheJNIEnvpointerforthisthread*/
  53. staticJNIEnv*getJNIEnv();
  54. private:
  55. staticintstartReg(JNIEnv*env);
  56. intstartVm(JavaVM**pJavaVM,JNIEnv**pEnv);
  57. Vector<JavaVMOption>mOptions;
  58. /*JNIJavaVMpointer*/
  59. staticJavaVM*mJavaVM;
  60. /*
  61. *Threadcreationhelpers.
  62. */
  63. staticintjavaCreateThreadEtc(
  64. android_thread_func_tentryFunction,
  65. void*userData,
  66. constchar*threadName,
  67. int32_tthreadPriority,
  68. size_tthreadStackSize,
  69. android_thread_id_t*threadId);
  70. staticintjavaThreadShell(void*args);
  71. };
  72. //ReturnstheUnixfiledescriptorforaParcelFileDescriptorobject
  73. externintgetParcelFileDescriptorFD(JNIEnv*env,jobjectobject);
  74. }
namespace android { //这个类是与java虚拟机交互的一个类。 //估计java虚拟机由它启动了 class AndroidRuntime { public: AndroidRuntime(); virtual ~AndroidRuntime(); /** * Register a set of methods in the specified class. */ static int registerNativeMethods(JNIEnv* env, const char* className, const JNINativeMethod* gMethods, int numMethods); /** * Call a static Java function that takes no arguments and returns void. */ status_t callStatic(const char* className, const char* methodName); /** * Call a class's static main method with the given arguments, */ status_t callMain(const char* className, int argc, const char* const argv[]); /** * Find a class, with the input either of the form * "package/class" or "package.class". */ static jclass findClass(JNIEnv* env, const char* className); int addVmArguments(int argc, const char* const argv[]); void start(const char *classname, const bool startSystemServer); void start(); // start in android.util.RuntimeInit static AndroidRuntime* getRuntime(); /** * This gets called after the JavaVM has initialized. Override it * with the system's native entry point. */ virtual void onStarted() = 0; /** * This gets called after the JavaVM has initialized after a Zygote * fork. Override it to initialize threads, etc. Upon return, the * correct static main will be invoked. */ virtual void onZygoteInit() {}; /** * Called when the Java application exits. The default * implementation calls exit(code). */ virtual void onExit(int code); /** create a new thread that is visible from Java */ static void createJavaThread(const char* name, void (*start)(void *), void* arg); /** return a pointer to the VM running in this process */ static JavaVM* getJavaVM() { return mJavaVM; } /** return a pointer to the JNIEnv pointer for this thread */ static JNIEnv* getJNIEnv(); private: static int startReg(JNIEnv* env); int startVm(JavaVM** pJavaVM, JNIEnv** pEnv); Vector<JavaVMOption> mOptions; /* JNI JavaVM pointer */ static JavaVM* mJavaVM; /* * Thread creation helpers. */ static int javaCreateThreadEtc( android_thread_func_t entryFunction, void* userData, const char* threadName, int32_t threadPriority, size_t threadStackSize, android_thread_id_t* threadId); static int javaThreadShell(void* args); }; // Returns the Unix file descriptor for a ParcelFileDescriptor object extern int getParcelFileDescriptorFD(JNIEnv* env, jobject object); }

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

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

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

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

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

更多相关文章

  1. Android(安卓)Wifi模块分析(三)
  2. Android中dispatchDraw分析
  3. Android(安卓)Chromium WebView html js 开发系列
  4. Android四大基本组件介绍与生命周期
  5. Android(安卓)Service AIDL
  6. Android(安卓)bluetooth介绍(四): a2dp connect流程分析
  7. Android调用天气预报的WebService简单例子
  8. android打电话发短信
  9. android 拨打紧急号码,通话时开启免提功能实现

随机推荐

  1. android 百度地图获取左上角和右下角的坐
  2. iPhone、Android 社交 App 使用比例大調
  3. Android 属性动画ValueAnimator和ObjectA
  4. Android Hook 机制之实战模拟
  5. Android贝壳单词客户端应用源码
  6. 2013 年第四届 Android 应用开发中国大学
  7. android开发AVD配置target为unknown(设备
  8. android widget简单开发三之实时刷新widg
  9. Android Framework(一) 系统架构及源码
  10. Android群英传笔记——第七章:Android动画