編輯:關於Android編程
當我們拿到一台Android的智能手機,從打開開關,到我們可以使用其中的app時,這個啟動過程到底是怎麼樣的?
當給Android系統上電,CPU復位之後,程序指針會指向啟動地址,從該地址讀取啟動程序的可執行代碼直接運行,或者將可執行代碼與數據載入CPU內置的RAM中再運行。
CPU復位,其實就是在電源接通的瞬間,CPU內的寄存器和各引腳均會被置為初始狀態,並將程序指針指向引導程序的位置。<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+1eLSu7bOtPrC66Ost8XU2lBD1tCjrL3Q1/ZCSU9To6y2+NTaQW5kcm9pZLXIx7bI68q9z7XNs9bQvs290Nf2Qm9vdGxvYWRlcqGjPC9wPgo8aDI+Qm9vdGxvYWRlctL9tbyzzNDyPC9oMj4KPHA+zai5/UJvb3Rsb2FkZXLS/bW8s8zQ8qOsv8nS1LP1yry7r9OyvP7J6LG4o6y9qMGixNq05r/VvOTTs8nkzbyjrM6qstnX98+1zbPE2rrL17yxuLrDu7e+s6OszeqzydX7uPbPtc2ztcS809TYxvS2r8jOzvGhoyAgICA8L3A+CjxwPiAgICA8aW1nIHNyYz0="/uploadfile/Collfiles/20140713/20140713101809101.png" alt="\">
Bootloader是支持交互式操作的,一般刷機中會用到的Fastboot模式,就是在Bootloader啟動之後,根據用戶輸入的指令(在手機上用音量鍵,Home健等操作),停留在當前狀態。
而正常情況下,Bootloader程序執行完成之後,就會開始加載Android操作系統。
我們知道Android操作系統的內核其實就是Linux內核。當Bootlader引導程序啟動之後,就會進入Linux的內核引導階段。
引導階段會初始化內核和設備驅動,接著啟動內核,掛載文件系統,最後啟動用戶空間進程。
Init程序是用戶空間的第一個進程。它負責解析一個叫做init.rc的配置文件,啟動Android系統底層運行的一些服務進程。
init.rc文件定義了不同的Action和Service,其格式如下:
on boot ... class_start core class_start main
Action是以關鍵字on來定義的,緊接著的boot是一個觸發條件,如上面的action表明當Android啟動(boot)的時候,要做些什麼事情。
service servicemanager /system/bin/servicemanager #聲明一個service,而servicemanager則是其名字 class core #optioin, 該service屬於core類 user system $option,該service屬於System用戶 group System
Service是以關鍵字servie來定義的,緊跟著的是其名字和其啟動的文件,如上面,會執行/system/bin/serviemanager文件,並將其命名為 servicemanager。
如上,Action boot之後的class_start core等,是Init程序在開機時會啟動的服務。
這些服務包括ueventd, servicemanager, void, zygote, installd, ril-daemon等,我們一般稱它們為守護進程。
Init程序同時也會開啟屬性服務,存放一些關於Android系統的全局系統設置信息。
最後,當所有的Action和Service都啟動完成之後,Init程序就會進入一個無限的循環,監聽系統中發生的事件,對一些事件進行處理,比如重啟某些服務等。
ServiceManager是Init程序啟動的守護進程之一,它是Android中Binder通信的基礎。
ServiceManager提供了注冊,檢索服務的功能。在zygote子進程system_server(在下面)啟動的每一項服務都會將其注冊到ServiceManager中,由ServiceManager來統一進行管理。值得注意的是,ServiceManager本身也是一個Service,所以它也會將自己注冊到自身上面。
而ServiceManager啟動的過程做了三件事:
1)打開Binder設備,把Binder設備映射到內核空間中,由於內核空間是所有進程共享的區域,所以借助這塊區域,可以實現不同進程間資源的共享,從而達到進程間通信。
2)ServiceManager本身會變成一個ContextManager,即上面所說的注冊到自己身上,負責各種Service的上下文管理。
3)最終ServiceManager也是會進入一個無限循環。
Zygote也是由Init程序啟動的其中一個服務,但它卻是Android世界中的第一個Dalvik虛擬機。在之後,所有的Dalvik虛擬機都是由Zygote孵化出來的,這是因為Android中每一個應用都有著自己的進程,而每一個進程中都著一個Dalvik虛擬機,如果每起一個應用就創建一個虛擬機,效率太低,而通過復制Zygote,不僅可以提高創建的速度,還能夠共享系統和框架的資源,可以大幅度提高應用程序啟動的速度。
Zygote啟動之後
1)首先會創建一個socket,等待某個客戶端的請求。
2)接著創建其第一個子線程,叫做system_server。system_server會開啟Android系統的Native Service和Java Service。
其中Native Service就是那些利用JNI實現的共享庫,而Java Service則是通過Java語言實現的ActivitManagerService等,都是在這個階段由system_server啟動並注冊到一個叫ServiceManager的服務進程中。
ActivityManagerService啟動之後,會進入到一個叫System Ready的狀態,而在其達到System Ready的狀態之前呢,就會啟動一個叫做Launcher的應用,而這個Launcher就是Android系統啟動成功之後見到的Home桌面了。
而在SystemReady的狀態,其會跟Zygote啟動之初的Socket進行通信,告訴zygote,一切已經就緒。
3)Zygote知道已經啟動成功,就開始進入一個無限的循環,在Socket上等待請求的到來。
至此,從手機上電的那一刻起,到加載內核,到最後顯示Home桌面的整個過程就結束了,而這篇文章想介紹的也差不多了。
藍牙技術在智能硬件方面有很多用武之地,今天我就為大家分享一下藍牙在Android系統下的使用方法技巧,並實現一下兩個終端間數據的傳輸。藍牙(Bluetooth)是一種短距
一、閒話: Android原生的進度條可以根據不同的主題有不同的視覺效果,但任何一種主題下的進度條和應用程序的視覺配合起來都顯得格格不入,所以多數時候我們需要自定義Pro
小編經常遇到評論了別人的微信,查看別人的回復信息後,過一會想到如何回復朋友,但那條微信評論已經不知別刷到哪裡去了!後來發現,直接去微信消息列表中回復就可以了
Android 列表組件 ListView列表組件是開發中經常用到組件,使用該組件在使用時需要為它提供適配器,由適配器提供來確定顯示樣式和顯示數據。下面看一個例子:新建一