电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Android zygote啟動流程詳解

瀏覽:6日期:2022-09-20 09:28:38
對zygote的理解

在Android系統中,zygote是一個native進程,是所有應用進程的父進程。而zygote則是Linux系統用戶空間的第一個進程——init進程,通過fork的方式創建并啟動的。

作用

zygote進程在啟動時,會創建一個Dalvik虛擬機實例,每次孵化新的應用進程時,都會將這個Dalvik虛擬機實例復制到新的應用程序進程里面,從而使得每個應用程序進程都有一個獨立的Dalvik虛擬機實例。

zygote進程的主要作用有兩個:

啟動SystemServer。孵化應用進程。

啟動流程啟動入口

Zygote進程在init進程中,通過解析init.zygote.rc配置文件,以service(服務)的方式啟動并創建的。

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

腳本講解

// systemcorerootdirinit.zygote32.rcservice 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 進程創建一個名為 zygote 的進程,該進程要執行的程序是“/system/bin/app_process”。并且為 zygote 進程創建一個 socket 資源 (用于進程間通信,ActivityManagerService 就是通過該 socket 請求 zygote 進程 fork 一個應用程序進程)。

后面的**--zygote**是參數,表示啟動的是zygote進程。在app_process的main函數中會依據該參數決定執行ZygoteInit還是Java類。

啟動過程

zygote要執行的程序便是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參數。這個是啟動zygote進程的時候的參數 zygote = true;//進程名稱,設置為zygote niceName = ZYGOTE_NICE_NAME; } else if (strcmp(arg, '--start-system-server') == 0) {//是否有--start-system-server startSystemServer = true;.... if (zygote) {//最最重要方法。。。如果是zygote進程,則啟動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;//重點方法 創建VM虛擬機,參數是指針,可以用于獲取返回的值,可以使用env來和Java層來做交互 if (startVm(&mJavaVM, &env, zygote) != 0) { return; } onVmCreated(env); //重點方法 給虛擬機注冊一些JNI函數,(系統so庫、用戶自定義so庫 、加載函數等。) if (startReg(env) < 0) { ALOGE('Unable to register all android nativesn'); return; } //找到類的main方法,并調用。如果是zygote的話,這里就會啟動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 { //調用main方法。這里通過JNI調用Java方法之后,Zygote(Native層)就進入了Java的世界,從而開啟了Android中Java的世界。 env->CallStaticVoidMethod(startClass, startMeth, strArray);}

App_main.main AndroidRuntime.start startVm//創建虛擬機 startReg//注冊JNI函數 ZygoteInit.main//這里就進入到了Java層了 registerZygoteSocket//建立IPC的通訊機制 preload//預加載類和資源 startSystemServer//啟動system_server runSelectLoop//等待進程創建的請求

對應的源碼地址: /frameworks/base/cmds/app_process/App_main.cpp (內含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進程的啟動過程中,除了會創建一個Dalvik虛擬機實例之外,還會將Java運行時庫加載到進程中,以及注冊一些Android核心類的JNI方法到創建的Dalvik虛擬機實例中。

zygote進程初始化時啟動虛擬,并加載一些系統資源。這樣zygote fork出子進程之后,子進程也會繼承能正常工作的虛擬機和各種系統資源,剩下的只需要裝載APK文件的字節碼就可以運行程序,。

Java應用程序不能以本地進程的形態運行,必須在一個獨立的虛擬機中運行。如果每次都重新啟動虛擬機,肯定就會拖慢應用程序的啟動速度。

注意:APK應用程序進程被zygote進程孵化出來以后,不僅會獲得Dalvik虛擬機實例拷貝,還會與Zygote一起共享Java運行時庫。

以上就是Android zygote啟動流程詳解的詳細內容,更多關于Android zygote啟動流程的資料請關注好吧啦網其它相關文章!

標簽: Android
相關文章:
主站蜘蛛池模板: 国产频谱分析仪-国产网络分析仪-上海坚融实业有限公司 | 高清视频编码器,4K音视频编解码器,直播编码器,流媒体服务器,深圳海威视讯技术有限公司 | 采暖炉_取暖炉_生物质颗粒锅炉_颗粒壁炉_厂家加盟批发_烟台蓝澳采暖设备有限公司 | 运动木地板厂家_体育木地板安装_篮球木地板选购_实木运动地板价格 | RTO换向阀_VOC高温阀门_加热炉切断阀_双偏心软密封蝶阀_煤气蝶阀_提升阀-湖北霍科德阀门有限公司 | 北京律师咨询_知名专业北京律师事务所_免费法律咨询 | 航空障碍灯_高中低光强航空障碍灯_民航许可认证航空警示灯厂家-东莞市天翔航天科技有限公司 | 除湿机|工业除湿机|抽湿器|大型地下室车间仓库吊顶防爆除湿机|抽湿烘干房|新风除湿机|调温/降温除湿机|恒温恒湿机|加湿机-杭州川田电器有限公司 | 首页-瓜尔胶系列-化工单体系列-油田压裂助剂-瓜尔胶厂家-山东广浦生物科技有限公司 | 钢结构-钢结构厂房-钢结构工程[江苏海逵钢构厂] | 隐形纱窗|防护纱窗|金刚网防盗纱窗|韦柏纱窗|上海青木装潢制品有限公司|纱窗国标起草单位 | 智能门锁电机_智能门锁离合器_智能门锁电机厂家-温州劲力智能科技有限公司 | arch电源_SINPRO_开关电源_模块电源_医疗电源-东佑源 | 注塑模具_塑料模具_塑胶模具_范仕达【官网】_东莞模具设计与制造加工厂家 | 注塑机-压铸机-塑料注塑机-卧式注塑机-高速注塑机-单缸注塑机厂家-广东联升精密智能装备科技有限公司 | 地埋式垃圾站厂家【佳星环保】小区压缩垃圾中转站转运站 | 自动螺旋上料机厂家价格-斗式提升机定制-螺杆绞龙输送机-杰凯上料机 | bng防爆挠性连接管-定做金属防爆挠性管-依客思防爆科技 | 3dmax渲染-效果图渲染-影视动画渲染-北京快渲科技有限公司 | 昆山PCB加工_SMT贴片_PCB抄板_线路板焊接加工-昆山腾宸电子科技有限公司 | 危废处理系统,水泥厂DCS集散控制系统,石灰窑设备自动化控制系统-淄博正展工控设备 | 手术室净化装修-手术室净化工程公司-华锐手术室净化厂家 | 彩超机-黑白B超机-便携兽用B超机-多普勒彩超机价格「大为彩超」厂家 | 隔爆型防爆端子分线箱_防爆空气开关箱|依客思 | 电动手术床,医用护理床,led手术无影灯-曲阜明辉医疗设备有限公司 | 超声骨密度仪,双能X射线骨密度仪【起草单位】,骨密度检测仪厂家 - 品源医疗(江苏)有限公司 | 北京开业庆典策划-年会活动策划公司-舞龙舞狮团大鼓表演-北京盛乾龙狮鼓乐礼仪庆典策划公司 | 新疆散热器,新疆暖气片,新疆电锅炉,光耀暖通公司 | 校服厂家,英伦校服定做工厂,园服生产定制厂商-东莞市艾咪天使校服 | 钢板仓,大型钢板仓,钢板库,大型钢板库,粉煤灰钢板仓,螺旋钢板仓,螺旋卷板仓,骨料钢板仓 | 集菌仪_智能集菌仪_全封闭集菌仪_无菌检查集菌仪厂家-那艾 | 电车线(用于供电给电车的输电线路)-百科 | 注塑_注塑加工_注塑模具_塑胶模具_注塑加工厂家_深圳环科 | 煤矿支护网片_矿用勾花菱形网_缝管式_管缝式锚杆-邯郸市永年区志涛工矿配件有限公司 | 湖南自考_湖南自学考试| 成都思迪机电技术研究所-四川成都思迪编码器| 船老大板材_浙江船老大全屋定制_船老大官网| 小型铜米机-干式铜米机-杂线全自动铜米机-河南鑫世昌机械制造有限公司 | 皮带机_移动皮带机_大倾角皮带机_皮带机厂家 - 新乡市国盛机械设备有限公司 | 高考志愿规划师_高考规划师_高考培训师_高报师_升学规划师_高考志愿规划师培训认证机构「向阳生涯」 | 对夹式止回阀_对夹式蝶形止回阀_对夹式软密封止回阀_超薄型止回阀_不锈钢底阀-温州上炬阀门科技有限公司 |