日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android jni fork()子进程不运行_Android高级面试谈谈Zygote的理解

發布時間:2025/3/12 Android 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android jni fork()子进程不运行_Android高级面试谈谈Zygote的理解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Zygoto的作用

Zygoto的作用有兩個:

  • 1. 啟動SystemServer

  • 2. 孵化應用進程

SystemServer也是通過Zygoto來啟動的,因為SystemServer需要Zygoto初始化好的一些系統資源,包括常用的類、JNI函數、共享庫等等,這些資源直接從Zygoto繼承過來對啟動SystemServer是一件性能提升的事情。

Android中進程啟動的通用流程 - 啟動三段式

  • 進程啟動 -> 準備工作 -> Loop循環

Loop循環的作用是為了接收消息并處理消息。在Android中,所有的獨立進程的啟動都是符合這個啟動流程的。

Zygoto的啟動流程

Linux啟動之后,用戶空間的第一個進程是Init進程,Init進程在啟動之后會去讀取init.rc的啟動配置文件,其中定義了需要啟動的系統進程(其中包含Zygoto進程)。Init進程啟動Zygoto的方式是fork + execve的方式。

進程啟動通常有兩種方式:

  • 1. fork + handle

  • 2. fork + execve

【說明】

1. fork函數在創建進程的時候,會返回兩次,返回兩個pid,當pid = 0的時候,說明當前處于子進程,當pid不為0表示當前處于父進程中,而此時的pid為子進程的pid;

2.fork函數創建的進程繼承了父進程所有的系統資源,我們在fork出的子進程中調用execve方法加載二進制文件可以重置繼承自父進程的系統資源。

信號處理 - SIGCHLD

父進程通過fork創建的子進程,當子進程掛了之后,父進程會收到一個SIGCHLD的信號,此時我們就可以在父進程中重啟子進程。

Zygoto在創建之后做了些什么

  • 1. Zygoto在native世界

  • 2. Zygoto在Java世界

Zygoto是C++編寫的,通過main函數入口運行,Zygoto在native做了3件事情,這3件事情都是為了進入Java世界作準備:

從上圖可以看到,Zygoto啟動之后,首先啟動Android的虛擬機,然后注冊一些Android的關鍵的JNI函數,最后通過調用JNI函數進入Java世界。

上面的代碼就是Zygoto啟動之后做的事情,從上面的代碼可以看到,Zygoto首先通過JNI_CreateJavaVM創建虛擬機,在找到ZygotoInit的Java類文件,并獲取到該Java類的Main靜態函數,最后通過CallStaticVoidMethod方法調用Java類ZygotoInit的Main靜態方法。

我們在應用進程中調用JNI的時候,是不需要創建虛擬機的,即不需要調用JNI_CreateJavaVM方法,這是因為虛擬機已經在Zygoto中創建完畢,且應用進程是有Zygoto孵化的,應用進程繼承了Zygoto所有的系統資源,同樣包含虛擬機,所以在應用進程中調用JNI函數前,無需再次調用JNI_CreateJavaVM來創建虛擬機。

Zygoto在Java世界中要做的事情有3件:

  • 1. 加載資源,這是為了在后續孵化子進程的時候,可以將加載的系統資源繼承給子進程;

  • 2. 通過fork函數孵化SystemServer進程

  • 3. 啟動Loop循環,接收并處理Socket消息

Zygoto啟動Loop循環之后,會接收Socket消息,每次接收到Socket消息之后,就會調用runOnce方法處理消息:

上面的代碼是Loop中一次消息處理的過程,首先會通過readArgumentList方法讀取本次通過Socket傳遞過來的參數,然后fork啟動一個子進程,再在子進程中處理參數。

子進程是通過handleChildProc方法來處理參數,handleChildProc本質上就是調用某個Java類的main函數,執行的是哪個Java類呢,執行的Java類的名稱是通過AMS(Activity Manager Server)借助Socket發過來的,此處通過readArgumentList讀取到的。

注意的細節:

  • 1. Zygoto fork需要單進程

    Zygoto通過fork創建的子進程中只包含一個線程,而Zygoto中包含多個線程(e.g. 守護線程等等),這些多余的線程在創建完成的子線程中是不存在的,就會造成子進程中狀態的錯誤,所以在Zygoto fork新的子進程的時候,會將所有主線程以外的子線程全部暫停,fork完畢之后,再啟動所有的子線程。

  • 2. Zygoto的IPC(跨進程通宵)沒有采用Binder機制,而是使用本地的Socket服務。Zygoto進程并沒有Binder機制,所以Zygoto創建的應用進程中也沒有繼承到Binder,應用進程的Binder是應用進程啟動之后自己創建啟動的。

總結

以上是生活随笔為你收集整理的android jni fork()子进程不运行_Android高级面试谈谈Zygote的理解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久一视频 | 成年人在线观看视频免费 | 你懂的视频在线播放 | 国产亚洲色婷婷久久99精品 | 自拍欧美日韩 | 三级黄色网络 | 欧美日韩一区二区在线观看视频 | 黑花全肉高h湿play短篇 | 天天操天天插 | 日韩三级一区二区 | 欧美精品日韩少妇 | 欧美9999| 日韩性爰视频 | 日韩免费淫片 | 久久久精品人妻无码专区 | 小向美奈子在线观看 | aaa亚洲| 99re最新网址 | 美女裸体跪姿扒开屁股无内裤 | 日本h在线 | 日韩a毛片 | 韩国jizz| 欧美黑人又粗又大的性格特点 | 一级特黄肉体裸片 | 一二三四av | 少妇又色又爽又高潮极品 | 风间由美一区二区 | 久久橹 | 一区二区三区四区五区视频 | 草草影院第一页yycc.com | 韩国日本在线观看 | 亚洲国产日韩一区无码精品久久久 | 麻豆最新| 日韩h视频| 黄色字幕网 | 爱爱网站视频 | 免费国产黄 | 99色婷婷 | 亚洲AV成人无码久久精品巨臀 | 国产日韩欧美日韩大片 | 肉色超薄丝袜脚交一区二区 | 亚洲精品乱码久久久久久蜜桃91 | 亚洲不卡视频在线观看 | 亚洲精品福利在线观看 | 丝袜在线一区 | 激情导航 | 麻豆传媒网址 | 久久精品一区二区 | 亚洲精品乱码久久久久久自慰 | 亚洲乱码久久 | 黄色片中国| 亚洲视频一区二区 | av网址免费 | 999国产精品视频 | 三级网站免费看 | 夜夜爽夜夜 | 欧美午夜一区二区 | 我想看一级黄色片 | 中文字幕在线视频网站 | 亚洲色图网址 | 在线国产区 | 四虎av影院 | 久久久久夜夜夜精品国产 | 老汉色av| 成人黄色在线视频 | 亚洲观看黄色网 | 免费在线观看一区 | 久久精品国产亚洲a | 一本综合久久 | 久久国产精品免费观看 | 欧美第一色 | 青娱乐久久 | 91精品视频在线免费观看 | 非洲黑人狂躁日本妞 | 福利视频一区二区三区 | 成人精品一区日本无码网 | 91网站免费观看 | 四虎5151久久欧美毛片 | 黄色网址在线免费播放 | 一区二区三区在线播放 | 69av视频 | 日韩在线观看网站 | av黄色免费在线观看 | 99在线小视频 | 中文字幕一区二区三区门四区五区 | 日本啊啊视频 | 欧亚一区二区三区 | 日本一区视频在线播放 | 看黄色a级片 | 中文字幕在线观看视频一区二区 | www五月| 日韩欧美在线观看一区 | 亚洲国产精品人人爽夜夜爽 | 久久精品视频在线观看 | 国产一级二级毛片 | 亚洲视频欧美 | 天堂在线v | 在线观看视频福利 | 青青毛片|