導航:首頁 > 操作系統 > 深入理解android系統

深入理解android系統

發布時間:2023-02-14 12:47:48

Ⅰ 《深入理解android網路編程技術詳解與最佳實踐》epub下載在線閱讀,求百度網盤雲資源

《深入理解Android網路編程》(陳文)電子書網盤下載免費在線閱讀

鏈接:

提取碼:99p8

書名:深入理解Android網路編程

作者:陳文

豆瓣評分:5.1

出版社:機械工業出版社

出版年份:2013-8-20

頁數:362

內容簡介:

這是一本Android網路編程方面的專著,旨在幫助開發者們高效地編寫出高質量的Android網路應用。不僅系統講解了Android網路編程的各項核心技術和功能模塊,通過多個案例解讀了Android網路編程的方法和技巧,而且從源碼角度深入解析了Android核心網路處理方法和關鍵應用的實現原理,包含大量最佳實踐。

全書共11章,分為三個部分:概述篇(第1章)在介紹了Android開發平台後,重點講解了Android網路程序的功能及開發環境的配置,引領讀者走進Android網路編程的大門;實戰篇(第2~8章),詳細講解了TCP、UDP、HTTP等基本網路協議在Android上的應用,展示了使用Android處理JSON、SOAP、HTML、XML等數據的方法,講解了Android中的RSS編程、Email編程、OAuth認證等,解析了Android中Locations、Maps、USB、Wi-Fi、Bluetooth、NFC等網路模塊的編程,討論了Android中線程、數據存取、消息緩存、界面更新等的處理方法,探討了SIP、XMPP等協議在Android上的應用;源碼分析篇(第9~11章)分析了Android中與HTML處理、網路處理以及部分網路應用相關的源代碼,幫助讀者從底層原理上加深對相關知識點的理解。

作者簡介:

陳文資深Android開發工程師,深入分析過Android系統的源代碼,對Android系統的底層原理有非常深入的認識,尤其是與網路編程相關的功能模塊。精通XMPP協議和企業級雲端系統的構建,現從事移動互聯網系統的框架設計和研發工作。此外,他對java、HMTL 5、Web數據挖掘、個性化搜索引擎等技術也有一定的研究。

Ⅱ 深入理解Android:SystemServer進程的作用

看了一段時間關於SystemServer進程的博客,有點小理解,寫一篇關於SystemServer的小筆記,然後走一遍過程。

ZygoteInit通過startSystemServer方法fork了一個SS進程。這個進程有啥作用呢。

handlerSystemServerProcess()方法只要是以下三個方法:

其中 applicationInit() 很有意思很重要。該方法中有一個,invokeStaticMain方法通過反射調用main方法:

run方法最終通過反射調用SystemServer的main方法,作用是:
通過以上分析其實main方法的主要作用是:
1、調整系統時間
2、設置屬性persist.sys.dalvik.vm.lib.2的值為當前虛擬機的運行庫路徑
3、裝載libandroid_servers.so庫,初始化native層service
4、初始化系統Context
5、創建SystemServiceManager對象
6、調用startBootstrapServices(),startCoreServices(),startOtherServices()啟動所有的Java服務

另外也可以看到為什麼說handler默認是主線程,以及android 應用本身就是基於handler/Looper/Message的
startBootstrapServices():啟動java層的各種服務。framwork層的服務。例如AMS

startCoreServices:啟動核心服務:

startOtherServices也與上面一樣啟動各種服務。

總結下:SystemServer進程最終會執行到SystemServer類中的main方法中,初始化各種伺服器,其中第一個初始化的就是ActivityManagerService。當我們點擊啟動app的時候。Zygote會對這個消息進行處理,最終執行到applicationInit。那麼是在哪裡調用方法啟動應用的呢?

Ⅲ android的系統架構

android系統架構分從下往上為linux 內核層、運行庫、應用程序框架層、和應用程序層
linuxkernel:負責硬體的驅動程序、網路、電源、系統安全以及內存管理等功能。

libraries和 androidruntime:libraries:即c/c++函數庫部分,大多數都是開放源代碼的函數庫,例如webkit,該函數庫負責 android網頁瀏覽器的運行,例如標準的c函數庫libc、openssl、sqlite等,當然也包括支持游戲開發2dsgl和 3dopengles,在多媒體方面有mediaframework框架來支持各種影音和圖形文件的播放與顯示,例如mpeg4、h.264、mp3、 aac、amr、jpg和png等眾多的多媒體文件格式。android的runtime負責解釋和執行生成的dalvik格式的位元組碼。

applicationframework(應用軟體架構),java應用程序開發人員主要是使用該層封裝好的api進行快速開發。

applications:該層是java的應用程序層,android內置的googlemaps、e-mail、即時通信工具、瀏覽器、mp3播放 器等處於該層,java開發人員開發的程序也處於該層,而且和內置的應用程序具有平等的位置,可以調用內置的應用程序,也可以替換內置的應用程序。

上面的四個層次,下層為上層服務,上層需要下層的支持,調用下層的服務,這種嚴格分層的方式帶來的極大的穩定性、靈活性和可擴展性,使得不同層的開發人員可以按照規范專心特定層的開發。

android應用程序使用框架的api並在框架下運行,這就帶來了程序開發的高度一致性,另一方面也告訴我們,要想寫出優質高效的程序就必須對整個 applicationframework進行非常深入的理解。精通applicationframework,你就可以真正的理解android的設計 和運行機制,也就更能夠駕馭整個應用層的開發。

Ⅳ 《深入理解Android:Wi-Fi、NFC和GPS卷》epub下載在線閱讀,求百度網盤雲資源

《深入理解Android:Wi-Fi、NFC和GPS卷》(鄧凡平)電子書網盤下載免費在線閱讀

鏈接:

提取碼:1234

書名:深入理解Android:Wi-Fi、NFC和GPS卷

作者:鄧凡平

豆瓣評分:8.7

出版社:機械工業出版社

出版年份:2014-4-15

頁數:575

內容簡介:

本書是經典暢銷書「深入理解Android」系列的新作,由資深Android系統專家鄧凡平先生撰寫,全志和高通等公司資深專家擔任技術審校並強烈推薦。從通信專業知識和Android系統代碼實現的角度,對Netd、Wi-Fi、NFC和GPS等模塊的代碼進行深入的剖析,旨在深刻揭示其實現原理和工作流程。其中涉及大量通信相關的專業知識,因此特意邀請全志和高通等著名晶元公司的資深專家擔任技術審校。本書從實際應用的需求出發,適合所有Android系統工程師、Android應用開發工程師和BSP開發工程師閱讀。

作者簡介:

鄧凡平 資深Android系統工程師,對Android系統的設計與實現有非常深入的研究,曾擔任Tieto公司高級軟體架構師。暢銷書「深入理解Android」系列的總策劃和主筆,出版有暢銷書《深入理解Android:卷I》和《深入理解Android:卷II》。喜歡鑽研,樂於分享,活躍於CSDN、51CTO和開源中國等專業技術社區,撰寫的Android Framework源碼分析的系列文章深受讀者歡迎。2013年榮獲51CTO讀書頻道評選的「最受讀者喜愛的IT圖書作者獎」。

Ⅳ 深入理解Android的作品目錄

第1章 閱讀前的准備工作 / 1
1.1 系統架構 / 2
1.1.1 Android系統架構 / 2
1.1.2 本書的架構 / 3
1.2 搭建開發環境 / 4
1.2.1 下載源碼 / 4
1.2.2 編譯源碼 / 6
1.3 工具介紹 / 8
1.3.1 Source Insight介紹 / 8
1.3.3 Busybox的使用 / 11
1.4 本章小結 / 12
第2章 深入理解JNI / 13
2.1 JNI概述 / 14
2.2 學習JNI的實例:MediaScanner / 15
2.3 Java層的MediaScanner分析 / 16
2.3.1 載入JNI庫 / 16
2.3.2 Java的native函數和總結 / 17
2.4 JNI層MediaScanner的分析 / 17
2.4.1 注冊JNI函數 / 18
2.4.2 數據類型轉換 / 22
2.4.3 JNIEnv介紹 / 24
2.4.4 通過JNIEnv操作jobject / 25
2.4.5 jstring介紹 / 27
2.4.6 JNI類型簽名介紹 / 28
2.4.7 垃圾回收 / 29
2.4.8 JNI中的異常處理 / 32
2.5 本章小結 / 32
第3章 深入理解init / 33
3.1 概述 / 34
3.2 init分析 / 34
3.2.1 解析配置文件 / 38
3.2.2 解析service / 42
3.2.3 init控制service / 48
3.2.4 屬性服務 / 52
3.3 本章小結 / 60
第4章 深入理解zygote / 61
4.1 概述 / 62
4.2 zygote分析 / 62
4.2.1 AppRuntime分析 / 63
4.2.2 Welcome to Java World / 68
4.2.3 關於zygote的總結 / 74
4.3 SystemServer分析 / 74
4.3.1 SystemServer的誕生 / 74
4.3.2 SystemServer的重要使命 / 77
4.3.3 關於 SystemServer的總結 / 83
4.4 zygote的分裂 / 84
4.4.1 ActivityManagerService發送請求 / 84
4.4.2 有求必應之響應請求 / 86
4.4.3 關於zygote分裂的總結 / 88
4.5 拓展思考 / 88
4.5.1 虛擬機heapsize的限制 / 88
4.5.2 開機速度優化 / 89
4.5.3 Watchdog分析 / 90
4.6 本章小結 / 93
第5章 深入理解常見類 / 95
5.1 概述 / 96
5.2 以「三板斧」揭秘RefBase、sp和wp / 96
5.2.1 第一板斧——初識影子對象 / 96
5.2.2 第二板斧——由弱生強 / 103
5.2.3 第三板斧——破解生死魔咒 / 106
5.2.4 輕量級的引用計數控制類LightRefBase / 108
5.2.5 題外話—三板斧的來歷 / 109
5.3 Thread類及常用同步類分析 / 109
5.3.1 一個變數引發的思考 / 109
5.3.2 常用同步類 / 114
5.4 Looper和Handler類分析 / 121
5.4.1 Looper類分析 / 122
5.4.2 Handler分析 / 124
5.4.3 Looper和Handler的同步關系 / 127
5.4.4 HandlerThread介紹 / 129
5.5 本章小結 / 129
第6章 深入理解Binder / 130
6.1 概述 / 131
6.2 庖丁解MediaServer / 132
6.2.1 MediaServer的入口函數 / 132
6.2.2 獨一無二的ProcessState / 133
6.2.3 時空穿越魔術—defaultServiceManager / 134
6.2.4 注冊MediaPlayerService / 142
6.2.5 秋風掃落葉—StartThread Pool和join Thread Pool分析 / 149
6.2.6 你徹底明白了嗎 / 152
6.3 服務總管ServiceManager / 152
6.3.1 ServiceManager的原理 / 152
6.3.2 服務的注冊 / 155
6.3.3 ServiceManager存在的意義 / 158
6.4 MediaPlayerService和它的Client / 158
6.4.1 查詢ServiceManager / 158
6.4.2 子承父業 / 159
6.5 拓展思考 / 162
6.5.1 Binder和線程的關系 / 162
6.5.2 有人情味的訃告 / 163
6.5.3 匿名Service / 165
6.6 學以致用 / 166
6.6.1 純Native的Service / 166
6.6.2 扶得起的「阿斗」(aidl) / 169
6.7 本章小結 / 172
第7章 深入理解Audio系統 / 173
7.1 概述 / 174
7.2 AudioTrack的破解 / 174
7.2.1 用例介紹 / 174
7.2.2 AudioTrack(Java空間)分析 / 179
7.2.3 AudioTrack(Native空間)分析 / 188
7.2.4 關於AudioTrack的總結 / 200
7.3 AudioFlinger的破解 / 200
7.3.1 AudioFlinger的誕生 / 200
7.3.2 通過流程分析AudioFlinger / 204
7.3.3 audio_track_cblk_t分析 / 230
7.3.4 關於AudioFlinger的總結 / 234
7.4 AudioPolicyService的破解 / 234
7.4.1 AudioPolicyService的創建 / 235
7.4.2 重回AudioTrack / 245
7.4.3 聲音路由切換實例分析 / 251
7.4.4 關於AudioPolicy的總結 / 262
7.5 拓展思考 / 262
7.5.1 DuplicatingThread破解 / 262
7.5.2 題外話 / 270
7.6 本章小結 / 272
第8章 深入理解Surface系統 / 273
8.1 概述 / 275
8.2 一個Activity的顯示 / 275
8.2.1 Activity的創建 / 275
8.2.2 Activity的UI繪制 / 294
8.2.3 關於Activity的總結 / 296
8.3 初識Surface / 297
8.3.1 和Surface有關的流程總結 / 297
8.3.2 Surface之乾坤大挪移 / 298
8.3.3 乾坤大挪移的JNI層分析 / 303
8.3.4 Surface和畫圖 / 307
8.3.5 初識Surface小結 / 309
8.4 深入分析Surface / 310
8.4.1 與Surface相關的基礎知識介紹 / 310
8.4.2 SurfaceComposerClient分析 / 315
8.4.3 SurfaceControl分析 / 320
8.4.4 writeToParcel和Surface對象的創建 / 331
8.4.5 lockCanvas和unlockCanvasAndPost分析 / 335
8.4.6 GraphicBuffer介紹 / 344
8.4.7 深入分析Surface的總結 / 353
8.5 SurfaceFlinger分析 / 353
8.5.1 SurfaceFlinger的誕生 / 354
8.5.2 SF工作線程分析 / 359
8.5.3 Transaction分析 / 368
8.5.4 關於SurfaceFlinger的總結 / 376
8.6 拓展思考 / 377
8.6.1 Surface系統的CB對象分析 / 377
8.6.2 ViewRoot的你問我答 / 384
8.6.3 LayerBuffer分析 / 385
8.7 本章小結 / 394
第9章 深入理解Vold和Rild / 395
9.1 概述 / 396
9.2 Vold的原理與機制分析 / 396
9.2.1 Netlink和Uevent介紹 / 397
9.2.2 初識Vold / 399
9.2.3 NetlinkManager模塊分析 / 400
9.2.4 VolumeManager模塊分析 / 408
9.2.5 CommandListener模塊分析 / 414
9.2.6 Vold實例分析 / 417
9.2.7 關於Vold的總結 / 428
9.3 Rild的原理與機制分析 / 428
9.3.1 初識Rild / 430
9.3.2 RIL_startEventLoop分析 / 432
9.3.3 RIL_Init分析 / 437
9.3.4 RIL_register分析 / 444
9.3.5 關於Rild main函數的總結 / 447
9.3.6 Rild實例分析 / 447
9.3.7 關於Rild的總結 / 459
9.4 拓展思考 / 459
9.4.1 嵌入式系統的存儲知識介紹 / 459
9.4.2 Rild和Phone的改進探討 / 462
9.5 本章小結 / 463
第10章 深入理解MediaScanner / 464
10.1 概述 / 465
10.2 android.process.media分析 / 465
10.2.1 MSR模塊分析 / 466
10.2.2 MSS模塊分析 / 467
10.2.3 android.process.media媒體掃描工作的流程總結 / 471
10.3 MediaScanner分析 / 472
10.3.1 Java層分析 / 472
10.3.2 JNI層分析 / 476
10.3.3 PVMediaScanner分析 / 479
10.3.4 關於MediaScanner的總結 / 485
10.4 拓展思考 / 486
10.4.1 MediaScannerConnection介紹 / 486
10.4.2 我問你答 / 487
10.5 本章小結 / 488

Ⅵ 深入理解ANDROID怎麼樣

《深入理解Android(卷1)》是2011年機械工業出版社出版的圖書,作者是鄧凡平。 該書以情景方式對Android的源代碼進行深入分析。內容廣泛,以對Framework層的分析為主,兼顧Native層和Application層;分析深入,每一部分源代碼的分析都力求透徹;針對性強,注重實際應用開發需求,書中所涵蓋的知識點都是Android應用開發者和系統開發者需要重點掌握的。

Ⅶ 《深入理解Android:WiFi,NFC和GPS卷》pdf下載在線閱讀全文,求百度網盤雲資源

《深入理解Android:WiFi,NFC和GPS卷》網路網盤pdf最新全集下載:
鏈接:https://pan..com/s/1inU9q9tp3SkEq9LSo87w7Q

?pwd=xs5b 提取碼:xs5b
簡介:本書從實際應用的需求出發,適合所有Android系統工程師、Android應用開發工程師和BSP開發工程師閱讀。本書是經典暢銷書「深入理解Android」系列的新作,由資深Android系統專家鄧凡平先生撰寫,全志和高通等公司資深專家擔任技術審校並強烈推薦。從通信專業知識和Android系統代碼實現的角度,對Netd、Wi-Fi、NFC和GPS等模塊的代碼進行深入的剖析,旨在深刻揭示其實現原理和工作流程。其中涉及大量通信相關的專業知識,因此特意邀請全志和高通等著名晶元公司的資深專家擔任技術審校。

Ⅷ 深入理解Android的內容簡介

《深入理解Android(卷1)》共10章,第1章介紹了閱讀本書所需要做的准備工作,主要包括對Android系統架構和源碼閱讀方法的介紹;第2章通過對Android系統中的MediaScanner進行分析,詳細講解了Android中十分重要的JNI技術;第3章分析了init進程,揭示了通過解析init.rc來啟動Zygote以及屬性服務的工作原理;第4章分析了Zygote、SystemServer等進程的工作機制,同時還討論了Android的啟動速度、虛擬機HeapSize的大小調整、Watchdog工作原理等問題;第5章講解了Android系統中常用的類,包括sp、wp、RefBase、Thread等類,同步類,以及Java中的Handler類和Looper類,掌握這些類的知識後方能在後續的代碼分析中做到游刃有餘;第6章以MediaServer為切入點,對Android中極為重要的Binder進行了較為全面的分析,深刻揭示了其本質。第7章對Audio系統進行了深入的分析,尤其是AudioTrack、AudioFlinger和AudioPolicyService等的工作原理。第8章深入講解了Surface系統的實現原理,分析了Surface與Activity之間以及Surface與SurfaceFlinger之間的關系、SurfaceFlinger的工作原理、Surface系統中的幀數據傳輸以及LayerBuffer的工作流程。第9章對Vold和Rild的原理和機制進行了深入的分析,同時還探討了Phone設計優化的問題;第10章分析了多媒體系統中MediaScanner的工作原理。
《深入理解Android(卷1)》適合有一定基礎的Android應用開發工程師和系統工程師閱讀。通過對本書的學習,大家將能更深刻地理解Android系統,從而自如應對實際開發中遇到的難題。

Ⅸ 深入理解android2-WMS,控制項

title: '深入理解android2-WMS,控制項-圖床版'
date: 2020-03-08 16:22:42
tags:
typora-root-url: ./深入理解android2-WMS-控制項
typora--images-to: ./深入理解android2-WMS-控制項

WMS主要負責兩個功能, 一是負責窗口的管理,如窗口的增加刪除,層級.二是負責全局事件的派發.如觸摸點擊事件.

先簡單介紹幾個重要的類

IWindowSession. 進程唯一的.是一個匿名binder.通過他向WMS請求窗口操作

surface 繪畫時,canvas會把內容繪制到surface里.surface是有surfaceFlinger提供給客戶端的.

WindowManager.LayoutParams 集成自ViewGroup.LayoutParams.用來指明client端的窗口的一些屬性.最重要的是type. 根據這屬性來對多個窗口進程ZOrder的排序.

windowToken.向WMS添加的窗口令牌.每個窗口都要有一個令牌.

IWindow. 是client提供給WMS的.繼承自binder.WMS通過IWindow對象來主動發起client端的事件.

窗口的本周就是進行繪制所使用的surface,客戶端向WMS添加窗口的過程,就是WMS為客戶端分配surface的過程.

ui框架層就是使用surface上繪制ui元素.及響應輸入事件

WMS負責surface的分配.窗口的層級順序

surfaceFlinger負責將多個Surface混合並輸出.

WMS有SystemServer 進程啟動.他和AMS其實是運行於一個進程中的.只是分別有各自的線程.

上邊傳入了兩個handler.這里就使用windowManager的handler來創建WMS.也就是在一個handerThread線程中創建

用來管理每個窗口的事件輸入.也就是把輸入事件轉發到正確的窗口

能獲取顯示系統的同步信號.用來驅動動畫的渲染

所有窗口動畫的總管,在mChoreographer的驅動下渲染所有動畫

只有PhoneWindowManager一個實現.定義了很多窗口相關的策略.是最重要的成員,比如負責窗口的zorder順序.

zorder就是各個窗口在z軸的值.越大越在屏幕上層.窗口就是根據zorder值一層一層堆在一起.

可以繪制的屏幕列表.默認是只有1個.

管理所以窗口的顯示令牌token,每個窗口都要屬於一個token.這里的IBinder 是

表示所有Activity的token. AppWindowToken是WindowToken的子類,這個list的順序和AMS中對mHistory列表中activity的順序是一樣的 .反應了系統中activity的疊加順序.也就是說.所有窗口都有WindowToken.而Activity對應的窗口則多了AppWindowToken.

每個窗口都對應一個WindowState.存儲改窗口的狀態信息(這就和AMS中對每個activity抽象成ActivityRecord一樣)

這里的iBinder 是IWIndow類.

Session 是WMS提供給客戶端來與WMS進行交互的,這是匿名binder.為了減輕WMS的負擔.客戶端通過IWindowManager.openSession 拿到他的代理.然後通過代理與WMS交互.每個進程唯一.

客戶端通過IWindowSession.add 來添加窗口. iWindowSession 是同aidl形成的.最終到了WMS.addWindow.

這里總的來說就是確立了客戶窗口的WindowToken.WindowState.和DisplayContent. 並都保存了起來.同時根據layoutparams.type進行了些窗口等級的判斷.

WindowToken將同一個應用組件的窗口安排在一起.一個應用組件可以是Activity,InputMethod.

WindowToken使應用組件在變更窗口時必須與自己的WindowToken匹配.

這里主要是為了處理窗口的層級關系而設立的.

只要是一個binder對象.都可以作為token向wms聲明.wms會把這個binder對應起一個WindowToken.其實就是把客戶端的binder和wms里的一個WindowToken對象進行了綁定.

因為Activity比較復雜,因此WMS為Activity實現了WindowToken的子類 appwindowtoken.同時在AMS啟動Activity的ActivityStack.startActivityLocked里聲明token.

然後在activityStack.realStartActivityLocked里在發給用戶進程,然後用戶在通過這個binder和WMS交互時帶過來.

activity則在 activityStack 線程的handleResumeActivity 里把Activity 對應的窗口,加入到wMS中

取消token 也是在AMS中 ,也就是說, AMS負責avtivity的token向WMS的添加和刪除.

當然.Activity的 r.appToken 是 IApplicationToken.Stub ,他里邊有一系列的窗口相關的通知回調.

這里總結下. AMS在創建Activity的ActivityRecord時,創建了他的appToken,有把appToken傳送給WMS.WMS對應匹配為APPWindowToken,最後還把這個appToken發送給activity.因此AMS就通過ActivityRecord就可有直接操作WMS對該窗口的繪制.如圖.

每個window在WMS里都抽象成了WindowState.他包含一個窗口的所有屬性.WindowState在客戶端對應的則是iWidow.stub類.iWidow.stub有很多窗口通知的回調.

WindowState被保存在mWindowMap里.這是整個系統所有窗口的一個全集.

HashMap<IBinder, WindowToken> mTokenMap .這里是 IApplicationToken(客戶端)和WindowToken的映射

HashMap<IBinder, WindowState> mWindowMap 這里是IWidow(客戶端)和WindowState的映射,並且WMS通過這個IWindow 來回調客戶端的方法.

上圖可以看出.每個activity 只有一個ActivityRecord.也只有一個AppToken,也就只有一個WindowToken.而一個acitvity可能有多個窗口.每個窗口對應一個WindowState.

WindowToken用來和AMS交換. 而WindowState對應的iWindow則是WMS來與客戶端交互的.

窗口顯示次序就是窗口在Z軸的排了.因為窗口是疊加在一起的.因此就需要知道哪些顯示在上邊,哪些在下邊.這個由WindowState構造時確定

可見.分配規則是由WindowManagerPolicy mPolicy來決定的.產生 mBaseLayer和mSubLayer. mBaseLayer決定該窗口和他的子窗口在所有窗口的顯示位置. mSubLayer決定子窗口在同級的兄弟窗口的顯示位置.值越高.顯示約靠上.

WindowState 產生了他自己這個窗口的layer值後.在添加窗口的時候就會把所有窗口按layer排序插入mWindows列表中,在通過 adjustWallpaperWindowsLocked();進行層級調整.

當客戶端通過IWindowsession.add後,客戶端還沒有獲得Surface.只有在執行IWindowsession.relayout後.客戶端才獲得了一塊Surface. IWindowsession.relayout根據客戶端提供的參數,為客戶端提供surface.具體實現是WMS.relayoutWindow

總的來說就是根據用戶傳入的參數,更新WindowState.然後遍歷所有窗口布局.在設置合適的Surface尺寸,在返回給用戶端

會循環調用6次.里邊的邏輯大概如下

這里主要下,因為之前加了鎖.requestTraversalLocked他又會重復執行();因此會重復循環執行布局.

布局這部分就記個原理吧

布局完成後.客戶端的尺寸和surface都得到了.就可以繪制 了.WMS會通知客戶端布局發送變化

總結,WMS 負責管理所有的窗口.包括系統窗口和APP窗口,而窗口必須有一個WindowToken所為標識符.同時WMS為每個窗口創建一個WindowState類,這是窗口在服務端的抽象.WindowState則綁定了一個客戶端的IWindow類,WMS通過這個IWindow 向APP發送消息.

AMS在啟動Activity的時候.把ActivityRecord.token 通過wms.addtoken 注冊到WMS.又把這個token發送到APP端.因此三方可以通過這個token正確找到對應的數據.

WMS負責給所以窗口按ZOrder排序,確定窗口的尺寸,提供繪畫用的surface.

Activity的窗口是先wms.addtoken 建立windowToken關系 . wms.addWindow. 添加串口, WMS.relayout獲取surface. 完成 .

一個windowToken對應一個Activity. 但是可能對應多個windowSatate.也就是對應多個窗口.

是view樹的根實現類是viewRootImpl.但是他不是view.他是用來和WMS進行交流的管理者.viewRootImpl內部有個IWindowSession,是WMS提供的匿名binder,同時還有個iWindow子類,用來讓WMS給viewr發消息. view通過ViewRoot向WMS發消息.WMS在通過IWIndow 向APP發消息. 每個View樹只有一個ViewRoot,每個Activity也只有一個ViewRoot. UI繪制,事件傳遞.都是通過ViewRoot.

.實現類是PhoneWindow . Activity和View的溝通就是通過Window.Activity實現window的各種回調.一個Activity也對應一個PhoneWindow.也對應一個View樹.

Docerview 就是View樹的根.這是一個View. 他由PhoneWindow管理. 下文的WindowManager也由phoneWindow管理.

他還管理window的屬性 WindowManager.layoutparams.

他是一個代理類.他集成自ViewManager.他的實現是WindowManagerImpl.這是每個Activity都有一個.但是他只是把工作委託給了 WindowManagerGlobal來實現. 他負責添加刪除窗口,更新窗口.並控制窗口的補件屬性WindowManager.Layoutparams.

是進程唯一的.負責這個進程的窗口管理.他里邊有三個集合.保存這個進程所有窗口的數據.這里的每個數據根據index得到的是同一個Activity屬性.所有的WindowManager的操作都轉到他這里來.

private final ArrayList<View> mViews 每個view是個跟節點

private final ArrayList<ViewRootImpl> mRoots view對應的viewRoot

private final ArrayList<WindowManager.LayoutParams> mParams 窗口的layoutparams屬性.每個窗口一個

對於一個acitivity對象永遠對應一個PhoneWindow,一個WindowManagerImpl,一個WMS端的APPWindowToken,一個AMS里的ActivityRecord(但是如果一個activity在棧里有多個對象,就有多個ActivityRecord和AppWindowToken),acitvity 的默認窗口的view樹是DocerView.

一個窗口 對應一個ViewRoot,一個View樹.一個WindowManager.LayoutParams,一IWindow(WMS回調app).一個WSM端的WindowSatate.

但是一個Activity可以有多個窗口,因此對應WMS里可能有多個WindowSatate.這些WindowState都對應一個AppWindowToken.

一個Activity可能被載入多次.因此在AMS中可能有多個ActivityRecord對應這個activit的多個對象.

但是一個進程則對應一個WindowManagerGlobal.一個ActivityThread(主線程).一個ApplicationThread(AMS調用app).一個iWindowSession(viewroot向WMS發消息)

這里的區別就是 app與AMS 的交互是以進程之間進行通信.而App與WMS的交互.則是以窗口作為通信基礎.

當Activity由AMS啟動時.ActivityThread 通過handleResumeActivity執行resume相關的操作.這個函數首先是執行activity.resume, 此時activity 對應的view樹已經建立完成(oncreate中建立,PhoneWindow也創建了).需要把activity的窗口添加到WMS中去管理.

這里的wm是WindowManager.是每個activity一個.他內部會調用WindowManagerGlobal.addView

WindowManagerGlobal.addView

這里會為窗口創建ViewRootImpl. 並把view.ViewRootImpl.WindowMa.LayoutParams都保存在WindowManagerGlobal中, 並通過ViewRootImpl向WMS添加窗口

如果這個窗口是子窗口(wparams.type >= WindowManager.LayoutParams.FIRST_SUB_WINDOW &&
wparams.type <= WindowManager.LayoutParams.LAST_SUB_WINDOW)

就把子窗口的token設為父窗口的token否則就是所屬activity的token.

在來個圖

在這里我們看到.我們通過mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); 拿到的並不是遠程的WMS.而是本地的WindowManagerImpl. 他又把請求轉發給WindowManagerGlobal ,而WindowManagerGlobal作為進程單實例.又是吧請求轉給對應窗口的ViewRootImpl.ViewRootImpl通過WMS的IWindowSession 把數據發給WMS.

ViewRootImpl用來溝通View和WMS.並接受WMS的消息.這是雙向的binder通信.作為整個空間樹的根部,控制項的測量,布局,繪制,輸入時間的派發都由ViewRootImpl來觸發.

ViewRootImpl由WindowManagerGlobal創建,是在activityThread.handleResumeActivity時,先執行activity.resume.在調用wm.addView. 就會執行WindowManagerGlobal.addView里.創建ViewRootImpl,此時是在ui線程中.

ViewRootImpl里的mView屬性.host屬性,就是view樹

添加窗口時通過requestLayout();向ui線程發送消息.最後回調到ViewRootImpl.performTraversals.他是整個ui控制項樹,measure.layout.draw的集合.

這里分為五個階段.

預測量階段.進行第一次測量,獲得view.getMeasuredWitdh/Height,此時是控制項樹期望的尺寸.會執行View的onMeasure

布局階段,根據預測量的結果,通過IWindowSession.relayout向WMS請求調整窗口的尺寸這會使WMS對窗口重新布局,並把結果返回給ViewRootImpl.

最終測量階段, 預測量的結果是view樹期望的結果.WMS可能會進行調整,在這里WMS已經把結果通知了ViewRootImpl.因此這里會窗口實際尺寸performTraversals進行布局.view及子類的onMeasure會被回調

布局階段. 測量完成後獲得空間的尺寸,布局要確定控制項的位置,View及子類的onLayout會被回調.

繪制階段,使用WMS提供的surface.進行繪制,View及子類的onDraw會被回調.

通常我們看到的都是 先measure,在layout在draw. 這里看到.其實measure先得到期望值,在和WMS溝通.WMS在調整後,返回確定值,在根據確定值進行mesure.

measureHierarchy里會通過三次協商.執行performMeasure 來確認合適的尺寸.

performMeasure 會調用view 的measure 優會調用onMeasure. 我們可重寫onMeasure來實現測量.而measure 方法是final的.onMeasure 的結果通過setMeasuredDimension方法保存.

對於view. onMeasure.比較容易. 對於ViewGroup.則還要遍歷調用他所以子view的measure. 並且需要考慮padding和子view 的margin. padding是控制項外內邊距. margin 是控制項外邊距.

ViewGroup需要先測量完子view.在根據子view的測量值得到自己的寬高.舉例,如果只有一個子view.那麼ViewGroup的寬= 子view的寬+子view的margin+viewg的padding. 至少是這個值.

繼續回到performTraversals

這里就是提前測量了一下.得到控制項樹希望的尺寸大小,

通過relayoutWindow來布局窗口. ViewRootImpl 通過IWindowSession 來通知WMS進行窗口布局.

這里主要下. 調用WMS後.WMS會調整窗口的尺寸. 同時會生成surface返回給ViewRootImpl. 因此後續的繪畫就有了畫布了.可以看到最後的參數是mSurface.這是本地的surface. 這里會和wms的進行綁定.

接下來繼續performTraversals,綁定WMS返回的surface.然後更新尺寸.

最後進行最終測量. 上邊過程太亂了. 了解下就行.還是看常見的控制項繪制流程.

繪制由viewRootImpl.performTraversals觸發, 抽取出來後,就是這樣

就是直接調用view樹的根的measure方法. 傳入到View

該方法是final .意味著無法重寫.這里又會調用onMeasure.

因此.對於view.在onMeasure中調整好高度,通過setMeasuredDimension設置好自己的測量寬高就可以了.

對應ViewGroup.則在onMeasure中,先要遍歷子view.調用他們的measure(注意一定是調用子類的measure,measure又會調用onMeasure), 子view寬高都知道後,在根據子view的寬高來設置自己.也就是ViewGroup的寬高受子view影響.

可以看到view的measure又調用了onMeasure, 如果是view 則可以直接重新onMeasure來設定大小.而對於ViewGroup, 則需要重寫onMeasure來先遍歷子view.設定大小.然後再設定viewGroup的大小. ViewGroup並沒有重寫onMeasure.因為每個ViewGroup要實現的效果不同,需要自己完成.但ViewGroup提供了幾個方法供ViewGroup的繼承類來遍歷子view.

view的寬高由自己的layoutParams和父view提供的 widthMeasureSpec|heightMeasureSpec共同決定.

View 自己的寬高,是保存在LayoutParams中對,以寬舉例 LayoutParams.width 有三種情況,精確值(就是指定大小),MATCH_PARENT. WRAP_CONTENT,模式則有fuview提供.有 unspecified,exactly,at_most三種.

匹配如下.

其實這個很好理解. 如果子view自己指定了寬高.就用他的值就可以.如果子view是match_parent.那就使用父view提供的寬高. 如果子view是wrap_content,那就不能超過父view的值.

看下ViewGroup為子view繪制而提供的方法,可以看到.ViewGroup會減去padding和margin,來提供子view的寬高.

上步measure過程未完成後,整個view書的 測量寬高都得到了.也就是view.getMeasuredWidth()和getMeasuredHeight()

performLayout中會調用mView.layout. 這樣就把事件從ViewRootImpl傳遞到了view.而layout中又會調用onLayout.ViewGroup需要重寫onLayout為子view進行布局,遍歷調用子view的layout.因此就完成整個view樹的laylut過程.

豎向的實現, 豎向的就行把view從上到下一次排開

這里注意區分.measure過程是先得到子view的測量值,在設定父ViewGroup的值.而layout過程則是先傳入父view的左上右下值,來計運算元view的左上右下的位置值.這里應該具有普遍性.但不知道是否絕對.

performDraw 中的調用draw.又調用mView.draw.然後就進入view樹的繪制了.

view的draw 又會調用onDraw ,viewGroup又調用dispatchDraw()把draw分發到子view里 繪制的畫布就是canvas. 這是從surface.lockCanvas中獲得的一個區域.

而在ViewGroup.dispatchDraw中.重要的一點是getChildDrawingOrder 表示子view的繪制順序.默認是與ziview的添加順序一樣.我們也可以改變他.最後繪制的會顯示在最上邊,而這也影響view的事件傳遞順序.

view.draw. 就是一層一層的畫內容.先畫北京,在onDraw.在畫裝飾什麼的.

canvas.translate(100,300)通過平移坐標系.使之後的內容可以直接在新坐標系中繪制.

這就是ViewGroup在向子view傳遞canvas的時候.方便多了. 會之前先對其ziview的左上角.那麼子view就可以直接從自己坐標軸的(0,0)開始繪制, 繪制完成後ViewGroup在還原原有坐標系.

canvas.save. canvas.restore 用來保存還原坐標系.

view.invalidate.

當某個view發送變化需要重繪時,通過view.invalidate向上通知到ViewRootImpl.從這個view到ViewRootImpl的節點都標記為藏區域.dirty area. ViewRootimpl再次從上到下重繪時,只繪制這些臟區域.效率高.

本來安卓兼容使用鍵盤,也支持,觸摸.二者的輸入事件派發不一樣.使用鍵盤時會有個控制項處於獲得焦點狀態.處於觸摸模式則由用戶決定. 因此控制項分為兩類.任何情況下都能獲得焦點.如輸入文本框.只有在鍵盤操作時才能獲得焦點.如菜單,按鈕.

安卓里有觸摸模式.當發送任意觸摸時進入觸摸模式.當發送方向鍵和鍵盤或者執行View.requestRocusFromTouch時,退出觸摸模式.

獲取焦點. view.request.

先檢查是否能獲取焦點,

然後設置獲取簡單的標記,

向上傳遞到ViewRootimpl.保證只能有一個控制項獲取焦點.

通知焦點變化的監聽者.

更新view的drawable狀態,

requestChildFocus會把焦點事件層層上報取消原來有焦點的控制項.最後的效果就是從viewrootimpl中.到最終有焦點的view.構成一條 mFoucued 標識的鏈條.來個圖就明白了.每個view的mFocused總是指向他的直接下級.

獲取focus的傳遞是從底層view到頂層的ViewRootImpl.而取消focus測試從頂層的ViewRootimpl到底層原來那個獲得焦點的view.

而如果是ViewGroup請求獲取焦點,會根據FLAG_MASK_FOCUSABILITY特性來做不同方式,分別有先讓自己獲取焦點,或者安卓view的索引遞增或者遞減來匹配view.

ViewRootImpl 中的.WindowInputEventReceiver接受輸入事件.他會把事件包裝成一個QueuedInputEvent.然後追加到一個單鏈表的末尾.接著重頭到尾的處理輸入事件,並通過deliverInputEvent完成分發.這里會把單鏈表所有事件都處理完.

deliverInput中又會把觸摸事件執行到通過 ViewPreImeInputStage.processKeyEvent. 轉入mView.dispatchPointerEvent(event).這里又進入 dispatchTouchEvent

MotionEvent是觸摸事件的封裝.getAction可以拿到動作的類型和觸控點索引號.

getX(),getY().拿到動作的位置信息.通過getPointID拿到觸控點的id. 動作以down 開頭.跟多個move.最後是up.

,當事件返回true.表示事件被消費掉了.

Ⅹ 《深入理解 Android卷 I I I》txt下載在線閱讀全文,求百度網盤雲資源

《深入理解Android 卷III》(張大偉)電子書網盤下載免費在線閱讀

鏈接: https://pan..com/s/1NRSBBKYubmJsWp8DwJgRJg

提取碼: gjr8

書名:深入理解Android 卷III

作者:張大偉

豆瓣評分:9.0

出版社:機械工業出版社

出版年份:2015-8-1

頁數:539

內容簡介:

深入理解Android(卷3)》是Android經典暢銷書系(對Android系統源代碼的分析最為系統和細致)「深入理解Android」系列Framework卷的第III卷,從源代碼的角度,對Android系統的Audio和UI兩大功能的相關模塊的實現原理和工作機製做了系統且詳細的分析,填補了市場的空白。

《深入理解Android(卷3)》在邏輯上分為4個部分:

Part 01(第1~2章):這是本書的基礎部分,首先介紹了Android源碼環境的搭建、編譯和調試;然後講解了Android進程間通信與任務調度的工具Binder與MessageQueue。這兩項基礎工作是深入研究Android前必須做的功課。

Part 02(第3章):詳細分析了AudioService服務的實現,包括音量管理、音頻外設管理、AudioFocus機制的實現等內容。

Part 03(第4~6章):這是本書的核心內容之一,詳細分析了Android UI的通用實現,依次剖析了WindowManagerService、Android輸入系統、Android控制項系統的工作原理。

Part 04(第7~8章):主要分析了SystemUI和Android壁紙相關服務的實現,包括StatusBarManagerService與NotificationManagerService兩個系統服務,以及WallpaperManagerService系統服務、動態壁紙與靜態壁紙的工作原理等內容。

作者簡介:

張大偉,資深Android系統開發工程師,現就職於索尼移動。從2011年開始從事Android開發,專注於Android系統源代碼的研究、定製與維護工作,對Android的架構設計與運行原理有著深入的認識與實踐經驗,其中對UI相關模塊、多媒體系統尤為擅長。曾主持了Android多窗口、多任務以及單手操作等系統定製的開發工作。此外對於其他開發平台如.NET亦有相當的經驗。


閱讀全文

與深入理解android系統相關的資料

熱點內容
centos開機命令行模式 瀏覽:695
遍歷所有listpython 瀏覽:660
力控加密文件夾 瀏覽:515
如何更改移動伺服器密碼 瀏覽:686
蘋果8p手機加密 瀏覽:749
ipad建文件夾怎麼弄 瀏覽:833
iphone13對wap3加密 瀏覽:555
pdf文件打開失敗 瀏覽:913
dubbo怎麼調用不同伺服器介面 瀏覽:40
全能解壓王app歷史版本 瀏覽:75
優先隊列與拓撲排序演算法 瀏覽:281
pdf轉換formacbook 瀏覽:871
pdf文件內容怎麼編輯 瀏覽:48
134壓縮機排氣溫度多少 瀏覽:256
unity等待編譯後 瀏覽:806
黑鯊手機鎖屏視頻在哪個文件夾 瀏覽:781
wow地圖解壓後怎麼壓縮 瀏覽:823
有pdf卻打不開 瀏覽:461
七星彩軟體app怎麼下載 瀏覽:219
32單片機的重映射哪裡改 瀏覽:818