[Android] Android進程和線程模型

android進程模型:

在安裝Android應用程序的時候,Android會爲每一個程序分配一個Linux用戶ID,並設置相應的權限,這樣其它應用程序就不能訪問此應用程序所擁有的數據和資源了。java

在 Linux 中,一個用戶ID 識別一個給定用戶;在 Android 上,一個用戶ID 識別一個應用程序。linux

應用程序在安裝時被分配用戶 ID,應用程序在設備上的存續期間內,用戶ID 保持不變。android

 

默認狀況下,每一個apk運行在它本身的Linux進程中。當須要執行應用程序中的代碼時,Android會啓動一個jvm,即一個新的進程來執行,所以不一樣的apk運行在相互隔離的環境中。安全

下圖顯示了:兩個 Android 應用程序,各自在其本身的基本沙箱或進程上。他們是不一樣的Linux user ID。網絡

image

開發者也能夠給兩個應用程序分配相同的linux用戶id,這樣他們就能訪問對方所擁有的資源。架構

爲了保留系統資源,擁有相同用戶id的應用程序能夠運行在同一個進程中,共享同一個jvm。jvm

以下圖,顯示了兩個 Android 應用程序,運行在同一進程上。工具

不 同的應用程序能夠運行在相同的進程中。要實現這個功能,首先必須使用相同的私鑰簽署這些應用程序,而後必須使用 manifest 文件給它們分配相同的 Linux 用戶 ID,這經過用相同的值/名定義 manifest 屬性 android:sharedUserId 來作到。spa

image

Android進程知識的補充:線程

下圖是標準的Android 架構圖,

其中咱們能夠看到在「Android本地庫 & Java運行環境層」中,Android 運行時中,

Dalvik是Android中的java虛擬機,可支持同時運行多個虛擬機實例;每一個Android應用程序都在本身的進程中運行,都擁有一個獨立的Dalvik虛擬機實例;    
全部java類通過java編譯器編譯,而後經過SDK中的dx工具轉成.dex格式交由虛擬機執行。

image

Android系統進程

init進程(1號進程),父進程爲0號進程,執行根目錄底下的init可執行程序,是用戶空間進程    
——-> /system/bin/sh    
——-> /system/bin/mediaserver    
——-> zygote    
—————–> system_server    
—————–>com.android.phone    
—————–>android.process.acore(Home)    
… …

kthreadd進程(2號進程),父進程爲0號進程,是內核進程,其餘內核進程都是直接或者間接以它爲父進程

  

Android的單線程模型

當一個程序第一次啓動時,Android會同時啓動一個對應的主線程(Main Thread),主線程主要負責處理與UI相關的事件,如:用戶的按鍵事件,用戶接觸屏幕的事件以及屏幕繪圖事件,並把相關的事件分發到對應的組件進行處理。因此主線程一般又被叫作UI線程。

在開發Android 應用時必須遵照單線程模型的原則: Android UI操做並非線程安全的而且這些操做必須在UI線程中執行。

如 果在非UI線程中直接操做UI線程,會拋出 android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views,這與普通的java程序不一樣。

因爲UI線程負責事件的監聽和繪圖,所以,必須保證UI線程可以隨時響應用戶的需求,UI線程裏的操做應該向中斷事件那樣短小,費時的操做(如網絡鏈接)須要另開線程,不然,若是UI線程超過5s沒有響應用戶請求,會彈出對話框提醒用戶終止應用程序。

相關文章
相關標籤/搜索