1. 程式人生 > >Android 如何從應用深入到Framework (一)

Android 如何從應用深入到Framework (一)

image

今天,明哥想跟大家聊聊,如何從應用開發,轉向Framework開發。

系統應用開發,現在來說,已經開始脫離系統,單獨拿出來開發,系統定製介面,已提供給應用呼叫,用來增強功能。

原生的桌面,撥號,設定,已經沒法做出差異化優勢,因此都費盡心機,來進行應用深度開發。

對於之前維護系統應用模組的人來講,修修補補,真的沒有什麼成長。每天的工作來說,沒有很深的技術壁壘,很容易被別人攻陷。

比如設定,比如聯絡人,在小的改動,修改故障的時候,沒有非常高的要求,做過應用開發的,都可以過來參合一腳,改改問題。而讓一個應用開發得去修改系統介面,估計改的心累,並且猶豫不決。

技術壁壘,也便是自己的競爭優勢。只有頑強的技術能力,並持之以恆的學習,擴充自己的深度,廣度,那麼你的位置則牢不可破,不會輕易被替代。

這節,明哥從自身的角度,講講系統應用開發,該如何向Framework進軍,進行學習,掌握更加核心的技術。

這裡有人會說,我做應用風生水起,也遊刃有餘,不比你們做系統Framework的差,何必把系統應用開發的貶的一文不值。這裡要說一下,文中沒有這個意思,你的應用做的有聲有色,賺的盆滿鉢滿,這裡肯定有其因素。比如它的效能,它的介面絢麗,百變主題。或者它有智慧識別,等等。這些都叫做差異化產品,有其亮點,特色,才能殺出重圍。

而系統應用開發,我這裡偏向於手機整機開發中的OEM廠商,主要做出系統,能夠保證功能正常,不會花費大量人力精力去做應用深度開發,系統重構的。這裡主要會以追求速度,同時滿足客戶的硬體要求,比如多個霍爾器件,多個溫度感測器,多個皮套功能,等等,但很少去大量改動應用架構,以免影響最終量產。

以上,就是特指的這個應用開發人員。隨後,我來講講,Framework需要掌握哪些知識呢?

①作業系統。

熟悉我的人都知道,我特喜歡把這個放在第一位,原因很簡單,它確實支撐了我隨後的所有知識根基,讓我能夠從容不迫的,將一個個系統拆解出來。

我們就拿安卓來講,啟動過程

Android 啟動過程框架

跟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上面下斷點了。

如果你對這幾個問題,沒有疑惑,恭喜你,程序和執行緒,你已經有了概念了。

  ————未完待續———-