97干视频,99国产精品懂色,亚洲精品99久久久久中文字幕,伊人五月丁香综合AⅤ,国产精品成人免费999

  您的位置:華清遠(yuǎn)見(jiàn)教育科技集團(tuán) >> 新聞動(dòng)態(tài) >> Android資料 >> Android Dalvik虛擬機(jī)啟動(dòng)  
 
Android Dalvik虛擬機(jī)啟動(dòng)
分享到:

Android啟動(dòng)的第一個(gè)虛擬機(jī)稱為Zygote,這也是Android中重要的一個(gè)虛擬機(jī)。在system\core\rootdir\init.rc腳本中,Zygote的啟動(dòng)配置如下:

service  zygote  /system/bin/app_process  -Xzygote  /system/bin  --zygote
--start-system-server
        socket zygote stream 666
        onrestart write /sys/android_power/request_state wake
        onrestart write /sys/power/state on

Zygote進(jìn)程的啟動(dòng)過(guò)程位于frameworks\base\cmds\app_process\app_main.cpp文件中,app_main.cpp中描述了應(yīng)用進(jìn)程(app_process)的啟動(dòng)模式:zygote模式和非zygote模式。應(yīng)用進(jìn)程的命令行參數(shù)為:

app_process [java-options] cmd-dir start-class-name [options]

由此可以明白,在啟動(dòng)Zygote進(jìn)程時(shí),app_process的java-options選項(xiàng)為-Xzygote;cmd-dir選項(xiàng)為/system/bin,即當(dāng)前目錄;start-class-name為zygote,即進(jìn)程名。

Zygote虛擬機(jī)的具體啟動(dòng)過(guò)程如下:

代碼1-1 app_process實(shí)現(xiàn)

int main(int argc, const char* const argv[])
    {
      //全局變量在ProcessState.cpp中定義
      mArgC=argc;
      mArgV=argv;
      mArgLen=0;
      for (int i=0; i<argc; i++) {
        mArgLen+=strlen(argv[i]) + 1;
      }
      mArgLen--;
      AppRuntime runtime;
      const char *arg;
      const char *argv0;
      argv0=argv[0];
      argc--;
      argv++;
      //添加VM參數(shù)
      int i=runtime.addVmArguments(argc, argv);
      if (i<argc) {
        runtime.mParentDir=argv[i++]; //設(shè)置父路徑
      }
      if (i<argc) {
        arg=argv[i++];
        if (0==strcmp("--zygote", arg)) {
          bool startSystemServer=(i<argc) ?
          strcmp(argv[i], "--start-system-server")==0 : false; //系統(tǒng)服務(wù)器
          setArgv0(argv0, "zygote");
          set_process_name("zygote"); //設(shè)置進(jìn)程名
          runtime.start("com.android.internal.os.ZygoteInit",
          startSystemServer); //啟動(dòng)zygote進(jìn)程
        }
        else { //非zygote進(jìn)程的啟動(dòng)
          set_process_name(argv0);
          runtime.mClassName=arg;
          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;
      }
    }

當(dāng)進(jìn)程的啟動(dòng)模式為zygote模式時(shí),系統(tǒng)會(huì)調(diào)用com.android.internal.os.ZygoteInit啟動(dòng)系統(tǒng)服務(wù)器;當(dāng)進(jìn)程啟動(dòng)模式為非zygote模式時(shí),系統(tǒng)會(huì)調(diào)用com.android.internal.os.RuntimeInit啟動(dòng)進(jìn)程。關(guān)于com.android.internal.os.ZygoteInit的實(shí)現(xiàn)位于frameworks\base\core\java\com\android\internal\os\ZygoteInit.java文件中,更詳細(xì)的內(nèi)容將在2.3.4節(jié)實(shí)時(shí)進(jìn)程中討論。

無(wú)論進(jìn)程以何種模式啟動(dòng),終將會(huì)執(zhí)行Android Runtime::start(const char* className, const bool startSystem Server)函數(shù),然后經(jīng)過(guò)一系列的參數(shù)配置終啟動(dòng)一個(gè)Dalvik虛擬機(jī)。相關(guān)的代碼分布在app_main.cpp、Jni.c、init.c等文件中,啟動(dòng)Dalvik虛擬機(jī)的過(guò)程如圖1-1所示。

圖1-1 啟動(dòng)Dalvik虛擬機(jī)

在創(chuàng)建Dalvik虛擬機(jī)之前,系統(tǒng)會(huì)首先阻塞管道信號(hào),接著檢查Dalvik虛擬機(jī)的相關(guān)屬性,如dalvik.vm.checkjni、dalvik.vm.execution-mode、dalvik.vm.stack-trace-file、dalvik. vm.enableassertions、dalvik.vm.jniopts、dalvik.vm.dexopt-flags、dalvik.vm.deadlock-predict等,然后調(diào)用JNI_CreateJavaVM()函數(shù)創(chuàng)建Dalvik虛擬機(jī),后為Dalvik虛擬機(jī)進(jìn)行原生方法的注冊(cè)。

 更多相關(guān)文章

·Android服務(wù)管理器守護(hù)進(jìn)程
·Android init.rc腳本語(yǔ)
·Android開機(jī)啟動(dòng)過(guò)程
·Android進(jìn)程的生命周期
·Android常用組件生命周期