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