題外話
18 年我從 Android 應用開發轉 Framework 層開發了,從此開啟了 996 幸福生活,博客技術文更新基本停滯了,被工作占據了過多的精力,實在沒時間像以前一樣擬稿、寫作,實踐、反復修改去精心准備文章,另外也不知道該寫什么了,很多經驗心得都會涉及到項目本身,公司內部倒是寫了不少總結文檔,然而工作的事不便公開分享出來。我是一個在乎別人的看法,之前被很多人罵“江郎才盡”,其實我是很難受的。
在轉 Framework 其實一開始我是很不適應,適應新環境也並沒有想象當中那么容易,因此變得更不自信了,對自己的定位更加模糊,每半年換一個模塊,從一開始做性能開發、轉系統應用開發、又轉通訊開發,剛有點感覺,因為工作調整,被安排做其他,技術沒沉淀,總感覺虛的很。
Android 系統架構
這是來自官方 Android 系統架構,從上往下依次為應用框架(Application Framework)、Binder IPC proxies、系統服務(Android System Services)、硬件抽象層 (HAL)、Linux 內核。
Application Framework
從舊版架構圖可以看出 Application Framework 大概有:
名稱 | 簡介 |
---|---|
Activity Manager | 用來管理應用程序生命周期並提供常用的導航回退功能。 |
Window Manager | 提供一些我們訪問手機屏幕的方法,如屏幕的透明度、亮度、背景。 |
Content Providers | 使得應用程序可以訪問另一個應用程序的數據(如聯系人數據庫), 或者共享它們自己的數據。 |
View System | 可以用來構建應用程序, 它包括列表(Lists),網格(Grids),文本框(Text boxes),按鈕(Buttons), 甚至可嵌入的 web 瀏覽器。 |
Notification Manager | 使得應用程序可以在狀態欄中顯示自定義的提示信息。 |
Package Manager | 提供對系統的安裝包的訪問,包括安裝、卸載應用,查詢 permission 相關信息,查詢 Application 相關信息等。 |
Telephony Manager | 主要提供了一系列用於訪問與手機通訊相關的狀態和信息的方法,查詢電信網絡狀態信息,SIM 卡的信息等。 |
Resource Manager | 提供非代碼資源的訪問,如本地字符串,圖形,和布局文件(Layout files )。 |
Location Manager | 提供設備的地址位置的獲取方式,很顯然,GPS 導航肯定能用到位置服務。 |
XMPP | 可擴展通訊和表示協議,前身為 Jabber,提供即時通信服務。例如推送功能,Google Talk。 |
Binder IPC proxies
Binder 作為 Android 系統提供的一種通信方式,
Binder IPC 層:作為「系統服務層」與「應用程序框架層」的 IPC 橋梁,互相傳遞接口調用的數據,實現跨進層的通訊。
Android System Services
Android System Services 是專注於特定功能的模塊化組件,如進行窗口相關的操作會用到窗口管理服務WindowManager
,進行電源相關的操作會用到電源管理服務PowerManager
,還有很多其他的系統管理服務,如通知管理服務NotifacationManager
、振動管理服務Vibrator
、電池管理服務BatteryManager
等。應用框架 API 所提供的功能可與系統服務通信,以訪問底層硬件。
Android 包含兩組服務:“系統”(諸如窗口管理器和通知管理器之類的服務)和“媒體”(與播放和錄制媒體相關的服務)。
名稱 | 簡介 |
---|---|
PowerManagerService | 電源管理服務 |
WindowManagerService | 最核心的服務之一,負責窗口管理 |
ActivityManagerService | 最核心的服務之一,管理 Activity |
PackageManagerService | 程序包管理服務 |
AccountManagerService | 賬戶管理服務,是指聯系人賬戶 |
ContentService | ContentProvider 服務,提供跨進程數據交換 |
BatteryService | 電池管理服務 |
LightsService | 自然光強度感應傳感器服務 |
VibratorService | 震動器服務 |
AlarmManagerService | 定時器管理服務,提供定時提醒服務 |
BluetoothService | 藍牙服務 |
DevicePolicyManagerService | 提供一些系統級別的設置及屬性 |
StatusBarManagerService | 狀態欄管理服務 |
ClipboardService | 系統剪切板服務 |
InputMethodManagerService | 輸入法管理服務 |
NetworkStatsService | 網絡狀態服務 |
NetworkManagementService | 網絡管理服務 |
ConnectivityService | 網絡連接管理服務 |
MountService | 掛載服務 |
NotificationManagerService | 通知欄管理服務 |
DeviceStorageMonitorService | 磁盤空間狀態檢測服務 |
LocationManagerService | 地理位置服務 |
SearchManagerService | 搜索管理服務 |
WallpaperManagerService | 牆紙管理服務,牆紙不等同於桌面背景,在 View 系統內部,牆紙可以作為任何窗口的背景 |
AudioService | 音頻管理服務 |
BackupManagerService | 系統備份服務 |
AppWidgetService | Widget 服務 |
DiskStatsService | 磁盤統計服務 |
SurfaceFlinger | 負責 Layer 合成(composer),創建 surface,管理 surface |
硬件抽象層 (HAL)
HAL 可定義一個標准接口以供硬件供應商實現,該接口使 Android 無需考慮底層驅動程序的實現。使用 HAL 可使您實現功能而不會影響或修改更高級別的系統。HAL 實現會被封裝成模塊,並會由 Android 系統適時地加載。
Linux 內核
Android 基於 Linux 提供核心系統服務,如顯示驅動、Camera 驅動、藍牙驅動、音頻系統驅動、Binder (IPC) 驅動、USB 驅動、WiFi 驅動、電源管理等。
Linux 內核也作為硬件和軟件之間的抽象層,它隱藏具體硬件細節而為上層提供統一的服務。
開發
谷歌發布版本,就是 AOSP 原生代碼。AOSP 原生代碼只支持極少數幾款手機,比如 Pixel。
芯片廠商如高通、MTK、展銳在 AOSP 基礎上發布自己的版本,每個芯片廠商會在 AOSP 原生代碼上疊加自己的功能,比如雙卡雙待功能。
我們開發就是芯片商釋放的代碼,我們工作大部分就是解 Bug,比較低級,有部分需求定制,也基本是依賴芯片商支持。
從編程語言上來說,Android 系統層有很大一部分是用 Java 開發的。另外還有一大部分是用 Native(C/C++)語言開發的,要想在這個領域做到游刃有余,對 Java 和 C++語言要了解。
Android 系統開發涉及知識點非常多,需要潛下心來學習,目前我做的是多媒體顯示服務模塊,已經有段時間了,還只是知道的皮毛,路漫漫其修遠兮,吾將上下而求索,想成為該領域的專家,還任重道遠。