Android筆記(1):發展歷史與系統架構

Photo by Denny Müller on Unsplash


因為疫情的關係,最近空出一些時間,想學如何撰寫手機 APP 應用程式,之前在實作使用手機藍芽與傳感器之間的控制時,大概瞭解如何使用 App Inventor 的圖形介面設計手機應用程式,覺得 App Inventor 的圖像操作方式比較像是讓初學程式者能夠更快上手,對於我有點程式基礎,覺得有點簡單,於是打算每天利用幾個小時來學習 Android 程式開發的介面,順便將多年前學習的 Java 程式熟悉一下,考量我的電腦是 Wintel 機種,如要撰寫 iOS 程式,還要去找一台 Macbook 才會比較方便,礙於設備關係,就先從 Android 著手。之後的文章會陸續整理撰寫 Android 程式的重要資料,我們先從 Android 的歷史開始。


[Android 歷史簡介]

Android 一個以 Linux 為基礎的半開放原始碼操作系统,主要用於移动設備,最初由安迪·鲁宾(Andy Rubin)開發製作,主要是支援手機,於2005年8月被 Google 收購。
2007年11月,Google 與 84 家硬體製造商、軟體開發商及電信營運商成立開放手機聯盟來共同研發 Android,任何廠商都不須經過 Google 和開放手持裝置聯盟的授權隨意使用 Android 作業系統;但是製造商不能在未授權下在產品上使用 Google 的標誌和應用程式。
Android是一個全身綠色的機器人,半圓形的頭部,有兩支天線和空白的點作為眼睛。它的頭部與身體之間有空白的區域,相似於一枚有平底的雞蛋,兩側各有兩個圓角矩形,作為它的雙臂。歷年來 Android 換過幾次商標 Logo,使用年份與圖標如下:
來源:1000Logos

Android作業系統有預發行的內部版本,分別為原子小金剛(Astro)與機器人班亭(Bender,電視動畫《飛出個未來》的角色)。從2009年5月開始,Android的版本代號改以甜點來命名,且每個代號間的字首以英文字母序接續排列:Cupcake(紙杯蛋糕)、Donut(甜甜圈)、Eclair(閃電泡芙)....Oreo(奧利奧)、Pie(派)等命名方式,直到 2019年8月23日,Google宣布從Android Q開始不再以甜品命名,且直接稱Android Q為Android 10。


為了加速 Android 平台軟體的開發,Google 於 2008 年九月首先釋出第一版的 SDK 1.0 Release 1 供開發人員使用,之後,則規律的釋出新版本的 SDK。

若要瞭解更多 Android 的歷史,可參考 維基百科 Android 的介紹。相關發展版本的歷史也可以參考 Android 版本列表。


[Android作業系統架構]

Android 是執行於 Linux kernel 之上,但並不是 GNU/Linux。因為在一般GNU/Linux裏支援的功能,Android大都沒有支援,包括 Cairo、X11、Alsa、FFmpeg、GTK、Pango及Glibc等都被移除掉了。有一些由C所寫的中介軟體、函式庫和應用程式介面,以及運行包含 Java 相容庫的應用框架上應用程式。Linux 核心的開發則繼續獨立於 Android 的其他原始碼項目。Android 的作業系統架構如下圖:

Android 的作業系統架構圖(來源:Wiki)

  • 系統應用層(System Apps)
  使用者安裝的應用程式,如郵件、簡訊、地圖等,或是可從 Google Play商店下載安裝的應用程式。

  • 應用框架層(Java API Framework)
  主要提供構建應用程序時可能用到的各種 API,Android 本身就有一些核心應用就是使用這些 API 完成的,開發者也可通過使用API,來構建自己的應用程序。

  • 系統運行庫層(Native C/C++ Libraries And Runtimes)
  透過一些 C/C++ 函數庫來為 Android 系統提供支援。如 SQLite 函數庫提供了資料庫支援,OpenGL ES函數庫支援 3D 繪圖等。

  • Android Runtime:
  對於 Android 5.0(API級別21)或更高版本的設備,每個應用都在其自己的程序中運行,並且有其自己的 Android Runtime(ART)實例。例如使用 DEX 在低記憶體設備上運行多個虛擬機,DEX 文件是一種專為 Android 設計的字節碼格式。ART 的部分主要功能包括:
  1. 預先(AOT)和即時(JIT)編譯。
  2. 優化的垃圾回收(GC)。
  3. 在Android 9(API級別28)及更高版本的系統中,支援將應用軟體中的 DEX( Dalvik Executable)格式文件轉換。

  • 硬體抽象層(Hardware Abstraction Layer, HAL)
  HAL的目的是為了把 Android Framework 與 Linux Kernel隔開,定義一個標準的硬體介面以供硬體供應商使用,可讓 Android 忽略較低層次的驅動程序開發,把一部分驅動功能放到 HAL 層中。為什麼要麻煩地增加一個 HAL?其實是為了保護廠商開發的原始碼,由於 Linux內核採用了 GPL 協議,所以硬體生產商想要支持 Linux 系統,必須遵照 GPL 協議公開硬體驅動的原始源。但這些原始碼中包含有許多硬體的設計信息,攸關硬體生產商的核心利益。增加了 HAL 層之後,硬體廠商就不需要開放所有的驅動程式碼了。

  • Linux內核層(Linux Kernel)及電源管理(Power Management)
  Android系統基於 Linux2.6 內核,這一層為 Android 設備各種硬件提供了底層驅動,如顯示、音效、照相機、藍牙、Wi-Fi等驅動,也包括電源管理、喚醒鎖定等程式。


[Android 應用程式組件]

Android 的應用程式由以下四種組件(Component)組成,這些組件可互相搭配來構建應用程式所有功能。
  • Activity 活動
  Activity 是與用戶交互的入口點,比如說一個進入畫面或功能表時,每個 Activity 都是一個獨立的元件個體,可利用 Intent 意圖的設計,在不同 Activity 間切換,Activity 是繼承自 android.app.Activity 的子類別。

  • Service服務
  Servie 服務是用於在背景執行的一種 Java 類別,用於執行長時間執行,且不需與用戶互動的作業。例如下/上載檔案或與網路連線等。

  • Broadcast Receiver 廣播接收器
  廣播接收器這個元件能夠傾聽特定的事件,進行接收並做出回應,不需用到使用者介面。例如撥出電話、螢幕關閉等,可以啟動一個 activity 或 serice 來回應它們收到的資訊。或是使用 NotificationManager來通知使用者,如震動、播放聲音等,或呈現一個圖示視窗等。

  • Content Provider 內容提供器
  內容提供器管理一組共享的資料,可將這些資料儲存在文件檔案、SQLite 資料庫、網路中或者其他儲存位置。在預設的情況下,這個共享的資料庫只允許該應用程式內的元件可以存取,但透過 Content Provider 的共享機制,將這些資料提供出來,讓其他的應用程式也能夠讀取。例如應用程式可透過內容提供器讀取裝置上的聯絡人資料。

上述的四種組件可搭配組合成 Android 應用程式,這些組件的項目與應用會在 AndroidManifest.xml 檔案中描述,稍後的筆記中會瞭解這個檔案的用途。除此,還有其他額外的組件(Component)用來建構上述提到的應用以及邏輯等,這些組件包括以下各項:
組件說明
Fragments用來呈現在 Activity 活動中用戶界面的一部分。
Views在螢幕上繪製的 UI 元件,如按鈕,列表表單等。
Layouts控制 View 的格式、外觀以及層次結構等。
Intents將各組件間用訊息連接起來。
Resources外部元素,例如字符串,常數和可繪製圖片。
Manifest應用程式的設定檔。


[參考資料]


Post a Comment

較新的 較舊