色yeye在线视频观看_亚洲人亚洲精品成人网站_一级毛片免费播放_91精品一区二区中文字幕_一区二区三区日本视频_成人性生交大免费看

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > Android init進程之如何進入java世界

Android init進程之如何進入java世界 時間:2018-09-26      來源:未知

上一節我們了解了一下Android的init啟動流程,我們知道在init進程啟動的過程中,開啟 了很多服務。我們也知道Android上層的應用程序是用Java語言編寫的,Java語言編寫的 程序需要放在Java虛擬機中運行,為了提高Android App應用程序的效率,google公司提 供了經過優化之后的Dalvik虛擬機來運行上層Java語言編寫的程序。

好了,拋出兩個問題:

1、Android系統是如何從C/C++世界進入Java世界的呢?

2、Android系統是如何運行上層的APP應用程序的呢?

一、zygote進程介紹

回顧上一節我們知道init進程在啟動過程中啟動了一個叫做zygote服務。在Android 中,zygote是整個系統創建新進程的核心裝置。從字面上看,zygote是受精卵的意思,它 的主要工作就是進行細胞分裂。zygote進程內部會先啟動Dalvik虛擬機,繼而加載一些必 要的系統資源和系統類,后進入一種監聽狀態。在后續的運作中,當其他系統模塊(比 如AMS)希望創建新進程時,只需要向zygote進程發出請求,zygote進程監聽到請求后, 會相應地"分裂"出新的進程,于是這個新進程在出生之時,就先天具有了自己的Dalvik 虛擬機及系統資源。

zygote服務在init.zygote32.rc文件中描述如下:

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server

class main

socket zygote stream 660 root system

onrestart write /sys/android_power/request_state wake

onrestart write /sys/power/state on

onrestart restart media

onrestart restart netd

init進程在運行app_process時根據如下規則傳遞參數,app_process參數形式如下:

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

(1)[java-options] : 傳遞給虛擬機的選項,必須以"-"開始

(2)cmd-dir : 所要運行的進程所在的目錄

(3)start-class-name : 要在虛擬機中運行的類的名稱。app_process會將制定的類加載到 虛擬機中,而后調用類的main()方法。

(4)[options] : 要傳遞給類的選項

根據參數規則,可以知道-Xzygote是指要傳遞給VM的選項。"-Xzygote"選項用來區分要 在虛擬機中運行的類是Zygote,還是在Zygote中運行其他Android應用程序,“--zygote”表示 加載com.android.internal.os.zygoteInit類。后一個參數"--start-system-server"作為選項傳 遞給生成的類,用于啟動運行系統服務器。

好了,了解完這些以后,我們來看看zygote的詳細實現。

二、zygote服務創建過程分析

通過前面的分析,我們知道zygote對應的應用程序是/system/bin/app_process,它對應的源 代碼在framework\base\cmds\app_process\app_main.cpp文件中。

可以看到在運行app_process應用程序的時候,傳遞了"--zygote"參數,所以這里會調用到runtime.start("com.android.internal.os.ZygoteInit","args");這句話的含義是加載com.android.internal.os.ZygoteInit類運行。我們先來看 看runtime.start()函數的實現。

這段代碼主要用途如下如下:

(1)jni_invocation.Init(NULL)初始化jni接口

(2)startVM(&mJavaVM,&env)啟動Dalvik虛擬機

(3)startReg(env)注冊jni函數接口,方便Java世界與C/C++世界溝通

(4)FindClass(slashClassName)通過根據類名解析出來的路徑查找指定的類

(5)env->GetStaticMethodID()獲取指定指定類的main函數接口

(6)env->CallStaticVoidMethod()調用指定的函數接口

跋山涉水,終于構造出了Java世界(AndroidRuntime---Dalvik虛擬機),接下來我們就開始在Java世界中加載第一個類:ZygoteInit運行。

三、ZygoteInit類運行過程分析

好了,至此我們從苦逼的C/C++世界進入了高富帥的Java世界,下面我們來看看 ZygoteInit類所做的事情,它對應的源代碼 在frameworks\base\core\java\com\android\internal\os\ZygoteInit.java中。

這段代碼的主要用途如下:

(1)registerZygoteSocket(socketName),這個函數用來綁定套接字,以便接收新Android應用 程序的運行請求。Zygote使用UDS(Unix Domain Socket),為了從接 收ActivityManagerService(AMS)發來的新Android應用程序的運行請求。

(2)preload()函數實現如下:

static void preload() {

Log.d(TAG, "begin preload"); preloadClasses(); //加載

preloadResources(); preloadOpenGL(); preloadSharedLibraries();

// Ask the WebViewFactory to do any initialization that must run in the zygote process,

// for memory sharing purposes. WebViewFactory.prepareWebViewInZygote(); Log.d(TAG, "end preload");

}

可以看到zygote進程在運行的過程中加載了應用程序框架中的類、平臺資源(圖像、 XML信息、字符串等)預先加載到內存中。新進程直接使用這些類與資源,而不需要重 新加載他們,這大大加快了程序的執行速度。

------------------------------------------------------------------------------------------------------------------------

加載應用程序Framework中包含的資源 在Android應用程序Framework中使用的字符串、顏色、圖像文件、音頻文件等都被 稱為資源。應用程序不能直接訪問這些資源,需要通過Android開發工具自動生成的 R類來訪問。通過R類可訪問的資源組成信息記錄在XML中。Android資源大致可以 分為兩大類,如下:

<1>Drawable 這類資源是指畫面、照片、圖標等可在畫面中繪畫的資源。preloadResource會加載 按鈕圖片、按鈕組等基本主題圖像。Android應用程序Framework中包含CheckBox、 Button、Editbox、Call等圖像文件。

<2>XML管理的資源

XML管理的資源有保存字符串的strings.xml、保存字符串數組的arrays.xml,以及保 存顏色值得colors.xml等。此外,動畫、布局等資源也是由XML文件管理的。

------------------------------------------------------------------------------------------------------------------------

(3)startSystemServer(abiList,socketName)

創建了一個子進程,然后在子進程中加載"com.android.server.SystemServer"類運行。下面 我們接著看看,它是如何運行SystemServer類運行的。

關閉了從父進程那邊繼承過來的套接字文件描述符,然手調用了RuntimInit.zygoteInit()方法。這個方法在frameworks\base\core\java\com\android\internal\os\RuntimeInit.java文件中定義,我們來看看它的具體實現

通過Class.forName加載SystemServer類,然后通過cl.getMethod()方法獲取SystemServer類 的main方法。 在這里我們并沒有看到直接調用這個"main"方法,而是拋出了一個一個異常。通過注釋 我們可以知道,這個異常

終會被ZygtoeInit.main()函數捕獲。

我們來看看caller.run()方法的實現。

很簡單啦,調用指定的方法。我們這里就是SystemServer類的main方法。嗯,至此SystemServer這個進程就創建 成功了。創建子進程成功后,我們的父進程zygote從startSystemServer()函數返回后,會 調用runSelectLoop()方法。

從注釋中我們就可以知道,zygote進程終一直在runSelectLoop函數工作。這個函數 終就會調用到C/C++層 的select函數,探測socket文件描述附是否就緒。如果有,則說明ActivityManagerService向它發出了"啟動新應用進程" 的命令,zygote進程收到命令后,就會fork一個子進程,然后在子進程中拋出一個 MethodAndArgsCaller異常。 終會被ZygoteInit.main()函數捕獲,然后調用call.run()方法,終調用需要運行類 的main方法,這樣應用程序就跑起來啦。

好了,下面我們畫一幅圖總結一下zygote進程做的的事情:

四、SystemServer服務分析

通過前面的分析我們知道SystemServer是zygote進程孵化出來的第一個進程,它在 Android的運行環境中扮演了"神經中樞"的作用,APK應用中能夠直接交互的大部分系統 服務都在該進程中運行,常見的比如WindowManagerServer(WMS)、 ActivityManagerSystemService(AMS)、PackageManagerServer(PMS)等,這些系統服務都是 以一個線程的方式存在于SystemServer進程中。所以SystemServer關系了整個Java世界 的生死存亡,如果SystemServer進程異常退出,zygote進程知道后就會"自殺",接著init 進程重新啟動zygote進程,從而再次開啟Java世界。

下面我們簡單分析一下SystemServer的運行過程:

frameworks\base\services\java\com\android\server\SystemServer.java

從上述代碼中我們可以看到SystemServer中啟動了Java世界中所需要的服務,它分為核心 平臺服務與硬件服務

(1)核心平臺服務(Core Platform Service) 一般而言,核心平臺服務不會直接與Android應用程序進行交互,但它們是Android Framework運行所必須的服務,其包含的主要服務如下表所示:

(2)硬件服務(Hardware Service)

該服務提供了一系列的API,用戶控制底層硬件, 主要服務包含如下

五、監聽zygote socket分析

ZygoteInit的main()函數在調用完startSystemServer()之后,就會調用runSelectLoop()函數, 它的代碼如下:

frameworks\base\core\java\com\android\internal\os\ZygoteInit.java

這段代碼完成的功能如下: (1)通過selectReadable()函數探測是否有連接請求

(2)如果有則調用acceptCommandPeer()函數,提取添加請求,并且把已連接的文件描述符 添加到文件描述符集合中

(3)如果有zygote socket中有數據到達,則調用peers.get(index).runOnce()函數。

runOnce()函數的實現代碼如下: frameworks\base\core\java\com\android\internal\os\ZygoteConnection.java:

這段代碼的功能如下: (1)調用Zygote.forkAndSpecialize()函數創建子進程 (2)調用handleChildProc()函數

可以看到這個函數終調用了ZygoteInit.invokeStaticMain()函數,這個函數間接拋出特殊 的MethodAndArgsCaller異常,只不過此時拋出的異常攜帶的類名為ActivityThread。

注意:ActivityThread類在運行的時候,也標示著我們APK應用程序的運行,它就是 APK應用程序的入口哦!等等,Android APP應用程序的入口不是onCreate()方法嗎?呵呵!真正的入口是ActivityThread類, 這個類在運行的時候會間接調用到相應

類的onCreate()方法。

上一篇:如何實現Arm處理器ICache的測試

下一篇:Android.mk分析

熱點文章推薦
華清學員就業榜單
高薪學員經驗分享
熱點新聞推薦
前臺專線:010-82525158 企業培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,京ICP備16055225號-5京公海網安備11010802025203號

回到頂部

主站蜘蛛池模板: 丰满人妻被黑人中出849 | 99精产国品一二三产区区别网站 | 综合精品欧美日韩国产在线 | 国产成人一区二区三区免费 | 中文有码一区二区 | 久久视频这里只精品3国产 热RE99久久6国产精品免费 | 99精品热这里只有精品 | 程视频精品视频一区二区三区欧 | 在线国产日本 | 久久精品国产亚洲AV麻豆不卡 | 免费又黄又硬又爽大片 | 88久久精品无码一区二区毛片 | 欧美三级a做爰在线观看 | 国产精品99久久久久久动医院 | 日本成人免费在线视频 | 人善交oooooo另类毛片 | 精品久久久久久国产牛牛 | 国产一级a一级a爱片免费 | japan白嫩丰满少妇videoshd | 中年熟女被啪高潮视频 | 蜜桃亚洲| 精品一品国产午夜福利视频 | 牛和人交xxxx欧美 | 爆乳美女脱内衣18禁裸露网站 | JAPANESEXXXX乱子伦 | 国产精品久久午夜夜伦鲁鲁简爱 | 精品无人区卡一卡二卡三 | 男人的天堂免费av | 无码中文字幕色专区 | 国产欧美日韩亚洲更新 | 一本色道久久综合狠狠躁 | 短裙公车被强好爽H吃奶 | 国语高清videossex | 中文人妻av高清一区二区 | 校花高潮抽搐冒白浆视频 | 欧美黑人粗暴多交高潮水最多 | 丰满亚洲大尺度无码无码专线 | 二级成 人影片 免费观看 | 无遮高潮国产免费观看 | 免费女人18毛片a毛片视频 | 国产大BBWBBWHD视频 |