作業中很多任務是要去定制Framework,但是還是很多不會的,不過我可以告訴你如何去摸索,在此拋磚引玉一下,
Framework這個東西挺好挺大的,不過它的核心其實也好說,一是承上啟下提供應用的API,一是提供作業系統的服務,
相信所有人開始學習android開發的時候都是從以下這張圖開始的,framework位于hal、系統庫之上,位于app之下,

Framework同下層打交到的方式就是jni,同上層打交到的方式就是抽象出各種java介面,在開發app的時候,import的各種android.* 就是各位在查檔案時候的東東了,
像題主這樣從app而來想要學習framework的肯定對JNI不那么熟悉吧,沒關系,Google的命名方式可以讓你忽略這部分實作,好好看java代碼就夠了,
從哪里開始呢?上面那張結構圖里面的各種Manager背后都是系統服務,Framework包含各種系統服務,所以“得服務者、得Framework”(我瞎說的,哈哈哈),這里可以簡單介紹一下這些服務的結構,
Framework里的服務按照“SystemService.java”里分的話,分為可以Binder的服務、LocalService兩類,如下圖所示:

每類服務都會在Systemserver.java里啟動自己,然后其他服務就可以呼叫了,而且大部分服務都有一個Manager(就是結構圖里的各種*Manager),這點在搜代碼的時候會看到各種*ServiceManager.java的類,這里Managers很大一部分都是開放出來的呼叫介面,
來看看SystemServer.java這個檔案的一些函式,如下圖:

在這里啟動了各種型別的服務,下面這些都很熟悉吧?

這樣是不是找到了各個Service的啟動位置了,就是在這里,各個服務完成初始化,被呼叫了建構式,以及最初被呼叫的那幾個函式找到了,程式入口找到了,是不是可以解決一半問題了呢?
以上這些都是很長的檔案,看起來頭暈有木有啊,這里推薦一個Framework里最簡單的Service——LightService,一共就以下幾個檔案,
./services/core/java/com/android/server/lights/LightsManager.java
./services/core/java/com/android/server/lights/Light.java
./services/core/java/com/android/server/lights/LightsService.java
這個就是控制一閃一閃LED的控制介面了,每個代碼不超過百行,但是也代表了一共典型的Service在Framework里面是種怎樣的存在吧,
至于你的那些問題,就是要跟著函式呼叫慢慢走,慢慢看吧,
學習程式最需要會的一點就是--抽象,不管是寫還是看,
寫的抽象不必說,
看的抽象是啥玩意兒?
就是開始看的時候要忽略細節,跟著流程走,作業原理一般都可以文字描述,如何實作的,跟著函式呼叫一步一步套,流程通了,細節就不在話下了,
如果一開始就糾結各種變數、各種函式名、各種模式,估計會迷路吧,
自身總結了一套學習方法,大致如下三點,勤加練習,一般性模塊可以看的非常快,
1、高度抽象,構建框架
2、重要函式,深究細節
3、善用工具,及時總結
下班再補充具體細節~
Android原始碼非常龐大,但設計很精妙,縱向分層,橫向模塊化,使得整個原始碼更易更新和維護,在手機廠商做framework的更傾向于說自己是做Android系統的,維護的模塊主要包括ActivityManagerService、WindowManagerService、PackageManagerService、PowerManagerService、SurfaceFlinger、通信模塊、多媒體模塊等,Android系統良好的模塊化設計使得各個模塊負責人只需搞懂自己的模塊就可以勝任作業,但是搞定自己的模塊并不那么容易,對于新人一般要大概做半年才能掌握其精要,有的做了一年發現還有很多點沒有掌握,這也是很常見的,
對于應用開發者來說,他們并不需要修改系統代碼,學習framework只是為了了解并理解某個API呼叫底層的運行機制,要學到這個深度級別還是比較容易的,
首先必須了解一些背景知識,1??Android系統采用C/S架構;2??絕大部分IPC通信采用Binder通信;3??核心Service大多運行在System_server行程;4??核心Service代碼大部分都在frameworks/base/services目錄下;⑤別一上來就看Binder!!!6??別一開始看原始碼就鉆牛角尖!!!
以下便是我的學習方法,不保證適合其他人,供參考,
首先,大概了解下該Service是干什么的,我會搜一些好的分析文章收藏起來,大概瀏覽下該Service為上層應用提供了什么功能?(這些文章并不會去挨個讀,這跟絕大多數人習慣不一樣,他們一般是一邊看分析文章一邊看原始碼),在原始碼里找到原始碼檔案,大概看下核心幾個檔案開頭的注釋,注釋一般會說的非常清楚這個是干嘛的,(我用source insight看原始碼)
然后,可以嘗試寫一個小demo,方便除錯Service內部方法或抓取系統日志來追蹤代碼流程,運行在system_server行程中的Java代碼均可使用Android studio除錯,當然必須是自己編譯的image才行,MTK平臺手機部分service是可以通過adb shell dumpsys XXX log XX來開啟對應service的log,
接著,從核心API呼叫入手,一步一步分析原始碼,理出一個從應用端到Service端,最后回到應用端的函式呼叫鏈,這條呼叫鏈必定很長很長,有非常多的分支,還會出現非常多的類,這個時候就要抓住主線不放,細枝末節可以不管,借助UML工具了,一般畫兩個圖就夠了,一個是類圖,一個是時序圖,畫圖要精簡,只畫重要的主線分支時序圖和主要的類關系,這個步驟最難的是理出主線分支呼叫,切記鉆牛角尖偏離目標任務,只需理出一個client-->service-->client的框架即可,將時序圖畫出來后,整個框架便構建出來了,(我用starUML工具)
然后,在上面的框架中必定有幾個非常關鍵的函式,把它搞定,搞定方法就是一行一行讀代碼,讀懂每一行并不容易,需要聯系背景關系進行理解,從重要函式中要理清service是如何管理target的,比如AMS是使用Stack和Task來管理Activity的,使用兩個佇列來處理廣播,扮演連接者將client和目標ContentProvider建立起連接等,這個程序也是最花時間的,因為你需要從原始碼里面盡可能地還原作者的設計思想,還原的越徹底,理解的越透徹,一般我是一邊理解一邊用筆記記錄自己的理解,(我用有道云筆記)
最后,整理出一篇筆記,方便以后回顧,在前面兩步做完,圖有了,分析也有了,稍微整理下便成了一篇檔案,一般情況下是這樣的,今天你理解的差不多了,一個月后你估計只記得大概個輪廓,細節全忘了,兩個月后估計連輪廓都忘了,相信我,這時最管用的就是那兩個圖了,一看就能讓你想起80%,所以我非常喜歡畫類圖和時序圖,
這是我自己整理的一篇筆記,可以找我來拿
地址:【Android技術交流】
https://jq.qq.com/?_wv=1027&k=I3yi18b8

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/341918.html
標籤:其他
