第1篇 基礎知識篇第1章 Android底層開發基礎 2
1.1 Android系統介紹 2
1.2 Android系統架構介紹 2
1.2.1 底層操作系統層(OS) 3
1.2.2 各種庫(Libraries)和Android運行環境
(RunTime) 3
1.2.3 應用程序框架(Application Framework) 4
1.2.4 頂層應用程序(Application) 4
1.3 獲取Android源碼 5
1.3.1 在Linux系統中獲取Android源碼 5
1.3.2 在Windows平臺上獲取Android源碼 7
1.4 分析Android源碼結構 9
1.4.1 總體結構 10
1.4.2 應用程序部分 11
1.4.3 應用程序框架部分 13
1.4.4 系統服務部分 13
1.4.5 系統程序庫部分 15
1.4.6 系統運行庫部分 18
1.4.7 硬件抽象層部分 19
1.5 編譯源碼 20
1.5.1 搭建編譯環境 20
1.5.2 在模擬器中運行 22
1.5.3 編譯源碼生成SDK 23
第2章 Android驅動開發基礎 28
2.1 驅動程序基礎 28
2.1.1 什么是驅動程序 28
2.1.2 驅動開發需要做的工作 29
2.2 Linux開發基礎 30
2.2.1 Linux簡介 30
2.2.2 Linux的發展趨勢 31
2.2.3 Android基于Linux系統 31
2.2.4 Android和Linux內核的區別 32
2.2.5 Android獨有的驅動 34
2.2.6 為Android構建Linux的操作系統 35
2.3 Linux內核結構 35
2.3.1 Linux內核的體系結構 35
2.3.2 和Android驅動開發相關的內核知識 37
2.4 分析Linux內核源碼 40
2.4.1 源碼目錄結構 40
2.4.2 瀏覽源碼的工具 42
2.4.3 GCC特性 43
2.4.4 鏈表的重要性 46
2.4.5 Kconfig和Makefile 48
2.5 學習Linux內核的方法 50
2.5.1 分析USB子系統的代碼 50
2.5.2 分析USB系統的初始化代碼 50
2.6 Linux中的3類驅動程序 54
2.6.1 字符設備驅動 54
2.6.2 塊設備驅動 61
2.6.3 網絡設備驅動 65
2.7 Android系統移植基礎 65
2.7.1 移植的任務 65
2.7.2 需要移植的內容 66
2.7.3 驅動開發需要做的工作 67
2.8 內核空間和用戶空間之間的接口 67
2.8.1 內核空間和用戶空間的相互作用 67
2.8.2 實現系統和硬件之間的交互 67
2.8.3 從內核到用戶空間傳輸數據 69
2.9 編寫JNI方法 72
第3章 主流內核系統解析 76
3.1 Goldfish內核和驅動解析 76
3.1.1 Goldfish基礎 77
3.1.2 Logger驅動 78
3.1.3 Low Memory Killer組件 79
3.1.4 Timed Output驅動 79
3.1.5 Timed Gpio驅動 80
3.1.6 Ram Console驅動 80
3.1.7 Ashmem驅動 81
3.1.8 Pmem驅動 81
3.1.9 Alarm驅動 81
3.1.10 USB Gadget驅動 82
3.1.11 Paranoid驅動介紹 82
3.1.12 Goldfish的設備驅動 83
3.2 MSM內核和驅動架構 85
3.2.1 高通公司介紹 85
3.2.2 常見的MSM處理器產品 86
3.2.3 MSM內核移植 87
3.2.4 Makefile文件 88
3.2.5 驅動和組件 90
3.2.6 設備驅動 92
3.2.7 高通特有的組件 94
第2篇 Android專有驅動篇
第4章 分析硬件抽象層 98
4.1 HAL基礎 98
4.1.1 推出HAL的背景 98
4.1.2 HAL的基本結構 99
4.2 分析HAL module架構 101
4.2.1 結構體hw_module_t 101
4.2.2 結構體hw_module_methods_t 102
4.2.3 結構體hw_device_t 103
4.3 分析文件hardware.c 103
4.3.1 尋找動態鏈接庫的地址 103
4.3.2 數組variant_keys 104
4.3.3 載入相應的庫 104
4.3.4 獲得hw_module_t結構體 105
4.4 分析硬件抽象層的加載過程 106
4.5 分析硬件訪問服務 109
4.5.1 定義硬件訪問服務接口 109
4.5.2 具體實現 110
4.6 分析Mokoid實例 111
4.6.1 獲取實例工程源碼 112
4.6.2 直接調用service方法的實現代碼 113
4.6.3 通過Manager調用service的實現代碼 117
4.7 HAL和系統移植 120
4.7.1 移植各個Android部件的方式 120
4.7.2 設置設備權限 121
4.7.3 init.rc初始化 125
4.7.4 文件系統的屬性 125
4.8 開發自己的HAL驅動程序 126
4.8.1 封裝HAL接口 126
4.8.2 開始編譯 129
第5章 Binder通信驅動詳解 130
5.1 分析Binder驅動程序 130
5.1.1 數據結構binder_work 130
5.1.2 結構體binder_node 131
5.1.3 結構體binder_ref 132
5.1.4 通知結構體binder_ref_death 133
5.1.5 結構體binder_buffer 133
5.1.6 結構體binder_proc 134
5.1.7 結構體binder_thread 135
5.1.8 結構體binder_transaction 136
5.1.9 結構體binder_write_read 136
5.1.10 Binder驅動協議 137
5.1.11 枚舉BinderDriverReturnProtocol 137
5.1.12 結構體binder_ptr_cookie和
binder_transaction_data 138
5.1.13 結構體flat_binder_object 139
5.1.14 設備初始化 139
5.1.15 打開Binder設備文件 141
5.1.16 實現內存映射 142
5.1.17 釋放物理頁面 147
5.1.18 分配內核緩沖區 148
5.1.19 釋放內核緩沖區 150
5.1.20 查詢內核緩沖區 152
5.2 Binder封裝庫驅動 153
5.2.1 Binder的3層結構 153
5.2.2 Binder驅動的同事——類BBinder 154
5.2.3 BpRefBase代理類 157
5.2.4 驅動交互類IPCThreadState 158
5.3 初始化Java層Binder框架 160
5.3.1 搭建交互關系 161
5.3.2 實現Binder類的初始化 161
5.3.3 實現BinderProxy類的初始化 162
5.4 實體對象binder_node的驅動 163
5.4.1 定義實體對象 164
5.4.2 增加引用計數 165
5.4.3 減少引用計數 166
5.5 本地對象BBinder驅動 167
5.5.1 引用運行的本地對象 167
5.5.2 處理接口協議 173
5.6 引用對象binder_ref驅動 177
5.7 代理對象BpBinder驅動 180
5.7.1 創建Binder代理對象 180
5.7.2 銷毀Binder代理對象 181
第6章 Logger驅動架構詳解 185
6.1 分析Logger驅動程序 185
6.1.1 分析頭文件 185
6.1.2 驅動實現文件 186
6.2 日志庫Liblog驅動 201
6.2.1 定義指針的初始化操作 202
6.2.2 記錄日志 203
6.2.3 設置寫入日志記錄的類型 204
6.2.4 向Logger日志驅動程序寫入日志記錄 205
6.2.5 記錄日志數據函數 206
6.3 日志寫入接口驅動 206
6.3.1 C/C++層的寫入接口 207
6.3.2 Java層的寫入接口 208
第7章 Ashmem驅動詳解 217
7.1 分析Ashmem驅動程序 217
7.1.1 基礎數據結構 217
7.1.2 驅動初始化 218
7.1.3 打開匿名共享內存設備文件 219
7.1.4 內存映射 222
7.1.5 讀寫操作 223
7.1.6 鎖定和解鎖 225
7.1.7 回收內存塊 230
7.2 C++訪問接口層 231
7.2.1 接口MemoryHeapBase的服務器端
實現 231
7.2.2 接口MemoryHeapBase的客戶端實現 236
7.2.3 接口MemoryBase的服務器端實現 240
7.2.4 接口MemoryBase的客戶端實現 242
7.3 實現Java訪問的接口層 243
7.4 實戰演練——讀取內核空間的數據 247
第8章 搭建測試環境 250
8.1 搭建S3C6410開發環境 250
8.1.1 S3C6410介紹 250
8.1.2 OK6410介紹 251
8.1.3 安裝minicom 251
8.1.4 燒寫Android系統 253
8.2 其他開發環境介紹 257
8.2.1 基于Cortex-A8的DMA-210XP開發板 257
8.2.2 基于Cortex-A8的QT210開發板 258
8.2.3 X210CV3開發板 259
8.3 測試驅動的方法 259
8.3.1 使用Ubuntu Linux測試驅動 262
8.3.2 在Android模擬器中測試驅動 263
第9章 低內存管理驅動 266
9.1 OOM機制 266
9.1.1 OOM機制基礎 266
9.1.2 分析OOM機制的具體實現 267
9.2 Android系統的Low Memory Killer
架構機制 273
9.3 Low Memory Killer驅動詳解 274
9.3.1 Low Memory Killer驅動基礎 274
9.3.2 分析核心功能 275
9.3.3 設置用戶接口 278
9.4 實戰演練——從內存池獲取對象 280
9.5 實戰演練——使用用戶程序讀取
內核空間的數據 282
第3篇 典型驅動移植篇
第10章 電源管理驅動 286
10.1 Power Management架構基礎 286
10.2 分析Framework層 287
10.2.1 文件PowerManager.java 287
10.2.2 提供PowerManager功能 288
10.3 JNI層架構分析 309
10.3.1 定義兩層之間的接口函數 309
10.3.2 與Linux Kernel層進行交互 311
10.4 Kernel(內核)層架構分析 311
10.4.1 文件power.c 312
10.4.2 文件earlysuspend.c 314
10.4.3 文件wakelock.c 315
10.4.4 文件resume.c 317
10.4.5 文件suspend.c 317
10.4.6 文件main.c 318
10.4.7 proc文件 319
10.5 wakelock和early_suspend 319
10.5.1 wakelock的原理 319
10.5.2 early_suspend原理 320
10.5.3 Android休眠 321
10.5.4 Android喚醒 323
10.6 Battery電池系統架構和管理 323
10.6.1 實現驅動程序 324
10.6.2 實現JNI本地代碼 325
10.6.3 Java層代碼 325
10.6.4 實現Uevent部分 327
10.7 JobScheduler節能調度機制 331
10.7.1 JobScheduler機制的推出背景 331
10.7.2 JobScheduler的實現 332
10.7.3 實現操作調度 332
10.7.4 封裝調度任務 335
第11章 PMEM內存驅動架構 339
11.1 PMEM初步 339
11.1.1 什么是PMEM 339
11.1.2 Platform設備基礎 339
11.2 PMEM驅動架構 341
11.2.1 設備實現 341
11.2.2 PMEM驅動的具體實現 343
11.2.3 調用PMEM驅動的流程 367
11.3 用戶空間接口 367
11.3.1 釋放位圖內存 368
11.3.2 釋放位圖內存空間 369
11.3.3 獲取位圖占用內存 370
11.4 實戰演練——將PMEM加入到
內核中 370
11.5 實戰演練——將PMEM加入到
內核中 372
11.6 實戰演練——PMEM在Camera中的
應用 373
11.7 實戰演練——PMEM的移植與測試 375
第12章 調試機制驅動Ram Console 378
12.1 Ram Console介紹 378
12.2 實現Ram Console 378
12.2.1 定義結構體ram_console_platform_data 379
12.2.2 實現具體功能 379
第13章 USB Gadget驅動 389
13.1 分析Linux內核的USB驅動程序 389
13.1.1 USB設備基礎 389
13.1.2 USB和sysfs 393
13.1.3 urb通信 396
13.2 USB Gadget驅動架構詳解 401
13.2.1 分析軟件結構 401
13.2.2 層次整合 411
13.2.3 USB設備枚舉 421
13.3 實戰演練——USB驅動例程分析 437
13.3.1 結構體usb_device_id 437
13.3.2 結構體usb_driver 439
13.3.3 注冊USB驅動程序 440
13.3.4 加載和卸載USB骨架程序模塊 441
13.3.5 探測回調函數 441
13.3.6 清理數據 443
13.3.7 函數skel_write()和skel_write_bulk_
callback() 444
13.3.8 獲取USB的接口 446
13.3.9 釋放不需要的資源 447
13.3.10 字符設備函數 448
13.3.11 讀取的數據量 449
13.4 實戰演練 450
13.4.1 移植USB Gadget驅動 450
13.4.2 移植USB HOST驅動 452
第14章 Time Device驅動 453
14.1 Timed Output驅動架構 453
14.1.1 設備類 453
14.1.2 分析Timed Output驅動的具體實現 458
14.1.3 實戰演練——實現設備的讀寫操作 460
14.2 Timed Gpio驅動架構 461
14.2.1 分析文件timed_gpio.h 462
14.2.2 分析文件timed_gpio.c 462
第15章 警報器系統驅動Alarm 467
15.1 Alarm系統基礎 467
15.1.1 Alarm層次結構介紹 467
15.1.2 需要移植的內容 468
15.2 RTC驅動程序架構 468
15.3 Alarm驅動架構 469
15.3.1 分析文件android_alarm.h 469
15.3.2 分析文件alarm.c 471
15.3.3 分析文件alarm-dev.c 483
15.4 JNI層詳解 491
15.5 Java層詳解 493
15.5.1 分析AlarmManagerService類 493
15.5.2 分析AlarmManager類 501
15.6 模擬器環境的具體實現 503
15.7 實戰演練 504
15.7.1 編寫PCF8563芯片的RTC驅動程序 504
15.7.2 在2440移植RTC驅動程序 507
15.7.3 在mini2440開發板上的移植 508
15.7.4 實現一個秒表定時器 509
第16章 振動器驅動架構和移植 512
16.1 振動器系統架構 512
16.2 硬件抽象層架構 513
16.3 JNI層架構 514
16.4 Java層架構 515
16.5 實戰演練——移植振動器系統 519
16.5.1 移植振動器驅動程序 519
16.5.2 實現硬件抽象層 520
16.6 實戰演練——在MSM平臺實現
振動器驅動 520
16.7 實戰演練——在MTK平臺實現
振動器驅動 523
16.8 實戰演練——移植振動器驅動 526
第17章 輸入系統驅動 527
17.1 輸入系統架構分析 527
17.2 移植輸入系統驅動的方法 528
17.3 Input(輸入)系統驅動詳解 529
17.3.1 分析頭文件 529
17.3.2 分析核心文件input.c 533
17.3.3 event機制詳解 548
17.4 硬件抽象層詳解 551
17.4.1 處理用戶空間 551
17.4.2 定義按鍵的字符映射關系 555
17.4.3 KL格式的按鍵布局文件 556
17.4.4 KCM格式的按鍵字符映射文件 557
17.4.5 分析文件EventHub.cpp 558
17.5 實戰演練 561
17.5.1 在內置模擬器中實現輸入驅動 562
17.5.2 在MSM高通處理器中實現輸入驅動 562
17.5.3 在Zoom平臺中實現輸入驅動 571
第18章 LCD顯示驅動 573
18.1 LCD系統介紹 573
18.2 FrameBuffer內核層詳解 573
18.2.1 分析接口文件fb.h 574
18.2.2 內核實現文件 577
18.3 硬件抽象層詳解 600
18.3.1 Gralloc模塊的頭文件 601
18.3.2 硬件幀緩沖區 603
18.3.3 顯示緩沖區的分配 604
18.3.4 顯示緩沖映射 605
18.3.5 分析管理庫文件LayerBuffer.cpp 606
18.4 Goldfish中的FrameBuffer驅動程序
詳解 607
18.5 使用Gralloc模塊的驅動程序 610
18.5.1 文件gralloc.cpp 611
18.5.2 文件mapper.cpp 614
18.5.3 文件framebuffer.cpp 615
18.6 MSM高通處理器中的顯示驅動 620
18.6.1 msm fb設備的文件操作函數接口 621
18.6.2 高通msm fb的driver接口 621
18.6.3 特殊的iocttl 621
18.7 MSM中的Gralloc驅動程序詳解 623
18.7.1 文件gralloc.cpp 623
18.7.2 文件framebuffer.cpp 624
18.7.3 文件gralloc.cpp 627
18.8 OMAP處理器中的顯示驅動實現 630
18.8.1 文件omapfb-main.c 631
18.8.2 文件omapfb.h 633
18.9 實戰演練 633
18.9.1 S3C2440上的LCD驅動 633
18.9.2 編寫訪問FrameBuffer設備文件的驅動 658
18.9.3 在S3C6410下移植FrameBuffer驅動 659
第19章 音頻系統驅動 664
19.1 音頻系統架構基礎 664
19.1.1 層次說明 665
19.1.2 Media庫中的Audio框架 665
19.2 音頻系統層次詳解 668
19.2.1 本地代碼詳解 668
19.2.2 JNI代碼詳解 670
19.2.3 Java層代碼詳解 671
19.3 移植Audio系統 672
19.3.1 移植需要做的工作 672
19.3.2 硬件抽象層移植分析 672
19.3.3 AudioFlinger中的Audio硬件抽象層 674
19.3.4 真正實現Audio硬件抽象層 679
19.4 實戰演練——在MSM平臺實現
Audio驅動 680
19.4.1 實現Audio驅動程序 680
19.4.2 實現硬件抽象層 681
19.5 實戰演練——在OSS平臺實現
Audio驅動 684
19.5.1 OSS驅動基礎 685
19.5.2 函數mixer() 685
19.6 實戰演練——在ALSA平臺實現
Audio系統 692
19.6.1 注冊音頻設備和音頻驅動 692
19.6.2 在Android中使用ALSA聲卡 693
19.6.3 在OMAP平臺移植Android的
ALSA聲卡驅動 701
19.6.4 基于ARM的AC97音頻驅動 704
第20章 Overlay系統驅動詳解 710
20.1 視頻輸出系統結構 710
20.2 移植Overlay系統 711
20.3 硬件抽象層詳解 711
20.3.1 Overlay系統硬件抽象層的接口 711
20.3.2 實現Overlay系統的硬件抽象層 714
20.3.3 實現Overlay接口 714
20.4 實現Overlay硬件抽象層 715
20.5 實戰演練——在OMAP平臺實現
Overlay系統 717
20.5.1 實現輸出視頻驅動程序 717
20.5.2 實現Overlay硬件抽象層 719
20.6 實戰演練——在系統層調用
Overlay HAL 724
20.6.1 測試文件 724
20.6.2 在Android系統中創建Overlay 725
20.6.3 管理Overlay HAL模塊 726
20.6.4 S3C6410 Android Overlay的測試代碼 727
第21章 照相機驅動 729
21.1 Camera系統的結構 729
21.1.1 Java程序部分 731
21.1.2 Camera的Java本地調用部分 731
21.1.3 Camera的本地庫libui.so 732
21.1.4 Camera服務libcameraservice.so 733
21.2 移植Camera系統 737
21.2.1 實現V4L2驅動 737
21.2.2 實現硬件抽象層 744
21.3 實戰演練——在MSM平臺實現
Camera驅動 747
21.4 實戰演練——在OMAP平臺實現
Camera驅動 750
21.5 Android實現S5PV210 FIMC
驅動 751
第22章 藍牙系統驅動 764
22.1 Android系統中的藍牙模塊 764
22.2 分析藍牙模塊的源碼 766
22.2.1 初始化藍牙芯片 766
22.2.2 藍牙服務 766
22.2.3 管理藍牙電源 767
22.3 低功耗藍牙協議棧詳解 767
22.3.1 低功耗藍牙協議棧基礎 767
22.3.2 低功耗藍牙API詳解 768
22.4 Android中的BlueDroid 769
22.4.1 Android系統中BlueDroid的架構 770
22.4.2 Application Framework層分析 770
22.4.3 分析Bluetooth System Service層 778
22.4.4 JNI層詳解 778
22.4.5 HAL硬件抽象層詳解 783
22.5 Android藍牙模塊的運作流程 783
22.5.1 打開藍牙設備 783
22.5.2 搜索藍牙 788
22.5.3 傳輸OPP文件 793
X
XI