編輯:關於android開發
安卓系統啟動過程其實是建立一套系統運行需要的環境。
Framework運行環境如下:
安卓系統中運行的第一個Dalvik虛擬機叫做zygote,意思是“卵”。這個“卵”還是挺有用的,因為接下來所有的Dalvik虛擬機進程都是這個“卵”孵化出來的。
zygote進程中包含兩個主要模塊,分別如下:
Socket服務端。用於接收啟動新的Dalvik進程的命令。 Framework共享類及共享資源。當zygote進程啟動後會加載一些共享的類及資源,其中共享類是在preload-classes文件中被定義的,共享資源是在preload-resources中被定義的。其他Dalvik進程是被zygote進程孵化出來的,所以這些類和資源加載後,新的Dalvik進程就可以直接使用這些類和資源就達到了共享目的。zygote進程對應的程序是app_process,該程序在system/bin目錄下。
zygote孵化出的第一個Dalvik進程是SystemServer,該進程對應的程序依然是app_process,因為該進程是從app_process中孵化出來的。
SystemServer中創建了一個Socket客戶端,之後所有的Dalvik進程都將通過該Socket客戶端間接被啟動,Ams負責管理這個客戶端。如果需要啟動新的APK進程時,Ams會通過該Socket客戶端向zygote進程的Socket服務端發送一個啟動命令,然後zygote會孵化出新的進程。
這樣的架構有兩個特點:
每一個進程都是一個Dalvik虛擬機,Dalvik虛擬機是一種類似於java虛擬機的程序。 zygote進程會預先裝載共享類和共享資源,這些類和資源其實就是SDK中定義的大部分類和資源。當通過zygote孵化出新進程後,新的APK只需要去加載APK自身包含的類和資源,這樣多個APK就可以共享Framework資源了。java程序運行時都是由一個虛擬機來解釋java字節碼,將這些字節碼翻譯成本地CPU指令碼然後執行。dalvikvm的作用就是創建一個虛擬機並執行參數中指定的java類。
dvz的作用是從zygote進程中孵化出一個新的進程,新進程其實就是一個Dalvik虛擬機。該進程與dalvikvm啟動的虛擬機相比,區別是該進程中已經預裝了Framework的大部分類和資源。
Framework在啟動時需要加載運行兩個特定java類,一個是ZygoteInit.java,一個是SystemServer.java。為了方便使用,系統才提供了一個app_process進程,該進程會自動運行這兩個類,app_process其實就是使用dalvikvm啟動ZygoteInit.java,啟動後會加載Framework中得大部分類和資源。
當Zygote服務從app_process開始啟動後,會啟動一個Dalvik虛擬機,虛擬機第一個執行的java類就是ZygoteInit.java,該類第一個重要的工作就是啟動一個Socket服務端口,該Socket端口用於接收啟動新進程的命令。
在Zygote類的main()函數中,創建完Socket服務端後還不能立即孵化出新的進程,因為這個“卵”還沒有必須的“核酸”,這個“核酸”就是指預裝的Framework大部分類及資源。
preload-resources包含兩類資源,一類是drawable資源,一類是color資源。加載這些資源是在preloadResource()函數中完成的,該函數調用preloadDrawable()和preloadColorStateLists()加載這兩類資源,原理就是把這些資源讀出來放到一個全局變量中,只要該類對象不被銷毀,這些全局變量就會一直保存。
fork是Linux系統的一個系統調用,作用就是復制當前進程產生一個新的進程。除了進程id不同,新進程將擁有和原始進程完全相同的進程信息。進程的信息包括該進程所打開的文件描述符列表、所分配的內存等。當新進程被創建後,兩個進程將共享已經分配的內存空間,如果其中一個需要向內存中寫入數據時,操作系統才復制一份目標地址空間,並將要寫的數據寫入到新的地址中。這種“僅當寫的時候才復制”的機制可以最大限度的在多個進程中共享物理內存。
去烏鎮見一下習大大和去烏鎮吃一次丁磊的豬肉,這是兩個進程,但是兩個進程中的很多任務是相同的,先訂機票,做地鐵到機場,做幾小時飛機過去。到了之後不同的就是見習大大和吃豬肉。如果可以先雇一個秘書進程讓它訂機票、做地鐵、做飛機,到烏鎮。然後秘書在復制出兩個秘書,一個去見習大大,一個去吃豬肉,好處是節省了大量內存。
Zygote進程就是本例中的“秘書進程”,那些“訂機票、做地鐵、乘飛機”就是Zygote進程中加載的preload-classes類的功能。
這樣新的進程就脫離的Zygote進程的孵化成為一個真正的應用進程。
SystemServer進程是Zygote孵化出的第一個進程,然後再配置SystemServer進程的環境。
SystemServer進程在Android運行環境中扮演了“神經中樞”的作用,APK應用中能夠直接交互的大部分系統服務都在該進程中運行,常見的有WindowManagerServer(Wms)、ActivityManagerService(Ams)、PackageManagerServer(Pms),這些系統服務都是以一個線程的方式存在於SystemServer進程中。
當以上服務線程都啟動後,其中Ams服務是systemReady()調用完成最後啟動的,在Ams的systemReady()函數的最後一段代碼則發出了啟動任務隊列中最上面一個Activity消息。
在Ams的startHomeActivityLocked()中,系統發出了一個category字段包含CATEGORY_HOME的intent,代碼如下:
intent.setComponent(mTopComponent);
if(mFactoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL){
intent.addCategory(Intent.CATEGORY_HOME);
}
只要應用聲明自己能夠響應該Intent,那麼就可以被認為是Home程序。當系統中有多個程序能夠響應該Intent時,系統會彈出一個對話框,讓用戶選擇啟動哪個程序,也允許用戶記住該選擇。
到此第一個Activity就啟動了。
Android文件下載之進度檢測,android文件下載 近期因為項目的需要,研究了一下Android文件下載進度顯示的功能實現,接下來就和大家一起分享學習一下,希望對
Android系統默認對話框添加圖片,開發工具Android Studio 今天公司UI要求軟件對話框改成加圖片的,以前沒有做過,所以就學習了一下,廢話不多說, 看效果:
android的消息機制 很多以前掌握的知識,總是慢慢的再忘記,看來還是自己理解的不夠透徹,希望用博客的形式記錄下來。 說起android的消息機制,那不得不提Handl
Accessibility輔助功能--一念天堂,一念地獄,一念天堂一念地獄0x00什麼是Accessibility(輔助功能) 考慮到部分用戶不能很好地使用Android