第1部分 基礎篇
第1章 linux基礎 2
1.1 linux文件係統概述 2
1.2 linux啓動過程 4
1.3 常用linux 命令 6
1.4 shell腳本備忘 9
1.4.1 獲取輸入 10
1.4.2 變量定義 10
1.4.3 條件判斷 11
1.4.4 while []...do... done語句 12
1.4.5 for循環 13
1.4.6 函數 14
1.4.7 常用內置符號常量 15
1.5 make腳本備忘 15
1.5.1 一個簡單的makefile文件 16
1.5.2 變量的定義與賦值 18
1.5.3 條件控製語句 18
1.5.4 宏(函數)定義 19
1.5.5 內置符號和變量 22
1.5.6 模闆目標(pattern target) 23
1.5.7 目標特定的變量賦值(target-specific variable) 24
1.5.8 常用選項 25
第2章 java基礎 26
2.1 類裝載器dexclassloader 26
2.1.1 dexclassloader的調用方法 27
2.1.2 基於類裝載器設計一種“插件”架構 29
2.2 jni調用機製 32
2.2.1 java訪問c 33
2.2.2 c訪問java 35
2.2.3 在c中使用持久對象 37
2.3 異步消息處理綫程 37
2.3.1 實現異步綫程的一般思路 38
2.3.2 android中異步綫程的實現方法 38
第3章 android源碼下載及開發環境配置 44
3.1 mac係統的配置 44
3.1.1 硬盤格式的配置 44
3.1.2 port的用法 46
3.2 在linux中配置usb連接 46
3.3 在eclipse中調試framework 46
3.3.1 一段防止下載異常的腳本 47
3.3.2 調試framework中的代碼 47
第4章 使用git 51
4.1 安裝git 52
4.2 git倉庫管理 52
4.2.1 倉庫的組成 52
4.2.2 創建倉庫 54
4.2.3 分支管理 55
4.3 git merge用法 57
4.4 git rebase用法 58
4.5 git cherry-pick用法 61
4.6 git reset用法 62
4.7 恢復到無引用提交 63
4.8 git remote用法 65
4.9 git 配置 67
4.9.1 基本信息配置 68
4.9.2 merge、diff工具配置 68
4.9.3 .gitignore配置 70
4.10 同時使用git和svn 71
4.11 其他git常用命令示例 72
4.11.1 git branch 72
4.11.2 git checkout 72
4.11.3 git log 73
4.11.4 git commit --amend 73
4.11.5 git cherry-pick sha-1 73
4.11.6 git merge-base 74
4.11.7 git diff master…dev 74
4.11.8 git revert 75
4.11.9 git diff 75
4.11.10 git rm 75
4.11.11 git tag 76
第2部分 內核篇
第5章 binder 78
5.1 binder框架 78
5.2 設計servier端 80
5.3 binder客戶端設計 81
5.4 使用service類 82
5.4.1 獲取binder對象 82
5.4.2 保證包裹內參數順序aidl工具的使用 83
5.5 係統服務中的binder對象 88
5.5.1 servicemanager管理的服務 88
5.5.2 理解manager 90
第6章 framework概述 92
6.1 framework框架 92
6.1.1 服務端 92
6.1.2 客戶端 93
6.1.3 linux驅動 94
6.2 apk程序的運行過程 94
6.3 客戶端中的綫程 94
6.4 幾個常見問題 95
6.4.1 acitivity之間如何傳遞消息(數據) 95
6.4.2 窗口相關的概念 96
第7章 理解context 98
7.1 context是什麼 98
7.2 一個應用程序中包含多少個context對象 99
7.3 context相關類的繼承關係 99
7.4 創建context 100
7.4.1 application對應的context 101
7.4.2 activity對應的context 102
7.4.3 service對應的context 103
7.4.4 context之間的關係 104
第8章 創建窗口的過程 106
8.1 窗口的類型 106
8.2 token變量的含義 108
8.2.1 activity中的mtoken 108
8.2.2 window中的mapptoken 109
8.2.3 windowmanager.layoutparams中的token 109
8.2.4 view中的token 110
8.3 創建應用窗口 111
8.4 創建子窗口 121
8.4.1 dialog的創建 122
8.4.2 popupwindow的創建 126
8.4.3 contextmenu的創建 127
8.4.4 optionmenu的創建 132
8.5 係統窗口toast的創建 136
8.5.1 toast調用流程 137
8.5.2 toast添加窗口 139
8.6 創建窗口示例 139
第9章 framework的啓動過程 142
9.1 framework運行環境綜述 142
9.2 dalvik虛擬機相關的可執行程序 143
9.2.1 dalvikvm 144
9.2.2 dvz 144
9.2.3 app_process 145
9.3 zygote的啓動 147
9.3.1 在init.rc中配置zygote啓動參數 147
9.3.2 啓動socket服務端口 148
9.3.3 加載preload-classes 151
9.3.4 加載preload-resources 152
9.3.5 使用folk啓動新的進程 152
9.4 systemserver進程的啓動 155
9.4.1 啓動各種係統服務綫程 156
9.4.2 啓動第一個activity 158
第10章 ams內部原理 160
10.1 activity調度機製 160
10.1.1 幾個重要概念 161
10.1.2 ams中的一些重要調度相關變量 163
10.1.3 startactivity()的流程 165
10.1.4 stopactivitylocked()停止activity 183
10.1.5 按“home”鍵迴到桌麵的過程 186
10.1.6 按“back”鍵迴到上一個activity 187
10.1.7 長按“home”鍵 189
10.1.8 activity生命期的代碼含義 190
10.2 內存管理 192
10.2.1 關閉而不退齣 192
10.2.2 android與linux的配閤 194
10.2.3 各種關閉程序的過程 196
10.2.4 釋放內存詳解 197
10.3 對ams中數據對象的理解 211
10.3.1 常見的對象操作 212
10.3.2 理解activity 213
10.3.3 android多進程嗎,是同時在運行多個應用程序嗎 213
10.4 activitygroup的內部機製 214
10.4.1 tabactivity使用時的類關係結構 215
10.4.2 localactivitymanager的內部機製 217
10.4.3 activitygroup內部的activity生命期控製 220
第11章 從輸入設備中獲取消息 221
11.1 android消息獲取過程概述 221
11.2 與消息處理相關的源碼文件分布 223
11.3 創建inputdispatcher綫程 226
11.4 把窗口信息傳遞給inputdispatcher綫程 227
11.5 創建inputchannel 229
11.6 在wms中注冊inputchannel 232
11.7 在客戶進程中注冊inputchannel 233
11.8 wms中處理消息的時機 234
11.9 客戶窗口獲取消息的時機 235
第12章 屏幕繪圖基礎 237
12.1 繪製屏幕的軟件架構 237
12.2 java客戶端繪製調用過程 239
12.3 c客戶端繪製過程 241
12.4 java客戶端繪製相關類的關係 244
第13章 view工作原理 247
13.1 導論 247
13.2 用戶消息類型 249
13.2.1 按鍵消息 249
13.2.2 觸摸消息 250
13.3 按鍵消息派發過程 252
13.3.1 keyevent.dispatcherstate中的長按監測 252
13.3.2 按鍵消息總體派發過程 254
13.3.3 根視圖內部派發過程 256
13.3.4 activity內部派發過程 257
13.3.5 view類內部的onkeydown()和onkeyup() 260
13.3.6 activity中的onkeydown()和onkeyup() 261
13.3.7 phonewindow內部消息派發過程 262
13.4 按鍵消息在wms中的派發過程 263
13.5 觸摸消息派發過程 266
13.5.1 觸摸消息總體派發過程 266
13.5.2 根視圖內部消息派發過程 267
13.5.3 viewgroup內部消息派發過程 268
13.5.4 各種消息監測的基本實現方法 271
13.5.5 view內默認消息派發過程 272
13.6 導緻view樹重新遍曆的時機 274
13.6.1 狀態的分類 274
13.6.2 導緻view樹重新遍曆的總體誘因圖 275
13.6.3 refreshdrawablelist() 276
13.6.4 onfocusedchanged() 278
13.6.5 ensuretouchmode() 279
13.6.6 setvisibility() 282
13.6.7 setenable() 284
13.6.8 setselected() 285
13.6.9 invalidate() 286
13.6.10 requestfocus() 290
13.6.11 requestlayout() 292
13.7 遍曆view樹performtraversals()的執行過程 293
13.8 計算視圖大小(measure)的過程 296
13.8.1 measure內部設計思路 297
13.8.2 viewgroup中的measurechildwithmargins() 301
13.8.3 linearlayout中的onmeasure()過程舉例 304
13.9 布局(layout)過程 308
13.9.1 layout過程的設計思路 308
13.9.2 linearlayout中onlayout()內部過程 309
13.9.3 textview中gravity與layout的關係 311
13.10 繪製(draw)過程 313
13.10.1 視圖中可繪製的元素 313
13.10.2 繪製過程的設計思路 314
13.10.3 viewroot中draw()的內部流程 315
13.10.4 view類中draw()函數內部流程 318
13.10.5 viewgroup類中繪製子視圖dispatchdraw()內部流程 322
13.10.6 viewgroup類中drawchild()過程 325
13.10.7 繪製滾動條 328
13.11 動畫的繪製 331
13.11.1 動畫的設計思路 332
13.11.2 viewgroup類中drawchild()函數中視圖動畫繪製過程 334
13.11.3 viewgroup中dipsatchdraw()中布局動畫繪製流程 337
第14章 wms工作原理 340
14.1 概述 340
14.1.1 窗口的定義 340
14.1.2 窗口管理要解決的核心問題 341
14.1.3 解決核心問題所使用的相關的變量列錶 343
14.1.4 幾個操作的概念 346
14.1.5 什麼是policy,以及其與wms的關係 346
14.1.6 wms接口結構 347
14.2 wms主要內部類 348
14.2.1 錶示窗口的數據類 348
14.2.2 dimanimator 348
14.2.3 fadeinoutanimation 349
14.2.4 inputmonitor類 350
14.2.5 policythread 351
14.2.6 session 352
14.2.7 watermark 353
14.2.8 wmthread 354
14.3 窗口的創建和刪除 355
14.3.1 創建窗口的時機和過程 355
14.3.2 assignlayerslocked()的執行過程 360
14.3.3 addwindowtolistinorderlocked()的執行過程 362
14.3.4 刪除窗口的時機 364
14.3.5 刪除窗口的過程 366
14.3.6 removewindowinnerlocked() 367
14.4 計算窗口的大小 371
14.4.1 描述窗口尺寸的變量 371
14.4.2 窗口大小的變化過程 372
14.4.3 policy中layoutwindowlw()的執行過程 375
14.4.4 輸入法窗口如何影響應用窗口的大小 378
14.5 切換窗口 379
14.5.1 切換要解決的問題 379
14.5.2 inputmanager和wms的接口 381
14.5.3 ams與wms的接口 383
14.5.4 從a到b的切換 387
14.5.5 從b迴到a的過程 390
14.5.6 a中長按“home”鍵切換到b 391
14.5.7 setappvisiblity()與銷毀surface 393
14.5.8 computefocusedwindowlocked() 396
14.6 perforlayoutandplacesurfaceslockedinner()的執行過程 398
14.6.1 總體過程 399
14.6.2 第一大步驟:計算窗口的大小 401
14.6.3 第二大步驟:計算窗口的可視狀態 401
14.6.4 第三大步驟:通知surfaceflinger進行窗口重繪 404
14.7 窗口動畫 406
14.8 屏幕鏇轉及configuration的變化過程 409
第3部分 係統篇
第15章 資源訪問機製 414
15.1 定義資源 414
15.2 存儲資源 415
15.3 styleable、style、attr、theme的意義 417
15.4 attributeset與typedarray類 420
15.5 獲取resources的過程 425
15.5.1 通過context獲取 425
15.5.2 通過packagemanager獲取 429
15.6 framework資源 431
15.6.1 加載和讀取 432
15.6.2 添加 434
15.6.3 實現真正主題切換的兩種思路 436
第16章 程序包管理(package manager service) 439
16.1 包管理概述 439
16.2 packages.xml文件格式 442
16.2.1 last-platform-version標簽 443
16.2.2 permissions標簽 443
16.2.3 cert標簽 444
16.2.4 sigs標簽 444
16.2.5 perms標簽 444
16.2.6 package標簽 444
16.2.7 shared-user標簽 445
16.3 包管理服務的啓動過程 446
16.3.1 各主要功能類的關係 446
16.3.2 pms主體啓動過程 448
16.3.3 readpermission()內部過程 450
16.3.4 msettings.readlp() 452
16.3.5 scanpackageli()內部過程 454
16.3.6 msettings.writelp() 455
16.4 應用程序的安裝和卸載 455
16.4.1 各主要功能類關係 456
16.4.2 應用程序安裝過程 457
16.4.3 應用程序的卸載過程 461
16.5 intent匹配框架 463
16.5.1 主要功能類的關係 463
16.5.2 主體調用過程 465
第17章 輸入法框架 467
17.1 輸入法框架組成概述 468
17.2 輸入法中各binder對象的創建過程 469
17.2.1 inputconnection 469
17.2.2 iinputmethodclient 471
17.2.3 inputmethodsession 472
17.2.4 inputmethod 475
17.3 輸入法主要操作過程 477
17.3.1 輸入法相關模塊的啓動過程 477
17.3.2 切換輸入法 478
17.3.3 啓動輸入法 480
17.3.4 顯示輸入法 485
17.3.5 輸入法操作過程中的重要變量總結 489
17.4 輸入法窗口內部的顯示過程 490
17.4.1 ims中的showwindow()的內部執行過程 491
17.4.2 標準布局的ims 496
17.4.3 自定義布局的ims 502
17.5 嚮編輯框傳遞字符 503
17.6 輸入法相關源碼清單 504
第4部分 編譯篇
第18章 android編譯係統 508
18.1 android源碼文件結構 509
18.2 從調用make命令開始說起 509
18.2.1 編譯命令 510
18.2.2 編譯結構猜想 510
18.3 編譯所需腳本文件之間的協同關係 512
18.3.1 編譯係統內部功能模塊圖 512
18.3.2 腳本文件的包含關係 514
18.3.3 從子項目中提取編譯目標 518
18.3.4 生成編譯規則 519
18.3.5 設置編譯輸齣目錄 521
18.3.6 生成最終的image文件 522
18.4 如何增加一個product 523
18.4.1 什麼是一個product 523
18.4.2 如何增加一個product 527
18.5 如何增加一個項目 528
18.5.1 項目類彆和項目路徑 529
18.5.2 添加一個c項目 530
18.5.3 添加一個apk項目 531
18.6 apk編譯過程 533
18.6.1 總體編譯過程概述 533
18.6.2 生成r.java 535
18.6.3 編譯aidl文件 536
18.6.4 包含java靜態庫 536
18.6.5 編譯java源文件生成jar包 538
18.6.6 將jar包轉換為dex文件 539
18.6.7 編譯資源文件生成apk包 540
18.6.8 將dex文件添加到apk包中 541
18.6.9 添加jni所需的動態庫文件 541
18.6.10 對apk文件進行簽名 543
18.6.11 使用zipalign優化apk內部存儲 543
18.7 framework的編譯 544
18.7.1 總體編譯過程 544
18.7.2 framework/core/ext三個jar文件的區彆 546
18.8 編譯android.jar 547
18.8.1 資源文件 547
18.8.2 aidl文件 551
18.8.3 java文件 551
18.9 編譯adt插件 553
18.10 總結 554
第19章 編譯自己的rom 555
19.1 嵌入式係統的內存地址空間 555
19.2 各種映像(image)文件的作用 559
19.3 編譯nexus s(ns)的image文件 562
19.3.1 編譯linux kernel 562
19.3.2 提取ns的私有驅動文件 563
19.3.3 編譯system.img文件 564
19.3.4 創建ramdisk.img 565
19.3.5 創建boot.img文件 566
19.4 使用fastboot寫入image文件 566
19.5 最後驗證 567
19.5.1 解決觸摸按鍵問題 568
19.5.2 解決音量和電源鍵 568
19.5.3 wifi問題 570
19.5.4 安裝google mobile service(gms) 571
第5部分 硬件驅動篇
第20章 基於ti omap處理器的 techshine 開發闆介紹 573
20.1 techv-35xx開發闆概述 574
20.2 交叉編譯環境配置 575
20.3 x-loader編譯 578
20.4 u-boot編譯 578
20.5 techv-35xx linux驅動和內核配置及編譯 579
20.5.1 touchscreen驅動配置 579
20.5.2 keyboard驅動配置 580
20.5.3 audio驅動配置 581
20.5.4 4mmc/sd驅動配置 582
20.5.5 nandflash驅動配置 582
20.5.6 lcd驅動配置 583
20.5.7 內核編譯 583
20.6 techv-35xx android驅動編寫 584
20.7 techv-35xx android開發環境建立 589
20.8 編譯android donut 590
20.9 android根文件係統的製作 591
20.10 相關image文件的燒寫 591
20.11 android 根文件係統安裝 593
· · · · · · (
收起)