編輯:關於Android編程
今天我們將深入Android的啟動流程,從用戶按下開機鍵到Android界面的過程。在谷歌上搜索“Android boot process”會得到很多很好英文文章,講解Android啟動這一過程,每個人講述的角度不一樣,通過閱讀,對於Android的理解將會更加深刻。鏈接在此,打不開的請翻牆!謝謝!
首先,貼出一張比較宏觀的流程圖,主要分為六步:
開機鍵按下,CPU上電,固化在CPU內部的ROM程序運行,加載放在某固定地址的bootloader到內存(RAM)中,然後PC指針跳過去執行bootloader。
Bootloader核心任務就是要初始化內存,把boot.img(kernel + ramdisk)從flash上copy到RAM上面,然後交出對CPU的控制權給kernel。當然,這個過程bootloader還會初始化一下LCM、串口、時鐘神馬的。
PC指針指向Kernel區,kernel要做的事情比較多:kernel剛開始會匹配一下硬件CPU和板子,後面軟件會創建內存頁表,開啟MMU(虛擬內存管理單元,負責把邏輯地址轉化為物理地址),CPU尋址就會通過MMU獲取實際物理地址。虛擬內存管理是操作系統的一個重要概念,用戶進程使用邏輯地址,它看到4G的內存空間,而且每個進程都認為自己有這麼大的空間。對於虛擬地址如何轉為物理地址,這個轉換過程有操作系統和CPU共同完成.操作系統為CPU設置好頁表。CPU通過MMU單元進行地址轉換。接下來就是常見系統第一個進程init進程!
Init 進程首先進行一系列的硬件初始化,然後通過命令行傳遞過來的參數掛載根文件系統。掛載procfs,sysfs文件系統,啟動udev創建設備驅動節點。對於Android來講,解析init.rc是進入Android世界的關鍵核心任務。
init process can be found at init : /system/core/init init.rc file can be found in source tree at /system/core/rootdir/init.rcInit.rc配置很多本地的守護進程(本地服務native service)其實就是一個個進程死循環while(1)! 這些進程擁有自己的地址空間,受到Linux process manager策略的約束,不斷地被排隊,被調度!關於進程管理這一塊可以看下書,基本模型如下(這張圖比較標准,網上很多圖大同小異!):
言歸正傳,下表就是init.rc中啟動的主要的本地服務:
Action / Service
Description
on early-init
Set init and its forked children's oom_adj.
Set the security context for the init process.
on init
setup the global environment
Create cgroup mount point for cpu accounting
and many
on fs
mount mtd partitions
on post-fs
change permissions of system directories
on post-fs-data
change permission of /data folders and sub folders
on boot
basic network init ,Memory Management ,etc
service servicemanager
start system manager to manage all native services like location, audio, shared preference etc..
service zygote
start zygote as app_process
到這個階段你會看到Android的log顯示在顯示屏上面!
第五階段是一些本地守護進程和VM虛擬機的啟動,其中重點關注兩個進程:①servicemanager②service zygote 。
Zygote是受精卵的意思,其深意就是不斷分裂Android應用進程,豐富Android的世界。Servicemanager是系統服務的管理者,這些系統服務包括硬件服務和軟件服務,一般SDK都定義好了這些服務提供的API接口,如果我們自己加上自己的系統服務也是可行的。同事servicemanager也是BINDER的管理者,binder是Android提出的進程通信的一種機制,研究起來挺復雜的,這裡我們就知道它的作用就好了。
Binder的C/S模型如上圖,任何一個環節都需要binder的通信。因為三者處於三個進程當中!
舉個例子:
Zygote啟動後會fork出嫡長子system server進程,這個進程是干什麼的呢?就是上面圖中server的角色注冊一大堆系統服務,前面說了,這些服務有硬件服務和軟件服務!client一般就是以APP的形式存在,也是有Zygotefork出來的進程。這個過程也可以從下圖中窺知一二:
這裡補充一下VM虛擬機的啟動,受精卵zygote啟動了Android Runtime,開啟了Java世界的大門,下面是Zygote總結:
Zygote是在android系統中創建java世界的盤古,它創建了第一個java虛擬機。同時,它又是女娲,它成功的繁殖了framework的核心system_server進程。主要步驟如下:
1、 創建AppRuntime對象,並調用其start函數。之後zygote的核心初始化都由AppRuntime中。
2、 調用startVm創建java虛擬機,然後調用startReg來注冊JNI函數。
3、 通過JNI調用com.android.internal.os.ZygoteInit類的main函數,從此進入了java世界。
4、 調用registerZygoteSocket創建可以響應子孫後代請求的socket。同時,zygote調用preload函數預加載了常用的類、資源等,為java世界添磚加瓦。
5、 調用startSystemServer函數分裂了一個子進程system_server來為java世界服務。
6、 Zygote完成了java世界的初創工作,便調用runSelectLoop來讓自己沉沉的睡去。之後,如果收到子孫後代的請求,它便會醒來為他們工作。
第六步主要設計注冊的的系統服務如下,另外注冊方法也可以參考如下網址:
Core Services:
1. Starting Power Manager
2. Creating Activity Manager
3. Starting Telephony Registry
4. Starting Package Manager
5. Set Activity Manager Service as System Process
6. Starting Context Manager
7. Starting System Context Providers
8. Starting Battery Service
9. Starting Alarm Manager
10. Starting Sensor Service
11. Starting Window Manager
12. Starting Bluetooth Service
13. Starting Mount Service
Other services
1. Starting Status Bar Service
2. Starting Hardware Service
3. Starting NetStat Service
4. Starting Connectivity Service
5. Starting Notification Manager
6. Starting DeviceStorageMonitor Service
7. Starting Location Manager
8. Starting Search Service
9. Starting Clipboard Service
10. Starting Checkin Service
11. Starting Wallpaper Service
12. Starting Audio Service
13. Starting HeadsetObserver
14. Starting AdbSettingsObserver
(轉載請注明出處:http://blog.csdn.net/buptgshengod) 1.背景 在android源碼中我們能看到各種以@開頭的字符,他們大
在 Android 上使用 RxNettyNetty是由JBOSS提供的一個Java開源框架,是一個支持TCP/UDP/HTTP等網絡協議的通信框架,和Mina類似,廣泛
本文實例分析了Android持久化技術之文件的讀取與寫入操作。分享給大家供大家參考,具體如下:1、文件存儲(1)在Android的持久化技術中,文件存儲是最基本的一種數據
其實一般的手機是兩個版本的,但是蘋果6S出來的時候是三個版本的,那麼昨晚發布的堅果手機有幾個版本?從手機ROM存儲角度來說,堅果手機目前有16GB和32GB