




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Android驅(qū)動(dòng)開發(fā)與移植實(shí)戰(zhàn)詳解注:因內(nèi)容過長(zhǎng)上傳受限制,本文檔只顯示部分內(nèi)容,完整版文檔請(qǐng)下載此文檔后留言謝謝。目錄\h第1章迅猛發(fā)展的Android系統(tǒng)\h1.1智能手機(jī)世界\h1.1.1何謂智能手機(jī)\h1.1.2當(dāng)前主流智能手機(jī)系統(tǒng)\h1.2Android的自身優(yōu)勢(shì)\h1.2.1開源\h1.2.2強(qiáng)大的開發(fā)團(tuán)隊(duì)支持\h1.2.3實(shí)行獎(jiǎng)勵(lì)機(jī)制\h1.3認(rèn)識(shí)驅(qū)動(dòng)\h1.4分析Android架構(gòu)\h1.4.1操作系統(tǒng)層(OS)\h1.4.2各種庫(kù)和Android運(yùn)行環(huán)境\h1.4.3應(yīng)用程序\h1.4.4應(yīng)用程序框架\h1.5開源的問題\h1.5.1霧里看花的開源\h1.5.2從選擇Java開始談為什么不開源驅(qū)動(dòng)程序\h1.5.3對(duì)驅(qū)動(dòng)開發(fā)者的影響\h第2章簡(jiǎn)要分析Linux內(nèi)核\h2.1Linux基礎(chǔ)\h2.1.1Linux歷史簡(jiǎn)介\h2.1.2主要版本\h2.1.3Linux的發(fā)展機(jī)遇\h2.2Android和Linux的關(guān)系\h2.2.1Android繼承于Linux\h2.2.2Android和Linux內(nèi)核的區(qū)別\h2.3Linux內(nèi)核簡(jiǎn)介\h2.3.1內(nèi)核的體系結(jié)構(gòu)\h2.3.2和Android相關(guān)的Linux內(nèi)核知識(shí)\h2.4分析Linux內(nèi)核源碼\h2.4.1源碼目錄結(jié)構(gòu)\h2.4.2瀏覽源碼的工具\(yùn)h2.4.3用匯編語(yǔ)言編寫內(nèi)核代碼\h2.4.4Linux內(nèi)核的顯著特性\h2.4.5學(xué)習(xí)Linux內(nèi)核的過程\h第3章開始分析Android源碼\h3.1搭建Linux開發(fā)環(huán)境和工具\(yùn)h3.1.1搭建Linux開發(fā)環(huán)境\h3.1.2設(shè)置環(huán)境變量\h3.1.3安裝編譯工具\(yùn)h3.2獲取Android源碼\h3.3分析Android源碼結(jié)構(gòu)\h3.4編譯Android源碼\h3.5運(yùn)行Android源碼\h3.6實(shí)踐演練——演示兩種編譯Android程序的方法\h3.6.1編譯NativeC的helloworld模塊\h3.6.2手工編譯C模塊\h3.7編譯AndroidKernel\h3.7.1獲取Goldfish內(nèi)核代碼\h3.7.2獲取MSM內(nèi)核代碼\h3.7.3獲取OMAP內(nèi)核代碼\h3.7.4編譯Android的Linux內(nèi)核\h3.8運(yùn)行模擬器\h3.8.1Linux環(huán)境下運(yùn)行模擬器的方法\h3.8.2模擬器輔助工具——ADB\h第4章驅(qū)動(dòng)移植\h4.1Android移植\h4.1.1移植的任務(wù)\h4.1.2移植的內(nèi)容\h4.1.3驅(qū)動(dòng)開發(fā)需要做的工作\h4.2Android對(duì)Linux的改造\h4.2.1Android的核心驅(qū)動(dòng)\h4.2.2為Android構(gòu)建Linux操作系統(tǒng)\h4.3內(nèi)核空間和用戶空間接口\h4.3.1實(shí)現(xiàn)系統(tǒng)和硬件之間的交互\h4.3.2實(shí)現(xiàn)內(nèi)核到用戶空間的數(shù)據(jù)傳輸\h4.4三類驅(qū)動(dòng)程序\h4.4.1字符設(shè)備驅(qū)動(dòng)\h4.4.2塊設(shè)備驅(qū)動(dòng)\h4.4.3網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)\h第5章深入詳解HAL層\h5.1初識(shí)HAL層\h5.1.1HAL層簡(jiǎn)介\h5.1.2比較HAL_legacy和HAL\h5.2分析HAL層源碼\h5.2.1分析HALmodule\h5.2.2分析mokoid工程\h5.3Sensor在HAL層的表現(xiàn)\h5.3.1HAL層的Sensor代碼\h5.3.2總結(jié)Sensor編程的流程\h5.4移植總結(jié)\h5.4.1移植各個(gè)Android部件的方式\h5.4.2輔助工作\h第6章常見的驅(qū)動(dòng)平臺(tái)\h6.1專用驅(qū)動(dòng)\h6.1.1Binder驅(qū)動(dòng)程序\h6.1.2Logger驅(qū)動(dòng)\h6.1.3組件Lowmemorykiller\h6.1.4TimedOutput驅(qū)動(dòng)程序\h6.1.5TimedGpio驅(qū)動(dòng)程序\h6.1.6喚醒和休眠\(yùn)h6.1.7Ashmem驅(qū)動(dòng)程序\h6.1.8Pmem驅(qū)動(dòng)程序\h6.1.9Alarm驅(qū)動(dòng)程序\h6.1.10USBGadget驅(qū)動(dòng)程序\h6.1.11AndroidParanoid驅(qū)動(dòng)程序\h6.2Goldfish設(shè)備驅(qū)動(dòng)\h6.3MSM內(nèi)核和驅(qū)動(dòng)\h6.3.1MSM基礎(chǔ)\h6.3.2移植MSM內(nèi)核\h6.3.3移植MSM\h6.3.4高通特有的組件\h6.4OMAP內(nèi)核和驅(qū)動(dòng)\h6.4.1OMAP基礎(chǔ)\h6.4.2OMAP內(nèi)核\h6.4.3移植OMAP體系結(jié)構(gòu)\h6.4.4移植Android專用驅(qū)動(dòng)和組件\h6.4.5OMAP的設(shè)備驅(qū)動(dòng)\h第7章輸入系統(tǒng)驅(qū)動(dòng)\h7.1輸入系統(tǒng)介紹\h7.1.1Android輸入系統(tǒng)結(jié)構(gòu)元素介紹\h7.1.2Android輸入系統(tǒng)驅(qū)動(dòng)\h7.1.3Input系統(tǒng)的層次結(jié)構(gòu)\h7.1.4移植工作\h7.2Input驅(qū)動(dòng)源碼分析\h7.2.1文件input.h\h7.2.2文件KeycodeLabels.h\h7.2.3文件KeyCharacterMap.h\h7.2.4Kl格式文件\h7.2.5kcm格式文件\h7.2.6文件EventHub.cpp\h7.3Input設(shè)備的運(yùn)作過程\h7.3.1Input設(shè)備的注冊(cè)(硬件驅(qū)動(dòng)層)\h7.3.2Input子系統(tǒng)的加載過程(子系統(tǒng)核心層)\h7.3.3Input子系統(tǒng)的事件處理(事件處理層)\h7.4模擬器的輸入驅(qū)動(dòng)\h7.5高通平臺(tái)的輸入驅(qū)動(dòng)實(shí)現(xiàn)\h7.5.1觸摸屏驅(qū)動(dòng)\h7.5.2按鍵和軌跡球驅(qū)動(dòng)\h7.6OMAP處理器中的輸入驅(qū)動(dòng)實(shí)現(xiàn)\h7.6.1觸摸屏驅(qū)動(dòng)程序\h7.6.2鍵盤驅(qū)動(dòng)程序\h第8章電話系統(tǒng)驅(qū)動(dòng)\h8.1電話系統(tǒng)基礎(chǔ)\h8.1.1Android電話系統(tǒng)簡(jiǎn)介\h8.1.2深入分析電話系統(tǒng)的實(shí)現(xiàn)文件\h8.1.3電話系統(tǒng)結(jié)構(gòu)\h8.2移植Modem驅(qū)動(dòng)和RIL硬件抽象層\h8.3移植和調(diào)試\h8.3.1驅(qū)動(dòng)程序\h8.3.2RIL接口\h8.4實(shí)現(xiàn)電話系統(tǒng)驅(qū)動(dòng)\h8.4.1RIL中消息隊(duì)列的建立\h8.4.2與底層Modem通信\h8.5深入分析實(shí)現(xiàn)Android電話系統(tǒng)的流程\h8.5.1初始啟動(dòng)流程\h8.5.2接收信息流程\h8.5.3等待硬件響應(yīng)\h第9章顯示系統(tǒng)驅(qū)動(dòng)\h9.1顯示系統(tǒng)基礎(chǔ)\h9.1.1Android的版本\h9.1.2不同的顯示系統(tǒng)\h9.1.3FrameBuffer驅(qū)動(dòng)的使用基礎(chǔ)\h9.2移植Android顯示系統(tǒng)\h9.2.1FrameBuffer驅(qū)動(dòng)程序\h9.2.2硬件抽象層\h9.3實(shí)現(xiàn)顯示系統(tǒng)的驅(qū)動(dòng)程序\h9.3.1Goldfish中的FrameBuffer驅(qū)動(dòng)程序\h9.3.2使用Gralloc模塊的驅(qū)動(dòng)程序\h9.4MSM中顯示驅(qū)動(dòng)的實(shí)現(xiàn)\h9.4.1MSM中的FrameBuffer驅(qū)動(dòng)程序\h9.4.2MSM中的Gralloc驅(qū)動(dòng)程序\h9.5OMAP中顯示驅(qū)動(dòng)的實(shí)現(xiàn)\h9.5.1文件omapfb-main.c\h9.5.2文件omapfb.h\h9.66416中FrameBuffer的工作原理\h第10章音頻系統(tǒng)驅(qū)動(dòng)\h10.1音頻系統(tǒng)結(jié)構(gòu)\h10.2音頻系統(tǒng)的層次\h10.2.1層次說明\h10.2.2Media庫(kù)中的Audio框架\h10.2.3本地代碼\h10.2.4JNI代碼\h10.2.5Java代碼\h10.3移植工作\h10.3.1兩個(gè)任務(wù)\h10.3.2Audio的硬件抽象層\h10.3.3實(shí)現(xiàn)AudioFlinger中的Audio硬件抽象層\h10.3.4真正實(shí)現(xiàn)Audio硬件抽象層\h10.4MSM平臺(tái)實(shí)現(xiàn)Audio驅(qū)動(dòng)系統(tǒng)\h10.4.1實(shí)現(xiàn)Audio驅(qū)動(dòng)程序\h10.4.2實(shí)現(xiàn)硬件抽象層\h10.5OSS平臺(tái)實(shí)現(xiàn)Audio驅(qū)動(dòng)系統(tǒng)\h10.5.1OSS驅(qū)動(dòng)程序介紹\h10.5.2mixer\h10.6ALSA平臺(tái)實(shí)現(xiàn)Audio系統(tǒng)\h10.6.1ALSA基礎(chǔ)\h10.6.2注冊(cè)音頻設(shè)備和音頻驅(qū)動(dòng)\h10.6.3ALSA的底層接口\h10.6.4放音流程\h10.6.5錄音流程\h10.6.6在Android中使用ALSA聲卡\h10.6.7在OMAP平臺(tái)移植Android的ALSA聲卡驅(qū)動(dòng)\h10.76410中的ALSA驅(qū)動(dòng)\h10.7.1ALSA的設(shè)備文件\h10.7.2創(chuàng)建聲卡和PCM設(shè)備\h第11章視頻輸出系統(tǒng)驅(qū)動(dòng)\h11.1視頻輸出系統(tǒng)結(jié)構(gòu)\h11.2移植的內(nèi)容\h11.3分析硬件抽象層\h11.3.1Overlay系統(tǒng)硬件抽象層的接口\h11.3.2實(shí)現(xiàn)硬件抽象層\h11.3.3實(shí)現(xiàn)接口\h11.4實(shí)現(xiàn)Overlay硬件抽象層\h11.5在OMAP平臺(tái)實(shí)現(xiàn)Overlay系統(tǒng)\h11.5.1實(shí)現(xiàn)輸出視頻驅(qū)動(dòng)程序\h11.5.2實(shí)現(xiàn)Overlay硬件抽象層\h11.6系統(tǒng)層調(diào)用Overlay模塊\h11.6.1測(cè)試文件\h11.6.2在Android系統(tǒng)中創(chuàng)建Overlay\h11.6.3管理OverlayHAL模塊\h11.7抽象層實(shí)現(xiàn)(V4l2驅(qū)動(dòng)實(shí)現(xiàn)方式)\h第12章振動(dòng)器系統(tǒng)驅(qū)動(dòng)\h12.1振動(dòng)器系統(tǒng)結(jié)構(gòu)\h12.1.1硬件抽象層\h12.1.2JNI框架部分\h12.2開始移植\h12.2.1移植振動(dòng)器驅(qū)動(dòng)程序\h12.2.2實(shí)現(xiàn)硬件抽象層\h12.3在MSM平臺(tái)實(shí)現(xiàn)振動(dòng)器驅(qū)動(dòng)\h第13章Android多媒體插件框架\h13.1Android多媒體插件\h13.2需要移植的內(nèi)容\h13.3OpenCore引擎詳解\h13.3.1OpenCore的層次結(jié)構(gòu)\h13.3.2OpenCore的代碼結(jié)構(gòu)\h13.3.3OpenCore的編譯結(jié)構(gòu)\h13.3.4OpenCoreOSCL\h13.3.5實(shí)現(xiàn)OpenCore中的OpenMax部分\h13.3.6OpenCore的擴(kuò)展\h13.4Stagefright引擎\h13.4.1代碼結(jié)構(gòu)\h13.4.2實(shí)現(xiàn)OpenMax接口\h13.4.3VideoBuffer傳輸流程\h第14章Camera照相機(jī)驅(qū)動(dòng)\h14.1Camera系統(tǒng)的結(jié)構(gòu)\h14.2移植的內(nèi)容\h14.2.1fimc驅(qū)動(dòng)模塊的加載\h14.2.2V4l2驅(qū)動(dòng)的用法\h14.3移植和調(diào)試\h14.3.1V4L2驅(qū)動(dòng)程序\h14.3.2硬件抽象層\h14.4實(shí)現(xiàn)Camera系統(tǒng)的硬件抽象層\h14.4.1Java程序部分\h14.4.2Java本地調(diào)用部分\h14.4.3本地庫(kù)libui.so\h14.4.4Camera服務(wù)libcameraservice.so\h14.5實(shí)現(xiàn)Camera系統(tǒng)\h14.5.1在MSM平臺(tái)實(shí)現(xiàn)Camera系統(tǒng)\h14.5.2OMAP平臺(tái)實(shí)現(xiàn)Camera系統(tǒng)\h14.6借助Sensor驅(qū)動(dòng)使用照相機(jī)系統(tǒng)\h第15章傳感器系統(tǒng)驅(qū)動(dòng)\h15.1傳感器系統(tǒng)的結(jié)構(gòu)\h15.2移植Sensor驅(qū)動(dòng)\h15.2.1移植驅(qū)動(dòng)程序\h15.2.2移植硬件抽象層\h15.2.3實(shí)現(xiàn)上層部分\h15.3實(shí)現(xiàn)傳感器\h第16章Wi-Fi系統(tǒng)、藍(lán)牙系統(tǒng)和GPS系統(tǒng)\h16.1Wi-Fi系統(tǒng)的應(yīng)用和移植\h16.1.1Wi-Fi系統(tǒng)的結(jié)構(gòu)\h16.1.2移植的內(nèi)容\h16.1.3移植和調(diào)試\h16.1.4OMAP平臺(tái)實(shí)現(xiàn)Wi-Fi\h16.1.5配置Wi-Fi\h16.1.6SDIO設(shè)備的移植\h16.1.7移植Wi-Fi驅(qū)動(dòng)的注意事項(xiàng)\h16.2藍(lán)牙系統(tǒng)的應(yīng)用和移植\h16.2.1藍(lán)牙結(jié)構(gòu)\h16.2.2移植的內(nèi)容\h16.2.3具體移植\h16.2.4MSM平臺(tái)的藍(lán)牙驅(qū)動(dòng)\h16.2.5本地適配器連接過程\h16.2.6遠(yuǎn)程適配器連接過程\h16.2.7分析6410的藍(lán)牙驅(qū)動(dòng)\h16.3定位系統(tǒng)\h16.3.1系統(tǒng)結(jié)構(gòu)\h16.3.2移植的內(nèi)容\h16.3.3移植和調(diào)試\h16.3.4GPS的串口驅(qū)動(dòng)和數(shù)據(jù)讀取\h第17章振動(dòng)器驅(qū)動(dòng)和警報(bào)器驅(qū)動(dòng)\h17.1Alarm系統(tǒng)基礎(chǔ)\h17.1.1Alarm系統(tǒng)的結(jié)構(gòu)\h17.1.2移植的內(nèi)容\h17.2移植和調(diào)試\h17.3實(shí)現(xiàn)Alarm驅(qū)動(dòng)\h17.4MSM平臺(tái)實(shí)現(xiàn)Alarm\h第18章光系統(tǒng)驅(qū)動(dòng)和電池系統(tǒng)驅(qū)動(dòng)\h18.1Lights光系統(tǒng)的應(yīng)用和移植\h18.1.1Lights系統(tǒng)的結(jié)構(gòu)\h18.1.2移植的內(nèi)容\h18.1.3移植和調(diào)試\h18.1.4MSM平臺(tái)實(shí)現(xiàn)光系統(tǒng)\h18.1.5深入分析Android的光系統(tǒng)\h18.2Battery電池系統(tǒng)的應(yīng)用和移植\h18.2.1Battery系統(tǒng)的結(jié)構(gòu)\h18.2.2移植的內(nèi)容\h18.2.3移植和調(diào)試\h18.2.4模擬器中實(shí)現(xiàn)電池系統(tǒng)第1章迅猛發(fā)展的Android系統(tǒng)Android(安卓)是IT巨頭谷歌公司推出的一款手機(jī)系統(tǒng),是建立在Linux內(nèi)核基礎(chǔ)之上的,能夠迅速建立手機(jī)軟件的解決方案。Android的功能十分強(qiáng)大,作為一個(gè)新興的熱點(diǎn),已經(jīng)成為了軟件行業(yè)中的一股新興力量。據(jù)市場(chǎng)數(shù)據(jù)統(tǒng)計(jì),Android系統(tǒng)已經(jīng)成為當(dāng)今市場(chǎng)占有率第一位的智能手機(jī)系統(tǒng)。本章將簡(jiǎn)單介紹Android的發(fā)展歷程和背景,讓讀者了解Android的輝煌之路。1.1智能手機(jī)世界智能手機(jī)是指具有像個(gè)人電腦那樣獨(dú)立的操作系統(tǒng),用戶可以在上面安裝自己需要的第三方軟件或游戲程序,并且可以通過移動(dòng)通信網(wǎng)絡(luò)接入無線網(wǎng)絡(luò)。在Android系統(tǒng)誕生之前已經(jīng)有很多優(yōu)秀的智能手機(jī)產(chǎn)品,例如家喻戶曉的Symbian(塞班)系列和微軟的WindowsMobile系列等。1.1.1何謂智能手機(jī)當(dāng)今公認(rèn)的智能手機(jī)必須具備下面的功能標(biāo)準(zhǔn):(1)操作系統(tǒng)必須支持新應(yīng)用的安裝;(2)高速度處理芯片;(3)支持播放式的手機(jī)電視;(4)大存儲(chǔ)芯片和存儲(chǔ)擴(kuò)展能力;(5)支持GPS導(dǎo)航。后來手機(jī)聯(lián)盟制定了一個(gè)標(biāo)準(zhǔn),在該標(biāo)準(zhǔn)中列出了智能手機(jī)的如下主要特點(diǎn):(1)具備普通手機(jī)的全部功能,例如可以進(jìn)行正常的通話和發(fā)短信等手機(jī)應(yīng)用;(2)是一個(gè)開放性的操作系統(tǒng),在系統(tǒng)平臺(tái)上可以安裝更多的應(yīng)用程序,從而實(shí)現(xiàn)功能的無限擴(kuò)充;(3)具備上網(wǎng)功能;(4)具備PDA的功能,實(shí)現(xiàn)個(gè)人信息管理、日程記事、任務(wù)安排、多媒體應(yīng)用、瀏覽網(wǎng)頁(yè);(5)可以根據(jù)個(gè)人需要擴(kuò)展機(jī)器的功能;(6)擴(kuò)展性能強(qiáng),并且可以支持很多第三方軟件。1.1.2當(dāng)前主流智能手機(jī)系統(tǒng)當(dāng)今最主流的智能手機(jī)系統(tǒng)有微軟的WindowsPhone系列、塞班系列、PDA、黑莓、蘋果的iOS和本書的主角Android。1.微軟的WindowsMobileWindowsMobile是微軟公司的一款杰出產(chǎn)品,WindowsMobile將熟悉的Windows桌面擴(kuò)展到了個(gè)人設(shè)備中。使用WindowsMobile操作系統(tǒng)的設(shè)備主要有PPC手機(jī)、PDA、隨身音樂播放器等。WindowsMobile操作系統(tǒng)有三種,分別是WindowsMobileStandard、WindowsMobileProfessional、WindowsMobileClassic。當(dāng)前的最新版本是WindowsPhone7,WindowsPhone8也即將發(fā)布。2.塞班系統(tǒng)塞班系統(tǒng)Symbian是一款久負(fù)盛名的手機(jī)系統(tǒng),最初是由諾基亞、索尼愛立信、摩托羅拉、西門子等幾家大型移動(dòng)通信設(shè)備商共同出資組建的一個(gè)合資公司,職責(zé)是專門研發(fā)手機(jī)操作系統(tǒng)。Symbian有著良好的界面,采用內(nèi)核與界面分離技術(shù),對(duì)硬件的要求比較低,支持C++、VisualBasic和J2ME。目前根據(jù)人機(jī)界面的不同,Symbian體系的UI(UserInterface,用戶界面)平臺(tái)分為Series60、Series80、Series90、UIQ等。其中Series60主要是給數(shù)字鍵盤手機(jī)用,Series80是為完整鍵盤所設(shè)計(jì),Series90則是為觸控筆方式而設(shè)計(jì)。2010年9月,諾基亞宣布將從2011年4月起從Symbian基金會(huì)(SymbianFoundation)手中收回Symbian操作系統(tǒng)控制權(quán)。3.PalmPalm是流行的個(gè)人數(shù)字助理(PDA,又稱掌上電腦)的傳統(tǒng)名字。從廣義上講,Palm是PDA的一種,是Palm公司發(fā)明的。而從狹義上講,Palm是Palm公司生產(chǎn)的PDA產(chǎn)品,區(qū)別于SONY公司的Clie和Handspring公司的Visor/Treo等其他運(yùn)行Palm操作系統(tǒng)的PDA產(chǎn)品。其顯著特點(diǎn)之一是寫入裝置輸入數(shù)據(jù)的方法,能夠點(diǎn)擊顯示器上的圖標(biāo)選擇輸入的項(xiàng)目。2009年2月11日,Palm公司CEOEdColligan宣布以后將專注于WebOS和WindowsMobile的智能設(shè)備,而將不會(huì)再有基于“PalmOS”的智能設(shè)備推出,除了PalmCentro會(huì)在以后和其他運(yùn)營(yíng)商合作時(shí)繼續(xù)推出。4.黑莓BlackBerryBlackBerry是加拿大RIM公司推出的一種移動(dòng)電子郵件系統(tǒng)終端,其特色是支持推動(dòng)式電子郵件、手提電話、文字短信、互聯(lián)網(wǎng)傳真、網(wǎng)頁(yè)瀏覽及其他無線資訊服務(wù),其最大優(yōu)勢(shì)在于收發(fā)郵件。5.iOSiOS是蘋果手機(jī)產(chǎn)品iPhone的操作系統(tǒng),iPhone是一款手機(jī)產(chǎn)品,由蘋果公司在2007年1月9日舉行的Macworld宣布推出,并在2007年6月29日在美國(guó)上市。IPhone實(shí)現(xiàn)了將創(chuàng)新的移動(dòng)電話、可觸摸寬屏iPod以及具有桌面級(jí)電子郵件、網(wǎng)頁(yè)瀏覽、搜索和地圖功能的突破性因特網(wǎng)通信設(shè)備這三種產(chǎn)品完美地融為一體。每一件iPhone產(chǎn)品都是一件藝術(shù)品,無論是外觀還是品質(zhì)和性能,都擁有超高的人氣。推出的每一款新iPhone,都馬上成為市面智能手機(jī)的標(biāo)桿。在2011年10月4日推出了當(dāng)前最新的iPhone4S。6.AndroidAndroid是本書的主角,是一款基于Linux內(nèi)核的開源手機(jī)操作系統(tǒng)的名稱,該平臺(tái)由操作系統(tǒng)、中間件、用戶界面和應(yīng)用軟件組成,號(hào)稱是首個(gè)為移動(dòng)終端打造的真正開放和完整的移動(dòng)軟件。1.2Android的自身優(yōu)勢(shì)Android采用了WebKit瀏覽器引擎,具備觸摸屏、高級(jí)圖形顯示和上網(wǎng)功能,用戶能夠在手機(jī)上查看電子郵件、搜索網(wǎng)址和觀看視頻節(jié)目等,同時(shí)Android還具有比iPhone等其他手機(jī)更強(qiáng)的搜索功能,可以說是一種融入全部Web應(yīng)用的平臺(tái)。正是因?yàn)槠涮赜械木薮髢?yōu)勢(shì),在2010年下半年,Android規(guī)模便超越了蘋果iPhone,大有一統(tǒng)手機(jī)系統(tǒng)之勢(shì)!并且終于在2011年超越了塞班,成為市場(chǎng)占有率最高的智能手機(jī)系統(tǒng)。1.2.1開源Android出身于Linux世家,是一款開源的手機(jī)操作系統(tǒng)。Android功成名就之后,各大手機(jī)聯(lián)盟紛紛加入,這個(gè)聯(lián)盟由包括中國(guó)移動(dòng)、摩托羅拉、高通、宏達(dá)電子和T-Mobile在內(nèi)的30多家技術(shù)和無線應(yīng)用的領(lǐng)軍企業(yè)組成。通過與運(yùn)營(yíng)商、設(shè)備制造商、開發(fā)商和其他有關(guān)各方結(jié)成深層次的合作伙伴關(guān)系,希望借助建立標(biāo)準(zhǔn)化、開放式的移動(dòng)電話軟件平臺(tái),在移動(dòng)產(chǎn)業(yè)內(nèi)形成一個(gè)開放式的生態(tài)系統(tǒng)。1.2.2強(qiáng)大的開發(fā)團(tuán)隊(duì)支持Android的研發(fā)隊(duì)伍陣容強(qiáng)大,包括摩托羅拉、Google、HTC(宏達(dá)電子)、PHILIPS、T-Mobile、高通、魅族、三星、LG以及中國(guó)移動(dòng)在內(nèi)的34家企業(yè)。它們都將基于該平臺(tái)開發(fā)手機(jī)的新型業(yè)務(wù),應(yīng)用之間的通用性和互聯(lián)性將在最大程度上得到保持。并且還成立了手機(jī)開放聯(lián)盟,聯(lián)盟中的成員由手機(jī)制造商、半導(dǎo)體公司和軟件公司組成,具體名單如下。1.手機(jī)制造商臺(tái)灣宏達(dá)國(guó)際電子(HTC)(Palm等多款智能手機(jī)的代工廠),摩托羅拉(美國(guó)最大的手機(jī)制造商),韓國(guó)三星電子(僅次于諾基亞的全球第二大手機(jī)制造商),韓國(guó)LG電子,中國(guó)移動(dòng)(全球最大的移動(dòng)運(yùn)營(yíng)商),日本KDDI(2900萬用戶),日本NTTDoCoMo(5200萬用戶),美國(guó)SprintNextel(美國(guó)第三大移動(dòng)運(yùn)營(yíng)商,5400萬用戶),意大利電信(TelecomItalia,意大利主要的移動(dòng)運(yùn)營(yíng)商,3400萬用戶),西班牙Telefónica(在歐洲和拉美有1.5億用戶),T-Mobile(德意志電信旗下公司,在美國(guó)和歐洲有1.1億用戶)。2.半導(dǎo)體公司AudienceCorp(聲音處理器公司),BroadcomCorp(無線半導(dǎo)體主要提供商),英特爾(Intel),MarvellTechnologyGroup,Nvidia(圖形處理器公司),SiRF(GPS技術(shù)提供商),Synaptics(手機(jī)用戶界面技術(shù)),德州儀器(TexasInstruments),高通(Qualcomm),惠普HP(Hewlett-PackardDevelopmentCompany,L.P)。3.軟件公司Aplix,Ascender,eBay的Skype,Esmertec,LivingImage,NMSCommunications,NoserEngineeringAG,NuanceCommunications,PacketVideo,SkyPop,SonixNetwork,TAT-TheAstonishingTribe,WindRiverSystems。1.2.3實(shí)行獎(jiǎng)勵(lì)機(jī)制安卓(Android)為了提高程序員的開發(fā)積極性,不但為其提供了一流硬件的設(shè)置,還提供了一流的軟件服務(wù)。并且采取了振奮人心的獎(jiǎng)勵(lì)機(jī)制,定期召開比賽,創(chuàng)意和應(yīng)用奪魁者將會(huì)得到重獎(jiǎng)。1.開發(fā)Android平臺(tái)的應(yīng)用在Android平臺(tái)上,程序員可以開發(fā)出各式各樣的應(yīng)用。其中Android應(yīng)用項(xiàng)目是通過Java語(yǔ)言開發(fā)的,只要具備Java開發(fā)基礎(chǔ),就能很快地上手并掌握。作為單獨(dú)的Android開發(fā),Java編程門檻并不高,即使沒有編程經(jīng)驗(yàn)的門外漢,也可以在突擊學(xué)習(xí)Java之后而學(xué)會(huì)Android。另外,Android完全支持2D、3D和數(shù)據(jù)庫(kù),并且和瀏覽器實(shí)現(xiàn)了集成。所以通過Android平臺(tái),程序員可以迅速、高效地開發(fā)出絢麗多彩的應(yīng)用,例如常見的工具、管理、互聯(lián)網(wǎng)和游戲等。2.獎(jiǎng)金豐厚的Android大賽為了吸引更多的用戶使用Android開發(fā),已經(jīng)成功舉辦了獎(jiǎng)金為1000萬美元的開發(fā)者競(jìng)賽。鼓勵(lì)開發(fā)人員創(chuàng)建出有創(chuàng)意的實(shí)用軟件。這種大賽對(duì)于開發(fā)人員來說,不但能練習(xí)自己的開發(fā)水平,并且有機(jī)會(huì)獲得高額的獎(jiǎng)金。3.在AndroidMarket上獲取收益AndroidMarket地址是http://www.A/market/。為了能讓Android平臺(tái)吸引更多的關(guān)注,谷歌開發(fā)了自己的Android軟件下載店AndroidMarket,允許開發(fā)人員將應(yīng)用程序在上面發(fā)布,也允許Android用戶隨意下載獲取自己喜歡的程序。開發(fā)者需要申請(qǐng)開發(fā)者賬號(hào),有賬號(hào)后才能將自己開發(fā)的作品上傳到AndroidMarket,并且可以對(duì)自己的軟件進(jìn)行定價(jià)。只要開發(fā)的軟件作品足夠吸引人,就可以獲得好的金錢回報(bào)。1.3認(rèn)識(shí)驅(qū)動(dòng)驅(qū)動(dòng)是硬件和軟件之間的媒介和載體,是計(jì)算機(jī)等電子產(chǎn)品運(yùn)行的根本。生活中總會(huì)遇到這樣的場(chǎng)景:買了一個(gè)新USB鼠標(biāo),插在電腦上后會(huì)提示安裝新的驅(qū)動(dòng);買了一臺(tái)新的打印機(jī),也需要安裝驅(qū)動(dòng)后才能使用。驅(qū)動(dòng)含有推動(dòng)和發(fā)動(dòng)之意,計(jì)算機(jī)領(lǐng)域中的驅(qū)動(dòng)也含有推動(dòng)之意。當(dāng)我們?cè)陔娔X中安裝新硬件時(shí),總會(huì)被要求放入“這種硬件的驅(qū)動(dòng)程序”。其實(shí)在Windows系統(tǒng)中,在安裝主板、光驅(qū)、顯卡、聲卡這些硬件產(chǎn)品時(shí)都對(duì)應(yīng)著一套完整的驅(qū)動(dòng)程序。如果需要外接別的硬件設(shè)備,也還需要安裝相應(yīng)的驅(qū)動(dòng)程序,例如外接游戲硬件要安裝手柄、方向盤、搖桿、跳舞毯等的驅(qū)動(dòng)程序,外接打印機(jī)要安裝打印機(jī)驅(qū)動(dòng)程序,上網(wǎng)或接入局域網(wǎng)要安裝網(wǎng)卡、Modem甚至ISDN、ADSL的驅(qū)動(dòng)程序。和Windows系統(tǒng)一樣,在Android手機(jī)中也經(jīng)常需要使用一些外部硬件設(shè)備,例如藍(lán)牙耳機(jī)、存儲(chǔ)卡和攝像頭。要想使用這些外部輔助設(shè)備,也需要安裝對(duì)應(yīng)的驅(qū)動(dòng)程序。驅(qū)動(dòng)程序是添加到操作系統(tǒng)中的一段代碼,通常這段代碼比較簡(jiǎn)短,但是在里面包含了和硬件相關(guān)的設(shè)備信息。有了這些信息,計(jì)算機(jī)就可以與設(shè)備進(jìn)行通信,從而使用這些硬件。驅(qū)動(dòng)程序是硬件廠商根據(jù)操作系統(tǒng)編寫的配置文件,可以說沒有驅(qū)動(dòng)程序,計(jì)算機(jī)中的硬件就無法工作。操作系統(tǒng)不同,對(duì)應(yīng)的硬件驅(qū)動(dòng)程序也不同。硬件廠商為了保證硬件的兼容性及增強(qiáng)硬件的功能,會(huì)不斷更新、升級(jí)驅(qū)動(dòng)程序,例如顯卡芯片公司Nvidia平均每個(gè)月會(huì)升級(jí)驅(qū)動(dòng)程序2到3次。驅(qū)動(dòng)程序是硬件的一個(gè)構(gòu)成部分,當(dāng)我們安裝新的硬件時(shí),也必須安裝對(duì)應(yīng)的驅(qū)動(dòng)程序。凡是安裝一個(gè)原本不屬于我們電腦中或手機(jī)中的硬件設(shè)備時(shí),系統(tǒng)就會(huì)要求你安裝驅(qū)動(dòng)程序,將新的硬件與電腦或手機(jī)系統(tǒng)連接起來。驅(qū)動(dòng)程序在此扮演了一個(gè)溝通的角色,負(fù)責(zé)把硬件的功能告訴電腦系統(tǒng),并且也將系統(tǒng)的指令傳達(dá)給硬件,讓它開始工作。手機(jī)中的驅(qū)動(dòng)和電腦中的驅(qū)動(dòng)一樣,當(dāng)在手機(jī)中使用數(shù)據(jù)線、藍(lán)牙、紅外等連接方式連接電腦時(shí),在一般情況下需要驅(qū)動(dòng)程序。而且在一部分手機(jī)中,通過數(shù)據(jù)線、藍(lán)牙、紅外方式連接電腦后還需要軟件才能傳輸數(shù)據(jù)到電腦,或者傳輸數(shù)據(jù)到手機(jī)。此時(shí)可以使用購(gòu)買手機(jī)時(shí)的隨機(jī)光盤中的驅(qū)動(dòng)程序解決問題,驅(qū)動(dòng)程序也可以在手機(jī)網(wǎng)站或論壇上下載。1.4分析Android架構(gòu)Android作為一個(gè)移動(dòng)設(shè)備的平臺(tái),其軟件層次結(jié)構(gòu)包括操作系統(tǒng)(OS)、中間件(MiddleWare)和應(yīng)用程序(Application)。根據(jù)Android的軟件框圖,其軟件層次結(jié)構(gòu)自下而上分為以下4層。(1)操作系統(tǒng)層(OS)。(2)各種庫(kù)(Library)和Android運(yùn)行環(huán)境(RunTime)。(3)應(yīng)用程序框架(ApplicationFramework)。(4)應(yīng)用程序(Application)。上述各個(gè)層的具體結(jié)構(gòu)如圖1-1所示。▲圖1-1Android操作系統(tǒng)的組件結(jié)構(gòu)圖1.4.1操作系統(tǒng)層(OS)Android使用Linux2.6作為操作系統(tǒng),Linux2.6是一種標(biāo)準(zhǔn)的技術(shù),Linux也是一個(gè)開放的操作系統(tǒng)。Android對(duì)操作系統(tǒng)的使用包括核心和驅(qū)動(dòng)程序兩部分,Android的Linux核心為標(biāo)準(zhǔn)的Linux2.6內(nèi)核,Android更多的是需要一些與移動(dòng)設(shè)備相關(guān)的驅(qū)動(dòng)程序。主要的驅(qū)動(dòng)如下所示?!耧@示驅(qū)動(dòng)(DisplayDriver):常用基于Linux的幀緩沖(FrameBuffer)驅(qū)動(dòng)。●Flash內(nèi)存驅(qū)動(dòng)(FlashMemoryDriver):是基于MTD的Flash驅(qū)動(dòng)程序。●照相機(jī)驅(qū)動(dòng)(CameraDriver):常用基于Linux的v4l(VideoforLinux)驅(qū)動(dòng)?!褚纛l驅(qū)動(dòng)(AudioDriver):常用基于ALSA(AdvancedLinuxSoundArchitecture,高級(jí)Linux聲音體系)驅(qū)動(dòng)?!馱iFi驅(qū)動(dòng)(CameraDriver):基于IEEE801.31標(biāo)準(zhǔn)的驅(qū)動(dòng)程序?!矜I盤驅(qū)動(dòng)(KeyBoardDriver):作為輸入設(shè)備的鍵盤驅(qū)動(dòng)?!袼{(lán)牙驅(qū)動(dòng)(BluetoothDriver):基于IEEE801.35.1標(biāo)準(zhǔn)的無線傳輸技術(shù)?!馚inderIPC驅(qū)動(dòng):Android一個(gè)特殊的驅(qū)動(dòng)程序,具有單獨(dú)的設(shè)備節(jié)點(diǎn),提供進(jìn)程間通信的功能?!馪owerManagement(能源管理):管理電池電量等信息。1.4.2各種庫(kù)和Android運(yùn)行環(huán)境本層次對(duì)應(yīng)一般嵌入式系統(tǒng),相當(dāng)于中間件層次。Android的本層次分成兩個(gè)部分,一個(gè)是各種庫(kù)(Library),另一個(gè)是Android運(yùn)行環(huán)境(RunTime)。本層的內(nèi)容大多是使用C++實(shí)現(xiàn)的。其中包含的各種庫(kù)如下?!馛庫(kù):C語(yǔ)言的標(biāo)準(zhǔn)庫(kù),也是系統(tǒng)中一個(gè)最為底層的庫(kù),C庫(kù)是通過Linux的系統(tǒng)調(diào)用來實(shí)現(xiàn)的?!穸嗝襟w框架(MediaFramework):這部分內(nèi)容是Android多媒體的核心部分,基于PacketVideo(即PV)的OpenCORE,從功能上本庫(kù)一共分為兩大部分,一部分是音頻、視頻的回放(PlayBack),另一部分則是音視頻的紀(jì)錄(Recorder)?!馭GL:2D圖像引擎。●SSL:即SecureSocketLayer,位于TCP/IP協(xié)議與各種應(yīng)用層協(xié)議之間,為數(shù)據(jù)通信提供安全支持?!馩penGLES1.0:提供了對(duì)3D的支持?!窠缑婀芾砉ぞ撸⊿urfaceManagement):提供了對(duì)管理顯示子系統(tǒng)等功能?!馭QLite:一個(gè)通用的嵌入式數(shù)據(jù)庫(kù)?!馱ebKit:網(wǎng)絡(luò)瀏覽器的核心?!馞reeType:位圖和矢量字體的功能。Android的各種庫(kù)一般是以系統(tǒng)中間件的形式提供的,它們均有的一個(gè)顯著特點(diǎn)就是與移動(dòng)設(shè)備的平臺(tái)的應(yīng)用密切相關(guān)。Android運(yùn)行環(huán)境主要是指虛擬機(jī)技術(shù)——Dalvik。Dalvik虛擬機(jī)和一般JAVA虛擬機(jī)(JavaVM)不同,它執(zhí)行的不是JAVA標(biāo)準(zhǔn)的字節(jié)碼(Bytecode),而是Dalvik可執(zhí)行格式(.dex)中執(zhí)行文件。在執(zhí)行的過程中,每一個(gè)應(yīng)用程序即一個(gè)進(jìn)程(Linux的一個(gè)Process)。二者最大的區(qū)別在于JavaVM是基于棧的虛擬機(jī)(Stack-based),而Dalvik是基于寄存器的虛擬機(jī)(Register-based)。顯然,后者最大的好處在于可以根據(jù)硬件實(shí)現(xiàn)更大的優(yōu)化,這更適合移動(dòng)設(shè)備的特點(diǎn)。1.4.3應(yīng)用程序Android的應(yīng)用程序(Application)主要是用戶界面(UserInterface)方面的,通常以Java程序編寫,其中還可以包含各種資源文件(放置在res目錄中)。Java程序及相關(guān)資源經(jīng)過編譯后,將生成一個(gè)APK包。Android本身提供了主屏幕(Home)、聯(lián)系人(Contact)、電話(Phone)、瀏覽器(Brower)等眾多的核心應(yīng)用。同時(shí)應(yīng)用程序的開發(fā)者還可以使用應(yīng)用程序框架層的API實(shí)現(xiàn)自己的程序。這也是Android開源的巨大潛力的體現(xiàn)。1.4.4應(yīng)用程序框架Android的應(yīng)用程序框架(ApplicationFramework)為應(yīng)用程序?qū)拥拈_發(fā)者提供API,它實(shí)際上是一個(gè)應(yīng)用程序的框架。由于上層的應(yīng)用程序是以Java構(gòu)建的,因此本層次提供的首先包含了UI程序中所需要的各種控件,例如View(視圖組件),其中又包括了List(列表)、Grid(柵格)、TextBox(文本框)、Button(按鈕)等,甚至一個(gè)嵌入式的Web瀏覽器。一個(gè)基本的Andoid應(yīng)用程序,可以使用應(yīng)用程序框架中的如下部分?!馎ctivity(活動(dòng))?!馚roadcastIntentReceiver(廣播意圖接收者)。●Service(服務(wù))?!馛ontentProvider(內(nèi)容提供者)?!馡ntentandIntentFilter(意圖和意圖過濾器)。1.5開源的問題我們都知道Android是基于Linux內(nèi)核的,因?yàn)橐恢币詠鞮inux是開源的,所以基于Linux內(nèi)核的Android也號(hào)稱開源,所以一經(jīng)推出后就受到了廣大程序員和手機(jī)廠商的青睞。但是在開源方面Android“半遮半掩”,具體原因得從Android的發(fā)展歷史談起。1.5.1霧里看花的開源在Android剛被推出的時(shí)候,只能用Java語(yǔ)言開發(fā)應(yīng)用程序,這就需要所有的應(yīng)用程序都運(yùn)行在一個(gè)巨大的虛擬機(jī)上。在2009年6月,Android發(fā)布了NDK工具包,這樣就可以支持C/C++語(yǔ)言編程,但是性能不如SKD工具包中的Java語(yǔ)言。2010年2月,LinuxKernel的維護(hù)者GregKroah-Hartman宣布,將Android代碼從LinuxKernel代碼庫(kù)中刪除,此事對(duì)于普通用戶可能并沒有什么影響,但對(duì)于開發(fā)者,尤其是開源社區(qū)的開發(fā)者來說,算是一顆重磅炸彈。消息公布以后,外界普遍覺得驚訝和可惜。好不容易,才有了一個(gè)這么受歡迎的開源手機(jī)系統(tǒng),應(yīng)該齊心協(xié)力共同開發(fā)才對(duì),為什么要“窩里斗”呢?到底是什么矛盾,使得LinuxKernel小組剔除Android代碼呢?從Linux2.6.33版本開始,Google智能手機(jī)操作系統(tǒng)Android核心代碼全部被刪除。這是因?yàn)樘岢_源的Android在Linux面前使用了霧里看花的把戲,它修改了Kernel內(nèi)核,但是又不提供修改的細(xì)節(jié),這相當(dāng)于自己搞了一個(gè)封閉的系統(tǒng)。盡管Android取得了空前的成功,但是Google也放棄了構(gòu)建一個(gè)真正開源的手機(jī)系統(tǒng)的機(jī)會(huì),從而也就不能獲得由全世界程序員提供智慧、分享代碼和推動(dòng)創(chuàng)新的好處。由此可見,是因?yàn)锳ndroid的不真正開源,所以才被從Linux體系中刪除。Android與Ubuntu、Debian、Redhat等傳統(tǒng)的Linux發(fā)行版相比,只有系統(tǒng)的底層結(jié)構(gòu)是一樣的,而其他東西在Android中都不一樣,尤其是程序員的編程接口是完全不同的。所以必須重新寫Android應(yīng)用程序后才能使用,現(xiàn)存的Linux程序無法移植上去。由此可見,Android是一種全新的系統(tǒng),它與Linux的距離有很遠(yuǎn)。1.5.2從選擇Java開始談為什么不開源驅(qū)動(dòng)程序(1)使用Java的好處。Android很好地解決了長(zhǎng)期令手機(jī)制造商頭痛不已的問題:在業(yè)界缺乏一個(gè)開源的Java虛擬機(jī)和統(tǒng)一的應(yīng)用程序接口。使用Android后,程序員只要編寫一次程序就可以用在各種手機(jī)硬件平臺(tái)之上。這就是Android應(yīng)用程序使用Java語(yǔ)言開發(fā)的原因,因?yàn)槿绻贿@樣做的話,無法讓程序?qū)崿F(xiàn)和硬件無關(guān)。可能很多熟知Linux的讀者會(huì)反問:傳統(tǒng)的Linux系統(tǒng)也不依賴特定的硬件,只要把源代碼根據(jù)不同的平臺(tái)分別編譯,同一個(gè)程序就可以在不同的硬件架構(gòu)、不同的Linux發(fā)行版中使用。那么Android只采用Kernel、只允許用Java編程的真正原因到底是什么呢?(2)為什么驅(qū)動(dòng)不開源。LinuxKernel的版權(quán)是GPL。在此版本下,硬件廠商都希望自己的硬件能在LinuxKernel下運(yùn)行,此時(shí)就必須使用驅(qū)動(dòng)程序。但是如果把驅(qū)動(dòng)程序的源碼公開,就等于公開硬件規(guī)格,這是廣大硬件廠商所不能接受的。所以硬件廠商只提供編好的驅(qū)動(dòng)程序,而不提供原始碼。Android的重點(diǎn)是商業(yè)應(yīng)用,為了解決上述驅(qū)動(dòng)開源的問題,Google采用了自己的方法來繞過這個(gè)問題。Google把驅(qū)動(dòng)程序移到“userspace”中,即讓驅(qū)動(dòng)程序在LinuxKernel上面運(yùn)行,而不是一起運(yùn)行,這樣就可以避過GPL規(guī)則。然后在Kernel開一個(gè)小門,讓本來不能直接控制到硬件的“userspace”程序也可以碰得到,此時(shí)只需公布這個(gè)開的“小門”程序源碼即可。由此可見,Google在Kernel和應(yīng)用程序之間設(shè)計(jì)了一個(gè)中間層,這樣既不違反GPL許可,又能不讓外界看到廠商的硬件驅(qū)動(dòng)和應(yīng)用程序的源碼。(3)帶來的問題。但是Google的上述做法隨之帶來了一個(gè)問題,Kernel和Android采取不同的許可證,Kernel采用GPL許可證,而Android采用ApacheSoftwareLicense(簡(jiǎn)稱ASL)許可證。在GPL許可證中規(guī)定,對(duì)源碼的任何修改都必須開源,所以Android需要開源,因?yàn)樗薷牧薑ernel。而在ASL許可證中規(guī)定,用戶可以隨意使用源碼而不必開源,所以建立在Android之上的硬件驅(qū)動(dòng)和應(yīng)用程序都可以保持封閉。這種封閉得到了更多硬件廠商的支持,Google特意修改了Kernel,使得原本應(yīng)該包括在Kernel中的某些功能都被轉(zhuǎn)移到了“userspace”中,所以就避開了開源。(4)影響。Google的上述行為有利于推廣Android,并且可以吸引更多廠商和軟件開發(fā)商的加入,但是同時(shí)也宣布放棄了構(gòu)建一個(gè)真正開源的手機(jī)系統(tǒng)的機(jī)會(huì)。所有為Android寫的硬件驅(qū)動(dòng)都不能合并到Kernel中,因?yàn)樗鼈冎辉贕oogle的代碼里才有效,而在Kernel里根本沒法用。1.5.3對(duì)驅(qū)動(dòng)開發(fā)者的影響所有為Android寫的硬件驅(qū)動(dòng)都不能合并到Kernel中。這些驅(qū)動(dòng)程序只能在Google代碼中有效,而在Kernel中根本沒法用。正是因?yàn)檫@個(gè)原因,Google從不把大量的硬件驅(qū)動(dòng)程序和平臺(tái)源碼提交給Kernel。既然硬件廠商都不開源驅(qū)動(dòng)代碼,對(duì)于我們生存在Android底層的開發(fā)人員,特別是從事驅(qū)動(dòng)開發(fā)的成員來說,就帶來了巨大的就業(yè)機(jī)會(huì)。我們可以為硬件廠商開發(fā)不開源的驅(qū)動(dòng)程序而獲得報(bào)酬,為此隨著Android的異?;鸨忻嫔嫌泻芏嗥髽I(yè)在招聘Android驅(qū)動(dòng)開發(fā)人員。由此可見,驅(qū)動(dòng)的不開源給我們的學(xué)習(xí)帶來了難題,但同樣也為以后的就業(yè)機(jī)會(huì)增加了砝碼。第2章簡(jiǎn)要分析Linux內(nèi)核Android系統(tǒng)是基于Linux內(nèi)核的,所以在學(xué)習(xí)Android底層開發(fā)之前,很有必要了解一些Linux內(nèi)核的基本知識(shí)。在本章將簡(jiǎn)要講解Linux內(nèi)核的基礎(chǔ)知識(shí),特別是和Android系統(tǒng)密切相關(guān)的知識(shí),為讀者步入本書后面高級(jí)知識(shí)的學(xué)習(xí)打下基礎(chǔ)。2.1Linux基礎(chǔ)Linux是一類Unix計(jì)算機(jī)操作系統(tǒng)的統(tǒng)稱,Linux操作系統(tǒng)也是自由軟件和開放源代碼發(fā)展中最著名的例子。嚴(yán)格來講,Linux一詞本身只表示Linux內(nèi)核,但實(shí)際上人們已經(jīng)習(xí)慣了用Linux來形容整個(gè)基于Linux內(nèi)核,并且使用GNU工程各種工具和數(shù)據(jù)庫(kù)的操作系統(tǒng)。2.1.1Linux歷史簡(jiǎn)介L(zhǎng)inux最早是由一位名叫LinusTorvalds的計(jì)算機(jī)業(yè)余愛好者設(shè)計(jì)的,當(dāng)時(shí)他是芬蘭赫爾辛基大學(xué)的學(xué)生。他的目標(biāo)是想設(shè)計(jì)一個(gè)代替Minix(是由一位名叫AndrewTannebaum的計(jì)算機(jī)教授編寫的一個(gè)操作系統(tǒng)示教程序)的操作系統(tǒng),這個(gè)操作系統(tǒng)可用于386、486或奔騰處理器的個(gè)人計(jì)算機(jī)上,并且具有Unix操作系統(tǒng)的全部功能,由此開始了Linux雛形的設(shè)計(jì)。1983年,理查德·馬修·斯托曼(RichardStallman)創(chuàng)立了GNU計(jì)劃(GNUProject)。這個(gè)計(jì)劃的其中一個(gè)目標(biāo)是為了發(fā)展一個(gè)完全免費(fèi)自由的Unix-like操作系統(tǒng)。自20世紀(jì)90年代發(fā)起這個(gè)計(jì)劃以來,GNU開始大量地產(chǎn)生或收集各種系統(tǒng)所必備的元件,像函式庫(kù)(library)、編譯器(compiler)、偵錯(cuò)工具(debugger)、文字編輯器(texteditor)、網(wǎng)頁(yè)服務(wù)器(webserver),以及一個(gè)Unix的使用者接口(Unixshell)。1990年,GNU計(jì)劃開始在馬赫微核(Machmicrokernel)的架構(gòu)之上開發(fā)系統(tǒng)核心,也就是所謂的GNUHurd,但是這個(gè)基于Mach的設(shè)計(jì)異常復(fù)雜,發(fā)展進(jìn)度相對(duì)緩慢。2.1.2主要版本在當(dāng)前市面中的主流Linux發(fā)行版本有Asianux,ArchLinux,B2DLinux,ConectivaLinux,DebianGNU/Linux,F(xiàn)edoraCore,GentooLinux,KnoppixLinux,LinuxFromScratch,MagicLinux,MandrivaLinux,RedHatLinux,SlackwareLinux,StanixLiveCD,SUSELinux,TurboLinux,UbuntuLinux.IPCop,NUtyx,DEFT,NETbsd,turbolinux。在國(guó)內(nèi)主流的Linux發(fā)行版本有紅旗Linux(RedflagLinux),QomoLinux,沖浪Linux(XteamLinux),藍(lán)點(diǎn)Linux,新華Linux,共創(chuàng)Linux,百資Linux,veket,lucky8k-veket.OpenDesktop,HiweedGNU/Linux,MagicLinux,EngineeringComputingGNU/Linux,kylin,中標(biāo)普華Linux,中軟Linux,新華華鐳Linux(RaysLX),CDLinux,MCLinux,即時(shí)Linux(Thizlinux),b2dlinux,IBOX,MCLOS,F(xiàn)ANX,Everest,酷博linux,新氧Linux,Hiweed,雨林木風(fēng),DeepinLinux,宏碁Linux,PUDGNU/Linux。2.1.3Linux的發(fā)展機(jī)遇長(zhǎng)久以來,在計(jì)算機(jī)操作系統(tǒng)領(lǐng)域,Windows、Netware和UNIX一直占據(jù)主導(dǎo)地位。但是最近幾年發(fā)生了一些變化,以自由標(biāo)榜自己的Linux越來越顯示出其咄咄逼人的氣勢(shì),正日益成為一個(gè)令人生畏的對(duì)手。據(jù)估計(jì)現(xiàn)在全球已有1000多萬Linux用戶,有31%的互聯(lián)網(wǎng)服務(wù)器采用了Linux系統(tǒng)。Linux正在發(fā)起一項(xiàng)產(chǎn)業(yè)革命,逐漸吞噬著傳統(tǒng)操作系統(tǒng)的市場(chǎng)份額。請(qǐng)回頭看一看,看看我們平常使用的技術(shù):嵌入式系統(tǒng)、移動(dòng)計(jì)算、移動(dòng)互聯(lián)網(wǎng)工具、服務(wù)器、超級(jí)計(jì)算。在幾乎每個(gè)技術(shù)領(lǐng)域,Linux正在展現(xiàn)出作為未來主導(dǎo)平臺(tái)的勢(shì)頭。隨著SaaS、云計(jì)算、虛擬化、移動(dòng)平臺(tái)、企業(yè)2.0等新興技術(shù)的發(fā)展,Linux事業(yè)正面臨巨大發(fā)展機(jī)遇。主要體現(xiàn)在如下3個(gè)方面。(1)向企業(yè)級(jí)核心應(yīng)用邁進(jìn)。Linux的采用已由網(wǎng)絡(luò)領(lǐng)域逐步轉(zhuǎn)向了關(guān)鍵業(yè)務(wù)應(yīng)用,企業(yè)關(guān)鍵任務(wù)成為IBM的增長(zhǎng)領(lǐng)域,比如ERP軟件。同時(shí),隨著IT決策逐步從IT主管下放給IT管理人員,這些管理者對(duì)Linux顯示了強(qiáng)烈的支持,但同時(shí)對(duì)安全、可用性與服務(wù)提出了更高的需求。盡管很多用戶仍將Unix視為關(guān)鍵任務(wù)的平臺(tái),但隨著Linux開發(fā)者逐步縮小兩者的功能性差距,有越來越多的用戶開始將關(guān)鍵業(yè)務(wù)部署在Linux之上。(2)Linux將主導(dǎo)移動(dòng)平臺(tái)。Linux進(jìn)入到移動(dòng)終端操作系統(tǒng)后,很快就以其開放源代碼的優(yōu)勢(shì)吸引了越來越多的終端廠商和運(yùn)營(yíng)商對(duì)它的關(guān)注,包括摩托羅拉和NTTDoCoMo等知名的廠商。已經(jīng)開發(fā)出的基于Linux的手機(jī)有摩托羅拉的zn5、V8、A1210、A810、A760、A768、A780、e680i、e680、e2、e680g、E6、E8、em30、CEC的e2800、三星的i519等。Linux與其他操作系統(tǒng)相比是個(gè)后來者,但Linux具有兩個(gè)其他操作系統(tǒng)無法比擬的優(yōu)勢(shì)。其一,Linux具有開放的源代碼,能夠大大降低成本。其二,既滿足了手機(jī)制造商根據(jù)實(shí)際情況有針對(duì)性地開發(fā)自己的Linux手機(jī)操作系統(tǒng)的要求,又吸引了眾多軟件開發(fā)商對(duì)內(nèi)容應(yīng)用軟件的開發(fā),豐富了第三方應(yīng)用。(3)新技術(shù)為L(zhǎng)inux加速。在目前的企業(yè)級(jí)計(jì)算領(lǐng)域,云計(jì)算、SaaS、虛擬化是熱門技術(shù)話題。在這些領(lǐng)域,Linux同樣大有可為。云計(jì)算將全部使用Linux,Linux也是一款未來運(yùn)行數(shù)據(jù)中心虛擬機(jī)的理想操作系統(tǒng)。2.2Android和Linux的關(guān)系Linux和Android之間的關(guān)系密切,具體說來主要有如下3點(diǎn)。(1)Android采用Linux作為內(nèi)核。(2)Android對(duì)Linux內(nèi)核做了修改,目的是適應(yīng)其在移動(dòng)設(shè)備上的應(yīng)用。(3)Andorid開始是作為L(zhǎng)inux的一個(gè)分支,后來由于無法并入Linux的主開發(fā)樹,已被Linux內(nèi)核組從開發(fā)樹中刪除。2.2.1Android繼承于LinuxAndroid是在Linux2.6的內(nèi)核基礎(chǔ)之上運(yùn)行的,提供的核心系統(tǒng)服務(wù)包括安全、內(nèi)存管理、進(jìn)程管理、網(wǎng)絡(luò)組和驅(qū)動(dòng)模型等內(nèi)容。內(nèi)核部分還相當(dāng)于介于硬件層和系統(tǒng)中其他軟件組之間的一個(gè)抽象層次。但是嚴(yán)格來說它不算是Linux操作系統(tǒng)。因?yàn)锳ndroid內(nèi)核是由標(biāo)準(zhǔn)的Linux內(nèi)核修改而來的,所以很自然地繼承了Linux內(nèi)核的很多優(yōu)點(diǎn),并且保留了Linux內(nèi)核的主題架構(gòu)。Android本身有了很大的創(chuàng)新,按照移動(dòng)設(shè)備的需求在文件系統(tǒng)、內(nèi)存管理、進(jìn)程間通信機(jī)制和電源管理方面進(jìn)行了修改,根據(jù)需要添加了很多相關(guān)的驅(qū)動(dòng)程序和必要的新功能??偠灾?,Android很大程度地保留了Linux的基本架構(gòu),也正因?yàn)槿绱?,Android的應(yīng)用性和擴(kuò)展性更強(qiáng)。當(dāng)前Android版本對(duì)應(yīng)的Linux內(nèi)核版本如下所示?!馎ndroid1.5:Linux-2.6.27。●Android1.6:Linux-2.6.29。●Android2.0,2.1:Linux-2.6.29?!馎ndroid2.2:Linux-?!馎ndroid2.2:Linux-2.6.36。2.2.2Android和Linux內(nèi)核的區(qū)別Android系統(tǒng)的系統(tǒng)層面的底層是基于Linux內(nèi)核,中間加上了一個(gè)叫做Dalvik的Java虛擬機(jī),表面層上面是Android運(yùn)行庫(kù)。每個(gè)Android應(yīng)用都運(yùn)行在自己的進(jìn)程上,享有Dalvik虛擬機(jī)為它分配的專有實(shí)例。為了支持多個(gè)虛擬機(jī)在同一個(gè)設(shè)備上高效運(yùn)行,Dalvik被谷歌工程師們改寫了。Dalvik虛擬機(jī)執(zhí)行的是Dalvik格式的可執(zhí)行文件.dex。該格式經(jīng)過了專門的優(yōu)化處理,目的是將內(nèi)存耗用降到最低。Java編譯器將Java源文件轉(zhuǎn)為class文件,class文件又被內(nèi)置的dx工具轉(zhuǎn)化為dex格式文件,這種文件在Dalvik虛擬機(jī)上注冊(cè)并運(yùn)行。由此可見,Android系統(tǒng)的應(yīng)用軟件都是運(yùn)行在Dalvik之上的Java軟件,而Dalvik是運(yùn)行在Linux中的,在一些底層功能——比如線程和低內(nèi)存管理方面,Dalvik虛擬機(jī)是依賴Linux內(nèi)核的。綜上所述可以得出一個(gè)結(jié)論:Android是運(yùn)行在Linux之上的操作系統(tǒng),但是它本身不能算是Linux的某個(gè)版本。Android內(nèi)核和Linux內(nèi)核的差別主要體現(xiàn)在下面的11個(gè)方面。(1)AndroidBinder。AndroidBinder是基于OpenBinder框架的一個(gè)驅(qū)動(dòng),用于提供Android平臺(tái)的進(jìn)程間通信(IPC,inter-processcommunication)。原來的Linux系統(tǒng)上層應(yīng)用的進(jìn)程間通信主要是D-bus(desktopbus),采用消息總線的方式來進(jìn)行IPC。其源代碼位于drivers/staging/android/binder.c。(2)Android電源管理(PM)。Android電源管理是一個(gè)基于標(biāo)準(zhǔn)Linux電源管理系統(tǒng)的輕量級(jí)的Android電源管理驅(qū)動(dòng),針對(duì)嵌入式設(shè)備做了很多優(yōu)化。利用鎖和定時(shí)器來切換系統(tǒng)狀態(tài),控制設(shè)備在不同狀態(tài)下的功耗,以達(dá)到節(jié)能的目的。其源代碼分別位于如下文件。●kernel/power/earlysuspend.c。●kernel/power/consoleearlysuspend.c?!駅ernel/power/fbearlysuspend.c?!駅ernel/power/wakelock.c?!駅ernel/power/userwakelock.c。(3)低內(nèi)存管理器(LowMemoryKiller)。Android中的低內(nèi)存管理器和Linux標(biāo)準(zhǔn)的OOM(OutOfMemory)相比,其機(jī)制更加靈活,它可以根據(jù)需要?dú)⑺肋M(jìn)程來釋放需要的內(nèi)存。低內(nèi)存管理器的代碼很簡(jiǎn)單,關(guān)鍵的一個(gè)函數(shù)是Lowmem_shrinker。作為一個(gè)模塊在初始化時(shí)調(diào)用register_shrinke注冊(cè)了一個(gè)lowmem_shrinker,它會(huì)被vm在內(nèi)存緊張的情況下調(diào)用。Lowmem_shrinker完成具體操作。簡(jiǎn)單說就是尋找一個(gè)最合適的進(jìn)程殺死,從而釋放它占用的內(nèi)存。其源代碼位于drivers/staging/android/lowmemorykiller.c。(4)匿名共享內(nèi)存(Ashmem)。匿名共享內(nèi)存為進(jìn)程間提供大塊共享內(nèi)存,同時(shí)為內(nèi)核提供回收和管理這個(gè)內(nèi)存的機(jī)制。如果一個(gè)程序嘗試訪問Kernel釋放的一個(gè)共享內(nèi)存塊,它將會(huì)收到一個(gè)錯(cuò)誤提示,然后重新分配內(nèi)存并重載數(shù)據(jù)。其源代碼位于mm/ashmem.c。(5)AndroidPMEM(Physical)。PMEM用于向用戶空間提供連續(xù)的物理內(nèi)存區(qū)域,DSP和某些設(shè)備只能工作在連續(xù)的物理內(nèi)存上。驅(qū)動(dòng)中提供了mmap,open,release和ioctl等接口。源代碼位于drivers/misc/pmem.c。(6)AndroidLogger。AndroidLogger是一個(gè)輕量級(jí)的日志設(shè)備,用于抓取Android系統(tǒng)的各種日志,是Linux所沒有的。其源代碼位于drivers/staging/android/logger.c。(7)AndroidAlarm。AndroidAlarm提供了一個(gè)定時(shí)器用于把設(shè)備從睡眠狀態(tài)喚醒,同時(shí)它也提供了一個(gè)即使在設(shè)備睡眠時(shí)也會(huì)運(yùn)行的時(shí)鐘基準(zhǔn)。其源代碼位于下面的兩個(gè)文件?!馾rivers/rtc/alarm.c。●drivers/rtc/alarm-dev.c。(8)USBGadget驅(qū)動(dòng)。此驅(qū)動(dòng)是一個(gè)基于標(biāo)準(zhǔn)LinuxUSBgadget驅(qū)動(dòng)框架的設(shè)備驅(qū)動(dòng),Android的USB驅(qū)動(dòng)是基于gadget框架的。其源代碼位于如下文件?!馾rivers/usb/gadget/android.c?!馾rivers/usb/gadget/f_adb.c?!馾rivers/usb/gadget/f_mass_storage.c。(9)AndroidRamConsole。為了提供調(diào)試功能,Android允許將調(diào)試日志信息寫入一個(gè)被稱為RAMConsole的設(shè)備里,它是一個(gè)基于RAM的Buffer。其源代碼位于drivers/staging/android/ram_console.c。(10)Androidtimeddevice。Androidtimeddevice提供了對(duì)設(shè)備進(jìn)行定時(shí)控制功能,目前僅僅支持vibrator和LED設(shè)備。其源代碼位于drivers/staging/android/timed_output.c(timed_gpio.c)。(11)Yaffs2文件系統(tǒng)。在Android系統(tǒng)中,采用Yaffs2作為MTDnandflash文件系統(tǒng)。Yaffs2是一個(gè)快速穩(wěn)定的應(yīng)用于NAND和NORFlash的跨平臺(tái)的嵌入式設(shè)備文件系統(tǒng)。同其他Flash文件系統(tǒng)相比,Yaffs2使用更小的內(nèi)存來保存其運(yùn)行狀態(tài),因此它占用內(nèi)存小;Yaffs2的垃圾回收非常簡(jiǎn)單而且快速,因此能達(dá)到更好的性能;Yaffs2在大容量的NANDFlash上性能表現(xiàn)尤為明顯,非常適合大容量的Flash存儲(chǔ)。其源代碼位于fs/yaffs2/目錄下。Android是在Linux2.6的內(nèi)核基礎(chǔ)之上運(yùn)行的,提供的核心系統(tǒng)服務(wù)包括安全、內(nèi)存管理、進(jìn)程管理、網(wǎng)絡(luò)組和驅(qū)動(dòng)模型等內(nèi)容。內(nèi)核部分還相當(dāng)于介于硬件層和系統(tǒng)中其他軟件組之間的一個(gè)抽象層次。但是嚴(yán)格來說它不算是Linux操作系統(tǒng)。2.3Linux內(nèi)核簡(jiǎn)介既然Android內(nèi)核與Linux內(nèi)核有密切的聯(lián)系,所以在學(xué)習(xí)Android底層驅(qū)動(dòng)開發(fā)之前,很有必要了解Linux內(nèi)核的基本知識(shí)。本節(jié)將簡(jiǎn)要介紹Linux內(nèi)核的基本應(yīng)用知識(shí),為讀者步入本書后面高級(jí)知識(shí)的學(xué)習(xí)打下基礎(chǔ)。2.3.1內(nèi)核的體系結(jié)構(gòu)圖2-1顯示了一個(gè)完整Linux系統(tǒng)的最基本的視圖,由此可見內(nèi)核的作用就是將應(yīng)用程序和硬件分離開來?!鴪D2-1Linux操作系統(tǒng)的基本視圖內(nèi)核的主要任務(wù)是負(fù)責(zé)與計(jì)算機(jī)硬件進(jìn)行交互,實(shí)現(xiàn)對(duì)硬件的編程控制和接口操作,調(diào)度對(duì)硬件資源的訪問。內(nèi)核為用戶應(yīng)用程序提供了一個(gè)高級(jí)的執(zhí)行環(huán)境和訪問硬件的虛擬接口。提供硬件的兼容性是內(nèi)核的設(shè)計(jì)目標(biāo),幾乎所有的硬件都可以得到Linux的支持,只要不是為其他操作系統(tǒng)所定制的就可以。與硬件兼容性相關(guān)的是可移植性,即在不同的硬件平臺(tái)上運(yùn)行Linux的能力。從最初只支持標(biāo)準(zhǔn)IBM兼容機(jī)上的IntelX86架構(gòu)到現(xiàn)在可以支持Alpha、ARM、MIPS、PowerPC等硬件平臺(tái)。再看圖2-2所示的Linux操作系統(tǒng)的基本視圖?!鴪D2-2Linux操作系統(tǒng)的基本視圖由圖2-2可以得出Linux內(nèi)核分為如下兩部分。(1)體系相關(guān)部分:這部分內(nèi)核為體系結(jié)構(gòu)和硬件所特有。(2)體系無關(guān)部分:這部分內(nèi)核是可移植的。體系無關(guān)部分通常會(huì)定義與體系相關(guān)部分的接口,這樣,內(nèi)核向新的體系結(jié)構(gòu)移植的過程就變成確認(rèn)這些接口的特性并將它們加以實(shí)現(xiàn)的過程。用戶應(yīng)用程序和內(nèi)核之間的聯(lián)系是通過標(biāo)準(zhǔn)C庫(kù)來實(shí)現(xiàn),標(biāo)準(zhǔn)C庫(kù)是應(yīng)用程序和內(nèi)核之間的中間層。標(biāo)準(zhǔn)C庫(kù)函數(shù)是建立在內(nèi)核提供的系統(tǒng)調(diào)用基礎(chǔ)之上的,通過此C庫(kù)以及內(nèi)核體系無關(guān)部分與體系相關(guān)部分的接口,使用戶應(yīng)用程序和部分內(nèi)核都成為可移植的。根據(jù)上述描述,可以得出Linux操作系統(tǒng)的標(biāo)準(zhǔn)視圖。具體如圖2-3所示。▲圖2-3Linux系統(tǒng)的標(biāo)準(zhǔn)視圖上述視圖中的主要構(gòu)成模塊的具體說明如下所示。(1)系統(tǒng)調(diào)用接口。為了與用戶應(yīng)用程序進(jìn)行交互,內(nèi)核提供了一組系統(tǒng)調(diào)用接口,通過這組接口,應(yīng)用程序可以訪問系統(tǒng)硬件和各種操作系統(tǒng)資源。系統(tǒng)調(diào)用接口層在用戶應(yīng)用程序和內(nèi)核之間添加了一個(gè)中間層,形象地說,它扮演了一個(gè)函數(shù)調(diào)用多路復(fù)用和多路分解器的角色。(2)進(jìn)程管理。進(jìn)程管理負(fù)責(zé)創(chuàng)建和銷毀進(jìn)程,并處理它們之間的互相聯(lián)系(進(jìn)程間通信),同時(shí)負(fù)責(zé)安排調(diào)度它們?nèi)シ窒鞢PU。進(jìn)程管理部分實(shí)現(xiàn)了一個(gè)進(jìn)程世界的抽象,這個(gè)進(jìn)程世界類似于我們的人類世界,只不過我們?nèi)祟愂澜缋锏膫€(gè)體是人,而在進(jìn)程世界里則是一個(gè)一個(gè)的進(jìn)程,人與人之間通過書信、手機(jī)、網(wǎng)絡(luò)等進(jìn)行交互,而各個(gè)進(jìn)程之間則是通過不同方式的進(jìn)程間通信,我們所有人都在分享同一個(gè)地球,而所有進(jìn)程都在分享一個(gè)或多個(gè)CPU。(3)內(nèi)存管理。在進(jìn)程世界里,內(nèi)存是重要的資源之一,就好比我們的土地。因此,管理內(nèi)存的策略與方式是決定系統(tǒng)性能的一個(gè)關(guān)鍵因素。內(nèi)核的內(nèi)存管理部分根據(jù)不同的需要,提供了包括malloc/free在內(nèi)的許多簡(jiǎn)單或者復(fù)雜的接口,并為每個(gè)進(jìn)程都提供了一個(gè)虛擬的地址空間,基本上實(shí)現(xiàn)虛擬內(nèi)存對(duì)進(jìn)程的按需分配。(4)虛擬文件系統(tǒng)。虛擬文件系統(tǒng)為用戶空間提供了文件系統(tǒng)接口,同時(shí)又為各個(gè)具體的文件系統(tǒng)提供了通用的接口抽象。在VFS上面,是對(duì)諸如open、close、read和write之類函數(shù)的一個(gè)通用API抽象,在VFS下面則是具體的文件系統(tǒng),它們定義了上層函數(shù)的實(shí)現(xiàn)方式。通過虛擬文件系統(tǒng),我們可以利用標(biāo)準(zhǔn)的Linux文件系統(tǒng)調(diào)用對(duì)不同介質(zhì)上的不同文件系統(tǒng)進(jìn)行操作。應(yīng)該說,VFS是內(nèi)核在各種具體的文件系統(tǒng)上建立的一個(gè)抽象層,它提供了一個(gè)通用的文件系統(tǒng)模型,而該模型囊括了我們所能想到的所有文件系統(tǒng)的行為。(5)網(wǎng)絡(luò)功能。網(wǎng)絡(luò)子系統(tǒng)處理數(shù)據(jù)包的收集、標(biāo)識(shí)、分發(fā),路由和地址的解析等所有網(wǎng)絡(luò)有關(guān)的操作。socket層是網(wǎng)絡(luò)子系統(tǒng)的標(biāo)準(zhǔn)API,它為各種網(wǎng)絡(luò)協(xié)議提供了一個(gè)用戶接口。(6)設(shè)備驅(qū)動(dòng)程序。操作系統(tǒng)的目的是為用戶提供一種方便訪問硬件的途徑,因此,幾乎每一個(gè)系統(tǒng)操作最終都會(huì)映射到物理的硬件設(shè)備上。除了CPU、內(nèi)存等有限的幾個(gè)對(duì)象,所有設(shè)備的訪問控制操作都要由相關(guān)的代碼來完成,這些代碼就是所謂的設(shè)備驅(qū)動(dòng)程序。(7)代碼。這里的代碼需要依賴體系結(jié)構(gòu),因?yàn)椴糠謨?nèi)核代碼是體系相關(guān)的,在“./linux/arch”子目錄中定義了內(nèi)核源代碼中依賴于體系結(jié)構(gòu)的部分,其中包含了對(duì)應(yīng)各種特定體系結(jié)構(gòu)的子目錄。比如,對(duì)于一個(gè)典型的桌面系統(tǒng)來說,使用的是i386目錄。每個(gè)特定體系結(jié)構(gòu)對(duì)應(yīng)的子目錄又包含了很多下級(jí)子目錄,分別關(guān)注內(nèi)核中的一個(gè)特定方面,比如引導(dǎo)、內(nèi)核、內(nèi)存管理等。2.3.2和Android相關(guān)的Linux內(nèi)核知識(shí)我們知道,Android是建立在Linux2.6的內(nèi)核基礎(chǔ)之上運(yùn)行的,提供的核心系統(tǒng)服務(wù)包括安全、內(nèi)存管理、進(jìn)程管理、網(wǎng)絡(luò)組和驅(qū)動(dòng)模型等內(nèi)容。接下來將簡(jiǎn)要講解上述核心系統(tǒng)服務(wù)的基本知識(shí)。1.安全關(guān)于Linux安全的知識(shí)主要涉及用戶權(quán)限問題和目錄權(quán)限問題。(1)Linux系統(tǒng)中用戶和權(quán)限。Linux系統(tǒng)中的每個(gè)文件和目錄都有訪問權(quán)限,用它來確定誰可以通過何種方式對(duì)文件和目錄進(jìn)行訪問和操作。Linux系統(tǒng)中規(guī)定了文件3種不同類型的用戶:文件擁有者用戶(user)、同組用戶(group)、可以訪問系統(tǒng)的其他用戶(others)。并規(guī)定3種訪問文件或目錄的方式:讀(r)、寫(w)、可執(zhí)行或查找(x)。(2)文件及目錄權(quán)限的功能。讀權(quán)限(r)表示只允許指定用戶讀取相應(yīng)文件的內(nèi)容,禁止對(duì)它做任何的更改操作,如目錄讀權(quán)限表示可以列出存儲(chǔ)在該目錄下的文件,即讀目錄內(nèi)容。寫權(quán)限(w)表示允許指定用戶打開并修改文件,如目錄寫表示允許你從目錄中刪除或創(chuàng)建文件或目錄。執(zhí)行權(quán)限(x)表示允許指定用戶將該文件作為一個(gè)程序執(zhí)行,如對(duì)目錄表示允許你在目錄中查找,并能用cd命令將工作目錄切換到該目錄。Linux系統(tǒng)在創(chuàng)建文件的時(shí)候會(huì)自動(dòng)把該文件的讀寫權(quán)限分配給其屬主,使用戶能夠顯示和修改該文件。也可以將這些權(quán)限改變?yōu)槠渌慕M合形式。一個(gè)文件若有執(zhí)行權(quán)限,則允許它作為一個(gè)程序被執(zhí)行。2.內(nèi)存管理內(nèi)存管理是計(jì)算機(jī)編程最為基本的領(lǐng)域之一。在很多腳本語(yǔ)言中,我們不必?fù)?dān)心內(nèi)存是如何管理的,這并不能使內(nèi)存管理的重要性有一點(diǎn)點(diǎn)降低。對(duì)實(shí)際編程來說,理解內(nèi)存管理器的能力與局限性至關(guān)重要。在大部分系統(tǒng)語(yǔ)言中必須進(jìn)行內(nèi)存管理,例如C和C++。追溯到在AppleII上進(jìn)行匯編語(yǔ)言編程的時(shí)代,那時(shí)內(nèi)存管理還不是個(gè)大問題。實(shí)際上在運(yùn)行整個(gè)系統(tǒng),系統(tǒng)有多少內(nèi)存我們就有多少內(nèi)存。我們甚至不必費(fèi)心思去弄明白它有多少內(nèi)存,因?yàn)槊恳慌_(tái)機(jī)器的內(nèi)存數(shù)量都相同。所以,如果內(nèi)存需要非常固定,那么您只需要選擇一個(gè)內(nèi)存范圍并使用它即可。但是即使是在這樣一個(gè)簡(jiǎn)單的計(jì)算機(jī)中也會(huì)有問題,尤其是當(dāng)我們不知道程序的每個(gè)部分將需要多少內(nèi)存時(shí)。如果我們的空間有限,而內(nèi)存需求是變化的,那么需要用一些方法來滿足下面的需求。(1)確定您是否有足夠的內(nèi)存來處理數(shù)據(jù)。(2)從可用的內(nèi)存中獲取一部分內(nèi)存。(3)向可用內(nèi)存池(pool)中返回部分內(nèi)存,以使其可以由程序的其他部分或者其他程序使用。實(shí)現(xiàn)上述需求的程序庫(kù)稱為分配程序(allocator),因?yàn)樗鼈冐?fù)責(zé)分配和回收內(nèi)存。程序的動(dòng)態(tài)性越強(qiáng),內(nèi)存管理就越重要,您的內(nèi)存分配程序的選擇也就更重要。讓我們來了解可用于內(nèi)存管理的不同方法,它們的好處與不足,以及它們最適用的情形。3.進(jìn)程管理在Linux操作系統(tǒng)中包括了三種不同類型的進(jìn)程,分別是交互進(jìn)程、批處理進(jìn)程和守護(hù)進(jìn)程。每種進(jìn)程都有自己的特點(diǎn)和屬性。交互進(jìn)程是由一個(gè)Shell啟動(dòng)的進(jìn)程。交互進(jìn)程既可以在前臺(tái)運(yùn)行,也可以在后臺(tái)運(yùn)行。批處理進(jìn)程和終端沒有聯(lián)系,是一個(gè)進(jìn)程序列。系統(tǒng)守護(hù)進(jìn)程是Linux系統(tǒng)啟動(dòng)時(shí)啟動(dòng)的進(jìn)程,并在后臺(tái)運(yùn)行。Linux管理進(jìn)程的最好方法就是使用命令行下的系統(tǒng)命令。Linux下面的進(jìn)程涉及的命令有如ps、kill、pgrep等工具。(1)父進(jìn)程和子進(jìn)程。父進(jìn)程和子進(jìn)程的關(guān)系是管理和被管理的關(guān)系,當(dāng)父進(jìn)程終止時(shí),子進(jìn)程也隨之而終止。但子進(jìn)程終止,父進(jìn)程并不一定終止。比如httpd服務(wù)器運(yùn)行時(shí),我們可以殺掉其子進(jìn)程,父進(jìn)程并不會(huì)因?yàn)樽舆M(jìn)程的終止而終止。在進(jìn)程管理中,當(dāng)我們發(fā)現(xiàn)占用資源過多,或無法控制的進(jìn)程時(shí),應(yīng)該殺死它,以保護(hù)系統(tǒng)的穩(wěn)定安全運(yùn)行。(2)進(jìn)程命令。在Linux中,通過命令來管理和操作進(jìn)程,其中常用的命令可以分為如下幾類。監(jiān)視進(jìn)程命令?!駊s(processstatus命令)用于顯示瞬間進(jìn)程(process)的動(dòng)態(tài),其使用方式如下所示。ps的參數(shù)非常多,常用參數(shù)的具體說明如下所示。-A:列出所有的進(jìn)程。-w:顯示加寬,可以顯示較多的資訊。-au:顯示較詳細(xì)的資訊。-aux:顯示所有包含其他使用者的進(jìn)程?!駊stree命令,其功能是將所有進(jìn)程以樹狀圖顯示,樹狀圖將會(huì)以pid(如果有指定)或是以init這個(gè)基本進(jìn)程為根(root),如果有指定使用者id,則樹狀圖會(huì)只顯示該使用者所擁有的進(jìn)程。其使用方式如下所示。常用參數(shù)的具體說明如下所示。-a:顯示該進(jìn)程的完整指令及參數(shù),如果是被記憶體置換出去的進(jìn)程則會(huì)加上括號(hào)。-c:如果有重覆的進(jìn)程名,則分開列出(預(yù)設(shè)值時(shí)會(huì)在前面加上*)?!駌op命令用于實(shí)時(shí)顯示process的動(dòng)態(tài),其使用方式如下所示。常用參數(shù)的具體說明如下所示。d:改變顯示的更新速度,或是在交談式指令列(interactivecommand)按s。q:沒有任何延遲的顯示速度,如果使用者是有superuser的權(quán)限,則top將會(huì)以最高的優(yōu)先序執(zhí)行。c:切換顯示模式,共有兩種模式,一種是只顯示執(zhí)行檔的名稱,另一種是顯示完整的路徑與名稱。S:累積模式,會(huì)將已完成或消失的子進(jìn)程(deadchildprocess)的CPUtime累積起來。s:安全模式,將交談式指令取消,避免潛在的危機(jī)。i:不顯示任何閑置(idle)或無用(zombie)的進(jìn)程。n:更新的次數(shù),完成后將會(huì)退出top。b:批次檔模式,搭配“n”參數(shù)一起使用,可以用來將top的結(jié)果輸出到檔案內(nèi)。控制進(jìn)程命令。向Linux系統(tǒng)的內(nèi)核發(fā)送一個(gè)系統(tǒng)操作信號(hào)和某個(gè)程序的進(jìn)程標(biāo)識(shí)號(hào),系統(tǒng)內(nèi)核就可以對(duì)進(jìn)程標(biāo)識(shí)號(hào)指定的進(jìn)程進(jìn)行操作。例如在top命令中會(huì)看到系統(tǒng)運(yùn)行的許多進(jìn)程,有時(shí)就需要使用kill中止某些進(jìn)程來提高系統(tǒng)資源。在安裝和登錄命令中使用多個(gè)虛擬控制臺(tái)的作用是,當(dāng)一個(gè)程序出錯(cuò)造成系統(tǒng)死鎖時(shí)可以切換到其他虛擬控制臺(tái)工作關(guān)閉這個(gè)程序。此時(shí)使用的命令就是kill,因?yàn)閗ill是大多數(shù)Shell內(nèi)部命令可以直接調(diào)用的。在Linux系統(tǒng)中,使用kill命令來控制進(jìn)程。kill可以刪除執(zhí)行中的程序或工作,可以將指定的信息送至程序,預(yù)設(shè)的信息為SIGTERM(15),可將指定程序終止。若仍無法終止該程序,可使用SIGKILL(9)信息嘗試強(qiáng)制刪除程序。程序或工作的編號(hào)可利用ps指令或jobs指令查看。有如下兩種使用kill命令的方式。各個(gè)參數(shù)的具體說明如下所示。-l<信息編號(hào)>:如果不加<信息編號(hào)>選項(xiàng),則-l參數(shù)會(huì)列出全部的信息名稱。-s<信息名稱或編號(hào)>:指定要送出的信息。注意進(jìn)程是Linux系統(tǒng)中一個(gè)非常重要的概念。Linux是一個(gè)多任務(wù)的操作系統(tǒng),系統(tǒng)上經(jīng)常同時(shí)運(yùn)行著多個(gè)進(jìn)程。我們不關(guān)心這些進(jìn)程究竟是如何分配的,或者是內(nèi)核如何管理分配
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 浙江省杭州市2024-2025學(xué)年七年級(jí)下學(xué)期第1次月考模擬測(cè)試卷(3月份)(原卷版+解析版)
- 14文言文二則《學(xué)弈》教學(xué)設(shè)計(jì)-2024-2025學(xué)年語(yǔ)文六年級(jí)下冊(cè)(統(tǒng)編版)
- 2024-2025學(xué)年新教材高中英語(yǔ) Unit 6 Disaster and hope預(yù)習(xí) 新知早知道2教學(xué)實(shí)錄 外研版必修第三冊(cè)
- 2023一年級(jí)語(yǔ)文下冊(cè) 第二單元 2 我多想去看看配套教學(xué)實(shí)錄 新人教版
- 2024年四年級(jí)英語(yǔ)下冊(cè) Module 3 My colourful life Unit 8 Days of the week第1課時(shí)教學(xué)實(shí)錄 牛津滬教版(三起)
- 2024-2025學(xué)年高中政治 第1單元 生活智慧與時(shí)代精神 第2課 百舸爭(zhēng)流的思想 第1框 哲學(xué)的基本問題教學(xué)實(shí)錄 新人教版必修4
- 2024-2025學(xué)年高中歷史 第一單元 古代中國(guó)經(jīng)濟(jì)的基本結(jié)構(gòu)與特點(diǎn) 第2課 古代手工業(yè)的進(jìn)步(3)教學(xué)教學(xué)實(shí)錄 新人教版必修2
- 2024-2025學(xué)年高中化學(xué) 開學(xué)第一周 第一章 從實(shí)驗(yàn)學(xué)化學(xué) 第1節(jié) 化學(xué)實(shí)驗(yàn)基本方法教學(xué)實(shí)錄 新人教版必修1
- 17 盼 教學(xué)設(shè)計(jì)-2024-2025學(xué)年語(yǔ)文六年級(jí)上冊(cè)(統(tǒng)編版)
- 2024-2025學(xué)年高中歷史 第二單元 東西方的先哲 第3課 古希臘文化的集大成者亞里士多德(2)教學(xué)教學(xué)實(shí)錄 新人教版選修4
- 盤盤轉(zhuǎn)轉(zhuǎn)制作國(guó)風(fēng)標(biāo)簽(課件)六年級(jí)下冊(cè)勞動(dòng)
- 02S515排水檢查井圖集
- 項(xiàng)目班子組成資歷情況
- 《工程勘察設(shè)計(jì)收費(fèi)標(biāo)準(zhǔn)》(2002年修訂本)-工程設(shè)計(jì)收費(fèi)標(biāo)準(zhǔn)2002修訂版
- 2024山東能源集團(tuán)中級(jí)人才庫(kù)選拔(高頻重點(diǎn)提升專題訓(xùn)練)共500題附帶答案詳解
- 【實(shí)習(xí)護(hù)生職業(yè)認(rèn)同感及留職意愿現(xiàn)況問卷調(diào)查報(bào)告(含問卷)5400字(論文)】
- 廣東省廣州市2023-2024學(xué)年一年級(jí)下學(xué)期期末數(shù)學(xué)試卷
- DL-T5493-2014電力工程基樁檢測(cè)技術(shù)規(guī)程
- 中西醫(yī)結(jié)合思路與方法學(xué)課件
- 二年級(jí)數(shù)學(xué)下冊(cè)混合運(yùn)算計(jì)算100題(含詳細(xì)答案)
- 小學(xué)體育小課題研究
評(píng)論
0/150
提交評(píng)論