亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android zygote啟動(dòng)流程詳解

 更新時(shí)間:2021年03月30日 08:56:33   作者:kailasa  
這篇文章主要介紹了Android zygote啟動(dòng)流程的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Android開發(fā),感興趣的朋友可以了解下

對(duì)zygote的理解

在Android系統(tǒng)中,zygote是一個(gè)native進(jìn)程,是所有應(yīng)用進(jìn)程的父進(jìn)程。而zygote則是Linux系統(tǒng)用戶空間的第一個(gè)進(jìn)程——init進(jìn)程,通過fork的方式創(chuàng)建并啟動(dòng)的。

作用

zygote進(jìn)程在啟動(dòng)時(shí),會(huì)創(chuàng)建一個(gè)Dalvik虛擬機(jī)實(shí)例,每次孵化新的應(yīng)用進(jìn)程時(shí),都會(huì)將這個(gè)Dalvik虛擬機(jī)實(shí)例復(fù)制到新的應(yīng)用程序進(jìn)程里面,從而使得每個(gè)應(yīng)用程序進(jìn)程都有一個(gè)獨(dú)立的Dalvik虛擬機(jī)實(shí)例。

zygote進(jìn)程的主要作用有兩個(gè):

啟動(dòng)SystemServer。
孵化應(yīng)用進(jìn)程。

啟動(dòng)流程

啟動(dòng)入口

Zygote進(jìn)程在init進(jìn)程中,通過解析init.zygote.rc配置文件,以service(服務(wù))的方式啟動(dòng)并創(chuàng)建的。

以init.zygote32.rc為例來看下:

腳本講解

//  system\core\rootdir\init.zygote32.rc
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
  class main
  priority -20
  user root
  group root readproc reserved_disk
  socket zygote stream 660 root system
  socket usap_pool_primary stream 660 root system
  onrestart write /sys/power/state on
  onrestart restart audioserver
  onrestart restart cameraserver
  onrestart restart media
  onrestart restart netd
  onrestart restart wificond
  writepid /dev/cpuset/foreground/tasks

這段腳本要求 init 進(jìn)程創(chuàng)建一個(gè)名為 zygote 的進(jìn)程,該進(jìn)程要執(zhí)行的程序是“/system/bin/app_process”。并且為 zygote 進(jìn)程創(chuàng)建一個(gè) socket 資源 (用于進(jìn)程間通信,ActivityManagerService 就是通過該 socket 請(qǐng)求 zygote 進(jìn)程 fork 一個(gè)應(yīng)用程序進(jìn)程)。

后面的**--zygote**是參數(shù),表示啟動(dòng)的是zygote進(jìn)程。在app_process的main函數(shù)中會(huì)依據(jù)該參數(shù)決定執(zhí)行ZygoteInit還是Java類。

啟動(dòng)過程

zygote要執(zhí)行的程序便是system/bin/app_process,它的源代碼在frameworks/base/cmds/app_process/app_main.cpp

App_main::main

int main(int argc, char* const argv[])
{
  ...
  while (i < argc) {
    const char* arg = argv[i++];
    if (strcmp(arg, "--zygote") == 0) {//是否有--zygote參數(shù)。這個(gè)是啟動(dòng)zygote進(jìn)程的時(shí)候的參數(shù)
      zygote = true;
			//進(jìn)程名稱,設(shè)置為zygote
      niceName = ZYGOTE_NICE_NAME;
    } else if (strcmp(arg, "--start-system-server") == 0) {//是否有--start-system-server
      startSystemServer = true;
	....
  if (zygote) {
		//最最重要方法。。。如果是zygote進(jìn)程,則啟動(dòng)ZygoteInit。
    runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
  } else if (className) {
    runtime.start("com.android.internal.os.RuntimeInit", args, zygote);
  } else {
    fprintf(stderr, "Error: no class name or --zygote supplied.\n");
    app_usage();
    LOG_ALWAYS_FATAL("app_process: no class name or --zygote supplied.");
  }
}

AndroidRuntime::start

void AndroidRuntime::start(const char* className, const Vector<String8>& options, bool zygote)
{
  ...
  JNIEnv* env;
	//重點(diǎn)方法   創(chuàng)建VM虛擬機(jī),參數(shù)是指針,可以用于獲取返回的值,可以使用env來和Java層來做交互
  if (startVm(&mJavaVM, &env, zygote) != 0) {
    return;
  }
  onVmCreated(env);
  //重點(diǎn)方法   給虛擬機(jī)注冊(cè)一些JNI函數(shù),(系統(tǒng)so庫、用戶自定義so庫 、加載函數(shù)等。)
  if (startReg(env) < 0) {
    ALOGE("Unable to register all android natives\n");
    return;
  }

  	//找到類的main方法,并調(diào)用。如果是zygote的話,這里就會(huì)啟動(dòng)ZygoteInit類的main方法
    jmethodID startMeth = env->GetStaticMethodID(startClass, "main",
      "([Ljava/lang/String;)V");
    if (startMeth == NULL) {
      ALOGE("JavaVM unable to find main() in '%s'\n", className);
      /* keep going */
    } else {
    	//調(diào)用main方法。這里通過JNI調(diào)用Java方法之后,Zygote(Native層)就進(jìn)入了Java的世界,從而開啟了Android中Java的世界。
      env->CallStaticVoidMethod(startClass, startMeth, strArray);
}
App_main.main
 AndroidRuntime.start
  startVm//創(chuàng)建虛擬機(jī)
  startReg//注冊(cè)JNI函數(shù)
  ZygoteInit.main//這里就進(jìn)入到了Java層了
    registerZygoteSocket//建立IPC的通訊機(jī)制
    preload//預(yù)加載類和資源
    startSystemServer//啟動(dòng)system_server
    runSelectLoop//等待進(jìn)程創(chuàng)建的請(qǐng)求

對(duì)應(yīng)的源碼地址: /frameworks/base/cmds/app_process/App_main.cpp (內(nèi)含AppRuntime類) /frameworks/base/core/jni/AndroidRuntime.cpp /frameworks/base/core/java/com/android/internal/os/ZygoteInit.java /frameworks/base/core/java/com/android/internal/os/Zygote.java /frameworks/base/core/java/android/net/LocalServerSocket.java

Zygote進(jìn)程的啟動(dòng)過程中,除了會(huì)創(chuàng)建一個(gè)Dalvik虛擬機(jī)實(shí)例之外,還會(huì)將Java運(yùn)行時(shí)庫加載到進(jìn)程中,以及注冊(cè)一些Android核心類的JNI方法到創(chuàng)建的Dalvik虛擬機(jī)實(shí)例中。

zygote進(jìn)程初始化時(shí)啟動(dòng)虛擬,并加載一些系統(tǒng)資源。這樣zygote fork出子進(jìn)程之后,子進(jìn)程也會(huì)繼承能正常工作的虛擬機(jī)和各種系統(tǒng)資源,剩下的只需要裝載APK文件的字節(jié)碼就可以運(yùn)行程序,。

Java應(yīng)用程序不能以本地進(jìn)程的形態(tài)運(yùn)行,必須在一個(gè)獨(dú)立的虛擬機(jī)中運(yùn)行。如果每次都重新啟動(dòng)虛擬機(jī),肯定就會(huì)拖慢應(yīng)用程序的啟動(dòng)速度。

注意:APK應(yīng)用程序進(jìn)程被zygote進(jìn)程孵化出來以后,不僅會(huì)獲得Dalvik虛擬機(jī)實(shí)例拷貝,還會(huì)與Zygote一起共享Java運(yùn)行時(shí)庫。

以上就是Android zygote啟動(dòng)流程詳解的詳細(xì)內(nèi)容,更多關(guān)于Android zygote啟動(dòng)流程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • android Handler詳細(xì)使用方法實(shí)例

    android Handler詳細(xì)使用方法實(shí)例

    本文主要介紹Android中Handler的簡(jiǎn)單使用方法,Handler跟多線程,消息隊(duì)列聯(lián)系很緊密,在平常的實(shí)際程序開發(fā)中比較常見。本文分為4個(gè)簡(jiǎn)單的例子來學(xué)校handler
    2013-11-11
  • Android 7.0應(yīng)用之間如何共享文件

    Android 7.0應(yīng)用之間如何共享文件

    這篇文章主要介紹了Android 7.0應(yīng)用之間如何共享文件,幫助大家更好的理解和使用Android進(jìn)行開發(fā),感興趣的朋友可以了解下
    2020-12-12
  • Android使用fastjson庫解析json字符串實(shí)戰(zhàn)

    Android使用fastjson庫解析json字符串實(shí)戰(zhàn)

    fastjson是一個(gè)Java語言編寫的高性能功能完善的JSON庫,它采用一種“假定有序快速匹配”的算法,把JSON?Parse的性能提升到極致,是目前Java語言中最快的JSON庫,Fastjson接口簡(jiǎn)單易用,已經(jīng)被廣泛使用在緩存序列化、協(xié)議交互、Web輸出、Android客戶端等多種應(yīng)用場(chǎng)景
    2023-11-11
  • Android編程實(shí)現(xiàn)Toast只顯示最后一條的方法

    Android編程實(shí)現(xiàn)Toast只顯示最后一條的方法

    這篇文章主要介紹了Android編程實(shí)現(xiàn)Toast只顯示最后一條的方法,結(jié)合實(shí)例形式總結(jié)了Toast只顯示最后一條的原理與具體實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-08-08
  • 使用Android Studio 開發(fā)自己的SDK教程

    使用Android Studio 開發(fā)自己的SDK教程

    很多時(shí)候我們要將自己開發(fā)一個(gè)類庫打包成jar包以供他調(diào)用,這個(gè)jar包也叫你自己的SDK或者叫l(wèi)ibrary。android studio生成jar包的方法與eclipse有所不同。在studio中l(wèi)ibrary其實(shí)是module的概念。
    2017-10-10
  • android socket聊天室功能實(shí)現(xiàn)

    android socket聊天室功能實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了android socket聊天室功能實(shí)現(xiàn)方法,不單純是聊天室,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Android自定義wheelview隨機(jī)選號(hào)效果

    Android自定義wheelview隨機(jī)選號(hào)效果

    這篇文章主要介紹了Android自定義wheelview隨機(jī)選號(hào)效果,利用wheelview實(shí)現(xiàn)滾動(dòng)隨機(jī)選擇號(hào)碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • 詳解Android性能優(yōu)化之啟動(dòng)優(yōu)化

    詳解Android性能優(yōu)化之啟動(dòng)優(yōu)化

    一款應(yīng)用的第一印象很重要,第一印象往往決定了用戶的去留。打開一款應(yīng)用,如果速度很快,很順暢,那么很容易讓人覺得這款應(yīng)用背后的技術(shù)實(shí)力很強(qiáng),用戶潛意識(shí)中會(huì)對(duì)這款應(yīng)用更加的信賴。本文將詳細(xì)介紹Android性能優(yōu)化之啟動(dòng)優(yōu)化。
    2021-06-06
  • Android編程中HTTP服務(wù)用法詳解

    Android編程中HTTP服務(wù)用法詳解

    這篇文章主要介紹了Android編程中HTTP服務(wù)用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android中http服務(wù)的具體步驟與相關(guān)使用技巧,需要的朋友可以參考下
    2016-01-01
  • Android中EditText setText方法的踩坑實(shí)戰(zhàn)

    Android中EditText setText方法的踩坑實(shí)戰(zhàn)

    這篇文章主要給大家分享了一些關(guān)于Android中EditText setText方法的踩坑記錄,文中通過示例代碼介紹的非常詳細(xì),對(duì)各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07

最新評(píng)論