今天,明哥想跟你們聊聊,如何從應用開發,轉向Framework開發。java
系統應用開發,如今來講,已經開始脫離系統,單獨拿出來開發,系統定製接口,已提供給應用調用,用來加強功能。linux
原生的桌面,撥號,設置,已經無法作出差別化優點,所以都費盡心機,來進行應用深度開發。網絡
對於以前維護系統應用模塊的人來說,修修補補,真的沒有什麼成長。天天的工做來講,沒有很深的技術壁壘,很容易被別人攻陷。架構
好比設置,好比聯繫人,在小的改動,修改故障的時候,沒有很是高的要求,作過應用開發的,均可以過來參合一腳,改改問題。而讓一個應用開發得去修改系統接口,估計改的心累,而且猶豫不決。框架
技術壁壘,也即是本身的競爭優點。只有頑強的技術能力,並鍥而不捨的學習,擴充本身的深度,廣度,那麼你的位置則牢不可破,不會輕易被替代。編輯器
這節,明哥從自身的角度,講講系統應用開發,該如何向Framework進軍,進行學習,掌握更加核心的技術。工具
這裏有人會說,我作應用風生水起,也遊刃有餘,不比大家作系統Framework的差,何須把系統應用開發的貶的一文不值。這裏要說一下,文中沒有這個意思,你的應用作的有聲有色,賺的盆滿鉢滿,這裏確定有其因素。好比它的性能,它的界面絢麗,百變主題。或者它有智能識別,等等。這些都叫作差別化產品,有其亮點,特點,才能殺出重圍。佈局
而系統應用開發,我這裏偏向於手機整機開發中的OEM廠商,主要作出系統,可以保證功能正常,不會花費大量人力精力去作應用深度開發,系統重構的。這裏主要會以追求速度,同時知足客戶的硬件要求,好比多個霍爾器件,多個溫度傳感器,多個皮套功能,等等,但不多去大量改動應用架構,以避免影響最終量產。性能
以上,就是特指的這個應用開發人員。隨後,我來說講,Framework須要掌握哪些知識呢?學習
①操做系統。
熟悉個人人都知道,我特喜歡把這個放在第一位,緣由很簡單,它確實支撐了我隨後的全部知識根基,讓我可以從容不迫的,將一個個系統拆解出來。
咱們就拿安卓來說,啓動過程
跟linux一模一樣,因此很容易遷移過來,同時,差別化的init進程,完成初始任務,建立安卓世界的孵化器,既然這裏要進入安卓世界,而安卓世界的基礎語言是java,那麼就須要一個Java虛擬機,因而孵化器就要構造一個虛擬機,用來解析執行Java編譯出來的字節流。而孵化器自己是由c cpp語言實現,因而Java虛擬機就是由c cpp語言寫出來的,linux操做系統也是c(還有一些彙編)寫出來的,因而Java虛擬機運行的Java語言,就須要跟c cpp打交道,因而就有了JNI。
孵化器作了幾件事情:
1完成Java虛擬機的構造
2完成JNI對接Java與c的橋樑
3加載公共的共享庫
4等待別人給它發消息,建立新進程
在這期間,孵化器要作一件事情,即是建立system_server ,這個進程要作什麼呢?咱們建立了一個能夠運行Java的虛擬機,這時咱們就要提供一堆系統接口,用來協助應用開發,好比請求網絡啦,好比建立界面啦,好比定位啦,獲取存儲卡啦,等等支持,方便用戶開發功能。一個平臺的好壞,每每取決於它的功能是否強大,是否有豐富的技術文檔,以及開發調試工具。
因此就有了一堆線程,好比AMS,WMS,PMS,BT,WIFI,這些均可以在/proc/{ system_server_pid}/ tast找到記錄。
有了這些線程,那麼咱們就能夠輕鬆的去實現不少功能啦。這時咱們就要配套的開發工具,好比AS編輯器,能夠編輯,編譯出來APK,安裝到手機運行。
關於操做系統,須要掌握的知識點爲:
1進程,線程概念
2互斥,死鎖機制與原理,如何避免死鎖
3內存管理機制,虛擬內存
4靜態庫與動態庫的區別
5進程之間的內存屏障,如何通訊(IPC)
6binder的通訊優點
這裏先想到這些,注意不是要完成懂全部機制,要的是總體理解便可。以下問題,請思考下,看是否可以答上來。
1 若是我寫了一個應用,名字叫作,com.codegg.home 在主activity裏面,加載一個佈局,layout_main. xml,佈局裏面寫入了一個TextView,那麼我想調試這個TextView,要在com.codegg.home這個進程下斷點,仍是在system_server進程下斷點呢?若是是想調試ActivityThread. java的話?應該在哪一個進程下斷點呢?
以上答案,都是com.codegg.home下斷點,緣由是這兩個當前的運行進程,都是在com.codegg.home裏,因此要調試的話,要在com.codegg.home進程下斷點。
那麼咱們再來思考下,我如今要去追應用的啓動過程,start Activity的流程,要在哪一個地方下斷點呢?
咱們知道這個流程,最終核心的都在Activity manager server裏面,而它是在system server進程裏面,以一個線程的狀態存在,因而咱們要調試,就要在system server上面下斷點了。
若是你對這幾個問題,沒有疑惑,恭喜你,進程和線程,你已經有了概念了。
------------未完待續----------