讚賞,轉發,都是大愛
Android 如何從應用深入到Framework (二)
Android 如何從應用深入到Framework (一)
先回答留言提出的問題,當前在做應用開發,想做framework,該如何實施。
我們先來講下framework是什麼。這個單詞的意思為框架,什麼框架呢?我們一個APK由哪些組成呢?
xml配置組件,如何解析這個xml,組件的類別具體如何實現,比如activity生命周期,service啟動過程,廣播的處理流程,前臺廣播,後臺廣播,ANR怎麼產生的,系統怎麼處理的。這些都是系統提供的,這種應用開發,無法繞過的,調用系統方法的這些內容,就是框架。
我們開發應用,主要是用系統接口開發。系統framework的任務是完成系統故障處理,同時擴展功能接口,讓應用調用更多的接口,這塊就是framework要做的事情。
主體框架需要掌握的內容:
1 應用啟動流程
2 應用創建過程,知道fork原理,知道socket通信
3 廣播處理流程,超時響應,系統如何跟應用交互,applicationhandle activitytherad 的關鍵代碼
4 anr是什麼,系統代碼在哪
5 Lmk機制是什麼,怎麼計算的adj,怎麼殺掉進程
6 按鍵處理inputreader,觸屏響應在哪,系統phonewindowmanager的邏輯代碼
7 系統服務對應的jni邏輯,因為要進入linux,必然就變成了本地語言,這塊要學習
8 View的繪製流程,事件傳遞過程,掌握viewrootimpl和window的關聯,和phonewindow的關係
暫時就想到這些,art虛擬機學習,掌握理論就行,懂得它的運行機制,內存管理方案
後續還要繼續深造,就去看驅動添加,系統加載驅動的方式。這裡面涉及了hal 添加,以及linux的哲學,一切都是文件
看驅動,就會發現很多中斷,比如按鍵,觸摸,都是以中斷的方式響應,系統收到中斷,跑到註冊的中斷向量表,查出此中斷位對應的方法回調,按鍵響應方法,拿到按鍵信息,封裝好後,通過sendevent發出去,然後我們的inputreader接到,然後InputDispatcher解析,傳給當前的fouse焦點窗口,然後經過viewRootImpl進行交給當前的跟view,向我們的子view傳遞,進行處理,響應。
android 窗口繪製的一些總結
好了,回到上節問題,繼續來講,程式語言的發展史。
起初,只有打孔紙片,通過它的阻擋光線傳輸,來做到零和一的區分,然後推動硬體執行。如果有個地方錯了,那就重新打孔,很費紙,這點倒是和宅男很像。
打孔是個技術活,要有超強的記憶,00100是加,01100是減,這些口訣都埋藏在心底,傳男不傳女,神秘莫測。於是就很晦澀,像手抄版的書籍,流傳在一小眾手裡,別人如同天書一般,不懂其中真意。
於是,有好事者一看,就拿出來做了個解碼,記錄下來每個序列的真正含義,後來人一看便懂,發現沒有那麼多玄機。
於是
00100 就記作add
01100就記作sub
等等一系列的記錄出來了,而這個記錄最終要回到那些數字,否則機器不懂你這高級語言。
這裡00100就是機器語言,機器執行用的這個,我們寫的時候,add sub替代,這個就是彙編語言了。
彙編語言變成機器語言用了彙編器,將我們描述的可以理解的東西變成機器可以懂的語言。
彙編語言最頭疼的是,我一個函數修改完了,下次修改後,如果寫了好長,我之前寫的跳轉指令,有可能需要從jmp near換成jmp long ,代碼要去修改,寫錯了一出代碼,有可能要全部修正,寫的真累,堆棧都要自己關注。
於是就出現了c語言,解決那些晦澀的前期準備,讓編譯器幫你處理,你只安心的寫自己的代碼,不需關注堆棧平衡,不需關注具體會變成什麼機器語言,這時我們使用arm編譯器就會將此源碼變成arm的彙編語言,然後轉成機器語言,跑在arm板子上。如果我們選擇gcc,編譯linux的elf文件,那麼就在linux可以運行啦。
我們發現這個c可以只寫一份,選擇不同的編譯器,就能編到對應的指令設備中運行。比之前一個個去寫,效率太高了。
c語言太過經典,直接可以嵌入彙編,來完成硬體驅動程序,c裡面存在的都是方法,我們將一個個變量變成結構體來做個整體,但是沒有將方法也歸進來,導致方法和屬性分離,不便於理解。
於是c++出來了類的概念,將屬性和擁有的方法整在一起,作為一個整體出現,對外人來說,一目了然,都有什麼,都可以幹什麼,清清楚楚。
c c++一直一來自己管理內存,於是內存洩露問題太嚴重,嵌入式系統上面,時不時就掛掉了,很是鬱悶,問題出現也不好解決,很難定位,於是就有人琢磨,可不可以自動標記,自動決策釋放內存,讓用戶別在意這個,專心寫代碼。
於是Java就來了。Java搞出來一個標準,在每個平臺都開發出來,讓它寫出來的東西,在每個平臺都能得到解析,正確運行,於是便號稱跨平臺了。實質上是他們在每個平臺做了適配,讓他的東西跑在他們適配好的環境上,即可。
Java語言,是需要編譯成class才能運行。那麼就有人說,我不想編譯,就想寫的直接用,直接改,直接運行多爽。
於是shell perl python就出來了。他們充當了解析器,把語法解析後運行,shell perl以其自由散漫著稱,不是自己寫的,很難讀懂。語法自由,用法多變,格式也比較自由,寫的人暢快淋漓,讀的人淚如雨下。
於是python橫空出世,加入了強制對齊,類的概念進來,讓無組織紀律的腳本語言,能夠走的更加規整一些。
-未完,待續-