Android—JVM-Dalvik-ART與zygote進程

APK

APK的本質是一個zip壓縮包,如果將後綴名改成.zip,就可以解壓,APK 文件與 Zip 文件最大的一個不同是 APK 包含簽名信息,用於保證安裝包安全不被修改

  • res文件夾:用於存放Android資源文件的目錄,裏面有drawable圖片資源,佈局文件等,這裏面的文件都是被編譯過的(圖片除外)
  • assets目錄:用於存放需要打包到APK中的靜態文件,文件沒有進行編譯
  • META-INF目錄:即Metadata infomation元數據(又稱中介數據、中繼數據,用於描述數據的數據)信息目錄,裏面有MANIFEST.MF:摘要文件,列出了apk的所有文件,以及這些文件內容所對應的base64-encoded SHA1 哈希值,用於驗證apk文件的完整性,判斷apk是否被篡改;
  • CERT.SF:摘要簽名文件,它列出了MANIFEST.MF這個文件中每條信息的hash值,用於驗證摘要文件是否被篡改;CERT.RSA:該文件保存瞭解密用的公鑰,以及加密算法等信息等
  • AndroidManifest.xml:Android的應用配置文件,描述了應用的總體信息,需要使用的用戶權限以及組件等等,已被編譯
  • resources.arsc:資源配置文件,用於記錄資源文件與資源id之間的映射關係,res/values中的信息大部分被編譯在此處
  • lib目錄:Android依賴的Native庫的目錄,其中會根據不同的cpu架構分爲多個子目錄
  • classes.dex:能用於dalvik執行的字節碼,由多個.class的Java字節碼文件組合而成

APK生成過程

AS用Java代碼編寫的.java文件經過JavaC編譯成.class文件再通過dex工具成.dex文件。

虛擬機

1.JVM

JVM加載機制

2.Dalvik

Dalvik作爲面向Linux、爲嵌入式操作系統設計的虛擬機,支持已轉換爲.dex 格式的Java應用程序的運行

專有的DEX可執行文件格式,體積更小,執行速度更快。每個進程對應着一個Dalvik虛擬機實例。

Dalvik早期並沒有JIT編譯器,直到Android2.2才加入了對JIT的技術支持。

在 Dalvik下,應用每次運行的時候,字節碼都需要通過即時編譯器(JIT,just in time)轉換爲機器碼,這會拖慢應用的運行效率

Dalvik與JVM主要區別是

Dalvik 是基於寄存器的架構,而 JVM是棧機。

Dalvik虛擬機加載的是.dex文件,JVM加載的是.class文件。

3.ART (Android Runtime)

Android4.4新增加的ART。

在ART 環境中,應用在安裝的時候,ART使用設備自帶的dex2oat工具來編譯應用,classes.dex文件會被工具dex2oat翻譯成本地機器指令,使其成爲真正的本地應用。這個過程叫做預編譯(AOT,ahead of time)。這樣的話,應用的啓動(首次)和執行都會變得更加快速。

相比Dalvik,ART啓動時間快,電耗低等

不過安裝時間會相對長,應用佔內存會更大。

4.zygote進程

Android系統是基於Linux內核的,而在Linux系統中,所有的進程都是init進程的子孫進程,也就是說,所有的進程都是直接或者間接地由init進程fork出來的。Zygote進程也不例外,它是在系統啓動的過程,由init進程創建的。

一個Android的App進程的創建過程,是由 init進程 -> zygote進程 -> system_server進程 -> App進程。

zygote進程是運行app_main.cpp文件。在main函數中,會創建一個AppRuntime(AppRuntime是繼承於AndroidRuntime)變量,然後調用它的start方法

start方法:

  • 創建並啓動虛擬機
  • 註冊JNI服務
  • 向Android虛擬機註冊Android native處理函數
  • java層Zygote初始化處理

初始化:

  1. 調用registerZygoteSocket()註冊套接字,用來和ActivityManagerServer通訊,接收新的Android應用程序運行請求。            創建LocalServerSocket實例(本地Socket服務端)接收生成新Android進程的信息,一個應用進程通過Binder請求SystemServer進程,SystemServer進程發送socket消息給Zygote進程。
  2. 調用preloadClasses()和preloadResource()來加載應用Framework使用的類與資源。                                                              Zygote對公共類與資源進行預加載,當應用程序啓動時只需要加載自身特有的類與資源就行了,提高了應用軟件的啓動速度。
  3. 調用startSystemServer()運行SystemServer進程,來啓動各種服務。                                                                              PackageManagerService和ActivityManagerService, 都是由SystemServer進程啓動。
  4. 調用runSelectLoopMode()來循環監聽,進入一個無限循環,socket接口等待ActivityManagerService請求創建新的進程。
  5. 每個應用都會持有一個ART實例。

SystemServer

SystemServer進程是Android系統的核心之一,大部分Android提供的服務都在該進程中,SystemServer中運行的進程公共有六十多種,介紹下重要的幾個service;

  • ActivityManagerService->ActivityManager                                                                                                  ActivityManagerService是整個Android Framework框架中最爲核心的一個服務,用戶應用程序的生命管理都是由它負責的。統籌管理着android的四大組件;統一調度各應用進程
  • PackageManagerService -> PackageManager                                                                                                                        包括對軟件包的解包,驗證,安裝以及升級等等,不能安裝.so文件的問題,應該先從這塊着手分析原因。
  • WindowManagerService -> WindowManager -> PhoneWindowManager                                                                                和ActivityManagerService高度粘合;窗口管理,這裏最核心的就是輸入事件的分發和管理。

應用啓動過程:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章