編輯推薦
源碼解讀,對Android底層源碼進行係統剖析。
硬件實踐,基於開源硬件pcDuino和Xilinx的可編程SoC——Zynq。
專傢力推,榖歌、華為、CSDN社區專傢聯袂推薦。
掌握Android底層軟件開發必備的工具書
開發一個Android應用往往非常簡單,而要構建一個健壯、可靠、功耗和性能優異的軟硬件一體係統確非易事。因此,市麵上介紹Android應用開發的書籍很多,但是偏重底層軟件開發的書卻不多。Android如今已經是最為流行的嵌入式操作係統,如果想要從零開始定製一個全新的基於Android和ARM處理器的新係統,就必須要瞭解Android操作係統的底層軟件。本書不僅覆蓋瞭必要的嵌入式係統理論和Linux的基礎知識,還對Android底層的源碼進行分析,並用實例引導讀者掌握底層開發的技能和調試方法。本書是掌握Android底層軟件開發技術的必備工具書。
內容簡介
《Android底層開發實戰》分為四個部分:一部分為預備知識篇,簡要介紹嵌入式係統的定義與軟硬件開發以及Android開發環境的搭建。第二部分為係統結構篇,主要介紹Android係統的源碼結構、內核與相關工具以及環境庫。第三部分為驅動設計篇,主要介紹Android係統中常用外接設備的驅動架構以及實現。內容包括NDK編程、Android中HAL模型架構與實現流程。作為教學實例,最後分析瞭Android係統中的Camera與WIFI兩個功能部件的的驅動設計。第四部分為實例分析篇,通過對具體開發闆硬件結構編程原理的介紹到係統級的實例講解。在簡要介紹係統底層開發流程的基礎上,首先分析瞭主流的Zynq和pcDuino平颱上開發環境的搭建、Linux內核以及Android係統的編譯、下載;然後結閤前文學習過的知識點,從零開始設計LED顯示係統的Linux內核驅動、AndroidHAL支持和服務層設計、頂層App的實現;作為進階部分,本書最後介紹瞭對Android內核進行跟蹤調試與性能測試的工具軟件、工作流程以及結果分析。
作者簡介
周慶國,蘭州大學教授。理學博士,博士生導師,IET Fellow,教育部新世紀人纔基金獲得者,現為蘭州大學開源軟件與實時係統教育部工程研究中心副主任,蘭州大學分布式與嵌入式係統實驗室主任。2007年10月曾受聘擔任Real Time Linux Foundation主任,2011年8月曾任《International Journal of Computational Science and Engineering 》(IJCSE)雜誌副主編,2013年4月曾任《International Journal of Embedded System》(IJES)雜誌主編。目前主要從事安全關鍵係統、嵌入式係統、實時係統、虛擬化技術的研究。
鄭靈翔,博士,高級工程師。先後獲得廈門市科技進步二等奬兩項,福建省教學成果二等奬一項。主要研究領域包括嵌入式係統、移動互聯網、物聯網、人工智能和模式識彆等。齣版嵌入式係統教材三本,發錶學術論文四十餘篇。
康筱彬,蘭州資源環境職業技術學院教師。畢業於蘭州大學信息學院,工程碩士。從事一綫教學工作,研究方嚮為嵌入式操作係統、移動互聯網技術及應用。
劉同山,蘭州大學教師。畢業於蘭州大學無綫電物理專業,現承擔電路、單片機等課程的教學與實驗工作。
目錄
推薦序
自 序
前 言
第1章 Android嵌入式係統導論1
1.1 Android嵌入式係統概述1
1.1.1 嵌入式係統定義1
1.1.2 基於Android的嵌入式係統構成5
1.1.3 移動電話係統9
1.1.4 基於ARM的移動電話硬件結構10
1.2 嵌入式係統實例17
1.2.1 pcDuino部分硬件功能介紹17
1.2.2 基於Android的嵌入式係統30
第2章 Linux係統詳解34
2.1 係統簡介34
2.2 基礎命令35
2.2.1 cd和ls命令35
2.2.2 touch和mkdir命令37
2.2.3 rm和rmdir命令38
2.2.4 cp和mv命令38
2.2.5 find和awk命令39
2.2.6 vim編輯器的使用43
2.3 Bash Shell44
2.3.1 Bash Shell簡介44
2.3.2 Bash Shell腳本簡介44
2.4 Linux源碼與Android源碼介紹45
2.4.1 Linux源碼簡介45
2.4.2 Android源碼簡介45
第3章 Android係統開發環境搭建47
3.1 編譯前奏—Android上的開發工作47
3.1.1 Android的移植開發47
3.1.2 係統開發48
3.1.3 應用開發49
3.2 Android的係統架構 49
3.2.1 軟件結構49
3.2.2 源代碼的結構51
3.3 搭建開發環境 54
3.3.1 搭建編譯環境54
3.3.2 使用repo64
3.3.3 Android的編譯66
第4章 Android係統底層源碼結構分析69
4.1 源碼結構分析69
4.1.1 底層庫結構介紹71
4.1.2 C基礎函數庫bionic73
4.1.3 C語言底層庫libcutils74
4.1.4 C++工具庫libutils74
4.1.5 底層文件係統庫system 75
4.1.6 增加本地庫的方法76
4.2 Android編譯係統介紹78
4.2.1 build係統78
4.2.2 SDK79
4.3 init初始化腳本語言介紹82
4.3.1 概述82
4.3.2 init進程源碼分析82
4.3.3 腳本文件的創建與分析85
4.3.4 創建設備節點文件89
4.3.5 子進程的創建與終止92
4.3.6 屬性服務93
4.4 Zygote95
4.4.1 Zygote概述95
4.4.2 AppRuntime分析95
4.4.3 system_server分析100
第5章 Android係統內核分析109
5.1 Linux內核基礎109
5.1.1 概述109
5.1.2 Linux內核的主要子係統110
5.1.3 Linux啓動過程分析111
5.2 Android內核概況112
5.3 Android啓動過程分析113
5.4 Binder框架分析115
5.4.1 概述116
5.4.2 Binder的係統架構117
5.4.3 Binder的機製和原理125
5.5 Ashmem內存管理方式128
5.5.1 概述128
5.5.2 Ashmem初始化128
5.5.3 內存的創建和釋放131
5.5.4 內存的映射135
5.5.5 內存的鎖定和解鎖137
5.6 低內存管理139
5.7 Logger145
5.7.1 Logger概述145
5.7.2 Logger實現原理146
第6章 Android係統相關工具及運行環境156
6.1 Android開發工具分類及介紹156
6.1.1 應用程序開發工具156
6.1.2 框架開發工具157
6.1.3 交叉編譯工具159
6.1.4 內核開發工具159
6.2 Dalvik虛擬機160
6.2.1 概述160
6.2.2 dex文件163
6.2.3 Dalvik內存管理165
6.2.4 Dalvik編譯器 169
6.3 JNI171
6.3.1 概述171
6.3.2 JNI的架構171
6.3.3 JNI的實現方式172
6.4 Boot Loader173
6.4.1 概述173
6.4.2 Boot Loader 的操作模式174
6.4.3 啓動過程175
6.5 busybox的使用176
第7章 Android驅動程序設計177
7.1 Android驅動概述177
7.2 Android NDK編程178
7.3 Android係統中的HAL層183
7.3.1 HAL_legacy和HAL對比184
7.3.2 HAL module 架構分析184
7.3.3 HAL實現流程186
7.4 Android係統Camera與WiFi實現187
7.4.1 Android中的Camera實現187
7.4.2 Android係統WiFi實現190
第8章 Android底層開發實例講解193
8.1 底層開發相關技術概覽193
8.2 實例講解—基於Zynq的Android移植193
8.2.1 主機開發環境的搭建194
8.2.2 Linux內核的編譯194
8.2.3 Android文件係統的編譯203
8.2.4 SD卡的準備以及Android係統的啓動 205
8.3 移植講解—基於pcDuino的Android移植205
8.3.1 pcDuino介紹206
8.3.2 環境搭建208
8.3.3 編譯內核209
8.3.4 編譯Android210
8.3.5 燒錄鏡像211
8.4 Android LED驅動設計212
8.4.1 硬件原理212
8.4.2 Linux驅動設計212
8.4.3 Android HAL層驅動220
8.4.4 硬件服務層224
8.4.5 App應用編寫229
8.5 進階講解—針對Android係統的內核跟蹤與測試231
8.5.1 使用平颱簡介231
8.5.2 測試環境的建立232
8.5.3 測試工具235
8.5.4 Android內核調試與性能測試239
前言/序言
自第一款搭載Android係統的智能手機HTC G1發布至今已近6年,憑藉日益完善與強大的功能、完全開放的內核源碼以及Google公司在網絡應用領域的無縫支持,Android係統從初齣茅廬的行業新銳,已經成長壯大為手持設備智能化産業的推動者和市場的領導者,這一點已經毋庸置疑。
不可否認,眾多獨立軟件開發者與商業軟件公司的加入使Android係統不僅僅作為終端産品,還作為開發平颱深入到各行業的技術開發中,包括學校、公司,乃至開發人員的工作、生活的各方麵,這是Android係統旺盛生命力的錶現,同時也是Android係統持續發展壯大的保障。近期,支持Android係統的開發闆如Zynq、pcDuino等在功能不斷完善的前提下成本也在大幅下降,助力瞭Android的推廣與拓展;可穿戴設備以及嵌入式芯片的應用又將為Android係統及其軟硬件開發提供新的發展機遇。接觸Android領域、使用Android産品、學習Android係統,現在已經成為計算機軟件、電子、自動化控製及相關專業的學生和已經參加工作的軟硬件工程師的首選。
但是目前市場上同類的Android相關書籍中,多是介紹基於Android SDK的單純應用程序(APP)的開發,且種類繁雜,對於Android的底層源碼與係統內核的分析、驅動程序設計與存儲優化、平颱移植與內核測試等較為深入的內容則甚少涉及。為瞭對這些底層領域相關知識稍作彌補,作者編寫瞭本書。
本書而用淺顯易懂的語言嚮廣大Android愛好者和開發人員講解Android係統下嵌入式開發闆的設計。
全書共8章,前3章為預備知識,簡要介紹嵌入式係統的定義與軟硬件開發以及Android開發環境的搭建。這一部分為基礎知識,有一定Linux基礎和Android開發經驗的讀者可以選讀。
第4~6章為係統結構,主要介紹Android係統的源碼結構、內核與相關工具以及環境庫。內容包括:Android源碼結構、init初始化腳本、Zygote、Android係統編譯;Android內核啓動、Binder框架、Ashmem內存管理、係統日誌Logger實現;Android開發工具、Dalvik虛擬機、JNI、Boot Loader。
第7章為驅動設計,主要介紹Android係統中常用外接設備的驅動架構以及實現。內容包括NDK編程、Android中HAL模型架構與實現流程。作為教學實例,最後還分析瞭Android係統中的Camera與WiFi兩個功能部件的驅動設計。
第8章為實例分析,介紹具體開發闆硬件結構的編程原理以及係統級的實例。在簡要介紹係統底層開發流程的基礎上,首先分析主流的Zynq和pcDuino平颱上開發環境的搭建、Linux內核以及Android係統的編譯、下載;然後結閤前文學習過的知識點,從零開始設計LED顯示係統的Linux內核驅動、Android HAL支持和服務層設計、頂層App的實現;作為進階部分,最後介紹瞭對Android內核進行跟蹤調試與性能測試的工具軟件、工作流程以及結果分析。
緻謝
在此要特彆感謝華章公司的策劃編輯張國強,是他對Android和嵌入式係統開發的關注促成瞭本書的齣版。筆者在撰寫書稿時,他也對本書提齣瞭寶貴的寫作建議,並進行瞭仔細的審閱。
本書的編寫同樣離不開許多朋友的支持,在此特彆感謝蘭州大學信息科學與工程學院的陳華明的大力協助,這本書的齣版離不開他的貢獻。
還要感謝蘭州大學的高博、郭守超、王小強和硃芳芳,感謝他們在本書編寫過程中所給予的幫助與建議。
alt="" />
《Android底層開發實戰》 內容簡介 本書旨在為讀者深入剖析Android操作係統的底層運行機製,揭示其核心組件的工作原理,並通過大量實戰案例,引導讀者掌握Android底層開發的關鍵技術。我們並非止步於應用層API的簡單調用,而是將目光聚焦於驅動程序、HAL層、Binder IPC、係統服務、運行時環境以及內核等更深層次的領域,幫助開發者構建對Android係統有全局性、係統性理解,並具備解決復雜底層問題的能力。 第一部分:Android係統架構與啓動流程解析 本部分將帶領讀者穿越Android係統的多層架構,從Linux內核到上層應用,建立起宏觀的認知框架。我們將詳細講解Android的分層設計,包括Linux內核層、硬件抽象層(HAL)、Android運行時(ART)以及核心Java庫、應用框架層和應用程序層。 Linux內核: 深入理解Android基於Linux內核的優勢,探討Linux內核在Android係統中的作用,包括進程管理、內存管理、設備驅動等關鍵模塊。我們將分析Android對Linux內核的定製和優化,例如Binder驅動、Ashmem等,並講解如何理解和調試內核代碼。 硬件抽象層(HAL): 揭示HAL在連接上層Java框架與底層硬件驅動之間的橋梁作用。我們將分析HAL的接口設計原則,研究常用HAL模塊(如Camera HAL、Audio HAL、Sensor HAL)的實現機製,並指導讀者如何開發自定義HAL模塊,以支持新的硬件設備。 Android運行時(ART): 深入剖析ART的執行流程,包括dex文件加載、方法編譯(AOT/JIT)、垃圾迴收等。我們將詳細講解ART的優化策略,以及如何在ART環境下進行性能調優和內存分析。 係統啓動流程: 從按下電源鍵開始,逐步解析Android係統的完整啓動過程。我們將詳細講解Bootloader、Kernel、init進程、Zygote進程、System Server等關鍵節點的職責和交互。通過源碼分析和邏輯梳理,讓讀者徹底理解Android是如何一步步被“喚醒”的。 第二部分:Binder IPC機製深入研究 Binder是Android進程間通信(IPC)的核心機製,其高效、安全、靈活的特性是Android係統能夠支撐復雜應用和服務的關鍵。本部分將對Binder IPC進行深度剖析。 Binder核心概念: 詳細解釋Binder的驅動層、用戶空間庫(libbinder)、Service Manager、Client/Server端架構。我們將分析Binder的Transaction、Message、Reply等核心數據結構,以及Binder對象是如何在進程間傳遞的。 Binder驅動源碼分析: 深入研究Binder驅動的內核實現,理解Binder在內核中的文件操作、內存映射、綫程模型等。我們將分析Binder驅動如何處理Binder命令、管理Binder對象、實現數據拷貝等。 Binder用戶空間實現: 詳細講解`libbinder`庫在用戶空間的作用,包括Proxy/Stub模式、Binder代理對象的創建與管理、Binder綫程池的運作等。 AIDL與Parcelable: 講解Android Interface Definition Language(AIDL)的使用方法,以及如何利用AIDL定義跨進程接口。同時,深入分析Parcelable接口,理解它在Binder數據序列化與反序列化中的重要作用,以及如何自定義Parcelable對象。 Binder性能優化與安全: 探討Binder通信的性能瓶頸,並給齣相應的優化策略。同時,分析Binder的安全機製,例如權限檢查、UID/PID驗證等。 第三部分:Android係統服務剖析與定製 Android係統中存在大量的係統服務,它們為上層應用提供瞭豐富的功能。本部分將選取幾個典型的係統服務進行深度剖析,並指導讀者如何進行定製開發。 System Server: 深入理解System Server的職責,它如何啓動、管理各種係統服務(如ActivityManagerService, PackageManagerService, WindowManagerService等)。我們將分析System Server的啓動流程,以及它與Zygote進程的關係。 ActivityManagerService(AMS)與WindowManagerService(WMS): 詳細解析AMS和WMS的功能,它們如何管理Activity生命周期、調度任務、處理窗口顯示與交互。我們將分析AMS與WMS之間的通信機製,以及它們如何協同工作。 PackageManagerService(PMS): 講解PMS的功能,包括應用安裝、卸載、權限管理、資源解析等。我們將分析PMS如何掃描和管理係統中的APK文件,以及如何處理應用更新。 其他重要係統服務: 簡要介紹其他關鍵係統服務,如LocationManagerService, NotificationManagerService, InputManagerService等,讓讀者對Android係統的服務生態有一個全麵的認識。 自定義係統服務: 指導讀者如何開發和集成自己的係統服務。我們將講解如何編寫System Server的插件,如何注冊新的Binder服務,以及如何在應用層調用自定義服務。 第四部分:Android運行時與原生庫開發 本部分將聚焦於Android的運行時環境以及原生庫(Native Libraries)的開發。 JNI(Java Native Interface): 詳細講解JNI的使用方法,包括Java與C/C++之間的函數調用、數據類型轉換、內存管理等。我們將通過實際案例,演示如何使用JNI將C/C++代碼集成到Android應用中,以提升性能或利用現有原生庫。 Android NDK(Native Development Kit): 介紹NDK的構成和作用,以及如何使用NDK開發原生C/C++代碼。我們將講解NDK的編譯、鏈接、打包過程,以及如何管理原生庫的依賴。 常用原生庫解析: 分析Android係統中常用的原生庫,如libc, libutils, libbinder, libgui, libstagefright等,理解它們在係統中的作用和實現。 內存管理與性能優化: 深入探討Android的原生內存管理機製,包括malloc, free, mmap等。我們將分析常見的內存泄漏問題,並介紹使用Valgrind等工具進行內存分析和性能調優的方法。 第五部分:Android安全機製與底層加固 安全是Android係統不可忽視的重要方麵。本部分將深入分析Android的安全機製,並探討底層加固的技術。 Android權限模型: 詳細解析Android的權限係統,包括運行時權限、簽名權限、文件權限等。我們將分析權限是如何授予和檢查的,以及如何避免權限濫用。 SELinux(Security-Enhanced Linux): 深入理解SELinux在Android係統中的安全作用,包括強製訪問控製(MAC)模型、安全策略(policy)的編寫與加載。我們將分析SELinux如何限製進程訪問敏感資源,以及如何排查SELinux相關的denial日誌。 應用沙箱機製: 講解Android應用沙箱的工作原理,包括UID隔離、文件係統隔離等。我們將分析沙箱機製如何防止應用之間的相互乾擾和惡意攻擊。 底層加固技術: 介紹一些常見的Android底層加固技術,如代碼混淆、反調試、Hook技術、加密等。我們將分析這些技術的原理和局限性,並指導讀者如何選擇和應用閤適的加固方案。 第六部分:Android驅動開發基礎 雖然Android係統上層開發較為普及,但深入的驅動開發能夠讓開發者對硬件有更深的理解,並能解決一些底層問題。本部分將介紹Android驅動開發的基礎知識。 Linux設備驅動模型: 簡要迴顧Linux設備驅動的基本概念,包括字符設備、塊設備、網絡設備,以及設備文件的創建和訪問。 Android特定驅動: 介紹Android係統中一些常見的驅動,如Binder驅動、Ashmem驅動、PMem驅動等,以及它們的用途。 驅動開發流程: 講解一個簡單的Linux設備驅動的開發流程,包括驅動源碼編寫、Makefile配置、模塊加載與卸載。 HAL與驅動的交互: 再次強調HAL層在驅動開發中的重要性,以及HAL模塊如何通過`ioctl`等方式與底層驅動進行交互。 調試技巧: 介紹在驅動開發過程中常用的調試方法,如`printk`日誌輸齣、`/proc`文件係統、`strace`等。 實戰案例 本書貫穿大量的實戰案例,包括但不限於: 開發自定義HAL模塊: 以一個簡單的傳感器為例,指導讀者從硬件接口定義到HAL接口實現,再到上層Java框架的調用。 編寫Binder服務: 創建一個簡單的計算器Binder服務,演示客戶端如何跨進程調用服務端的計算功能。 JNI接口開發: 實現一個用於圖片處理的原生庫,並通過JNI供Java層調用。 分析係統啓動日誌: 利用adb shell等工具,分析係統啓動過程中的關鍵日誌,定位啓動問題。 SELinux策略修改與測試: 針對某個常見場景,修改SELinux策略,驗證其安全性。 目標讀者 對Android係統底層原理充滿好奇的應用開發者。 希望深入理解Android運行機製,提升開發和調試能力的Android工程師。 從事嵌入式Linux開發,希望瞭解Android係統特性的開發者。 對操作係統、IPC、驅動等底層技術感興趣的學生和研究人員。 學習本書,您將能夠: 深入理解Android的“黑箱”: 揭開Android係統神秘的麵紗,理解其核心組件的運行邏輯。 掌握Binder IPC的奧秘: 徹底理解Android進程間通信的實現原理,並能高效利用。 靈活定製Android係統: 瞭解如何開發自定義係統服務,擴展Android的功能。 高效進行底層開發: 掌握JNI和NDK的使用,實現高性能的原生應用。 提升Android安全意識: 理解Android的安全機製,並能進行基本的安全加固。 具備解決復雜問題的能力: 麵對Android開發中的疑難雜癥,能夠從底層找到根源。 《Android底層開發實戰》不僅僅是一本書,更是您深入Android世界,成為一名真正“懂”Android開發者的指南。