資源描述:
《Android系統(tǒng)的開機畫面顯示過程分析.pdf》由會員上傳分享,免費在線閱讀,更多相關內容在行業(yè)資料-天天文庫。
1、Android系統(tǒng)的開機畫面顯示過程分析分類:Android2012-07-0900:561252人閱讀評論(39)收藏舉報好幾個月都沒有更新過博客了,從今天開始,老羅將嘗試對Android系統(tǒng)的UI實現(xiàn)作一個系統(tǒng)的分析,也算是落實之前所作出的承諾。提到Android系統(tǒng)的UI,我們最先接觸到的便是系統(tǒng)在啟動過程中所出現(xiàn)的畫面了。Android系統(tǒng)在啟動的過程中,最多可以出現(xiàn)三個畫面,每一個畫面都用來描述一個不同的啟動階段。本文將詳細分析這三個開機畫面的顯示過程,以便可以開啟我們對Android系統(tǒng)UI實現(xiàn)的分析之路。第一
2、個開機畫面是在內核啟動的過程中出現(xiàn)的,它是一個靜態(tài)的畫面。第二個開機畫面是在init進程啟動的過程中出現(xiàn)的,它也是一個靜態(tài)的畫面。第三個開機畫面是在系統(tǒng)服務啟動的過程中出現(xiàn)的,它是一個動態(tài)的畫面。無論是哪一個畫面,它們都是在一個稱為幀緩沖區(qū)(framebuffer,簡稱fb)的硬件設備上進行渲染的。接下來,我們就分別分析這三個畫面是如何在fb上顯示的。1.第一個開機畫面的顯示過程Android系統(tǒng)的第一個開機畫面其實是Linux內核的啟動畫面。在默認情況下,這個畫面是不會出現(xiàn)的,除非我們在編譯內核的時候,啟用以下兩個編譯選
3、項:CONFIG_FRAMEBUFFER_CONSOLECONFIG_LOGO第一個編譯選項表示內核支持幀緩沖區(qū)控制臺,它對應的配置菜單項為:DeviceDrivers--->Graphicssupport--->Consoledisplaydriversupport--->FramebufferConsolesupport。第二個編譯選項表示內核在啟動的過程中,需要顯示LOGO,它對應的配置菜單項為:DeviceDrivers--->Graphicssupport--->Bootuplogo。配置Android內核編譯選
4、項可以參考在Ubuntu上下載、編譯和安裝Android最新內核源代碼(LinuxKernel)一文。幀緩沖區(qū)硬件設備在內核中有一個對應的驅動程序模塊fbmem,它實現(xiàn)在文件kernel/goldfish/drivers/video/fbmem.c中,它的初始化函數(shù)如下所示:1/**2*fbmem_init-initframebuffersubsystem3*4*Initializetheframebuffersubsystem.5*6*NOTE:Thisfunctionis_only_tobecalledbydriver
5、s/char/mem.c.7*8*/910staticint__init11fbmem_init(void)12{13proc_create("fb",0,NULL,&fb_proc_fops);1415if(register_chrdev(FB_MAJOR,"fb",&fb_fops))16printk("unabletogetmajor%dforfbdevs",FB_MAJOR);1718fb_class=class_create(THIS_MODULE,"graphics");19if(IS_ERR(fb_cla
6、ss)){20printk(KERN_WARNING"Unabletocreatefbclass;errno=%ld",PTR_ERR(fb_class));21fb_class=NULL;22}23return0;24}這個函數(shù)首先調用函數(shù)proc_create在/proc目錄下創(chuàng)建了一個fb文件,接著又調用函數(shù)register_chrdev來注冊了一個名稱為fb的字符設備,最后調用函數(shù)class_create在/sys/class目錄下創(chuàng)建了一個graphics目錄,用來描述內核的圖形系統(tǒng)。模塊fbmem除了會執(zhí)行
7、上述初始化工作之外,還會導出一個函數(shù)register_framebuffer:25EXPORT_SYMBOL(register_framebuffer);這個函數(shù)在內核的啟動過程會被調用,以便用來執(zhí)行注冊幀緩沖區(qū)硬件設備的操作,它的實現(xiàn)如下所示:26/**27*register_framebuffer-registersaframebufferdevice28*@fb_info:framebufferinfostructure29*30*Registersaframebufferdevice@fb_info.31*32*R
8、eturnsnegativeerrnoonerror,orzeroforsuccess.33*34*/3536int37register_framebuffer(structfb_info*fb_info)38{39inti;40structfb_eventevent;41......4243if(nu