天天看點

《Android程式設計》一3.6 Android應用的運作時環境

android獨特的應用元件架構在某種程度上是android多處理并發的産物。為了使該環境能夠适應多個供應商的多種應用,信任每個供應商隻需要很少的工作,android執行dalvik vm的多個執行個體,每個任務執行一個執行個體。在3.7節及後續的章節中,我們将探讨元件生命周期如何促進android提高應用堆内的垃圾收集工作,以及如何促進多個堆之間的記憶體回收政策。

由于這種簡單而又可靠的多處理方式,android必須高效地把記憶體劃分成多個堆。每個堆相對較小,這樣記憶體可以支援多個應用同時運作。在每個堆中,由于有了元件生命周期而使得不使用的元件,尤其是目前不活躍的使用者界面元件,在堆的空間緊張時能夠執行垃圾回收,而在需要時能夠重新擷取。是以,由這種方式又引入了以資料庫為中心的資料模型,其中大部分資料都是内在持久的,關于這一點本書後面将會更加詳細地讨論,尤其是第11章。

android的多路處理利用了虛拟機的多程序和多執行個體,需要虛拟機的每個執行個體都能有效利用空間。這是通過元件生命周期來完成的,它使得對象某種程度上能夠通過虛拟機本身執行垃圾回收和重新建立。android通過dalvik虛拟機運作特地為android開發的位元組碼系統,該位元組碼系統名為dex。dex位元組碼的空間效率幾乎是java位元組碼的兩倍,對于每個程序,從根本上看,在記憶體消耗上僅為java類的一半。android系統還使用寫時複制(copy-on-write)的記憶體管理方式來實作同一個dalvik可執行檔案的多個執行個體之間的堆記憶體的共享。

當每個新的程序啟動虛拟機的一個新的執行個體時,如果每次都加載所有必要的基類,則效率會很低。由于android把每個應用放在獨立的程序中,它會利用底層linux作業系統的fork操作,通過模闆程序生成新的程序,該程序在啟動新的虛拟機執行個體時能夠達到最優狀态。該模闆程序的名字就是zygote。zygote模闆程序是dalvik虛拟機的一個執行個體,它包含一組預加載類及zygote程序的其他狀态,這些程序通過fork操作生成zygote的

副本。

android的安全在很大程度上依賴于linux作業系統層的安全機制,尤其對于程序和使用者級别的邊界限制。由于android面向的是個人裝置,即個人持有和使用的裝置,android巧妙地利用了linux内在的多使用者支援特性:為每個應用供應商建立一個單獨的使用者。這意味着每個應用以不同的使用者權限運作(除了那些來自同一個供應商的)。在預設情況下,一個應用所擁有的檔案,其他應用是無法通路的。

這就類似于在windows系統上,你以自己的使用者名運作word程式,而以同僚的使用者名運作web浏覽器。無論要切換檢視word還是web浏覽器,都需要首先退出,然後切換使用者才能檢視,而無法同時檢視。android允許一個登入的手機使用者檢視以不同的linux級别使用者運作的多個應用。

這種方式帶來的直接影響是由于每個應用在自己的“獨立運作空間(silo)”中執行,因而安全性得到了提高。

桌面作業系統通常不會如此全面地考慮應用的沙盒特征——一旦安裝了某個應用,使用者的所有資料都會信任該應用。android設計師們設想的是來自衆多供應商的很多小的應用,這些供應商并非都是完全可信的。是以,一個應用無法直接通路其他應用的資料。