本章節對Android
架構做個簡介,同時介紹AOSP
原始碼架構。
首先大家要有一個認識:Android是由許多跑在Linux Kernel
上的User Space Process
合作運行的。
在進入AOSP
資料夾的細節前,先讓我們了解Android整體的架構,看看裡面有哪些寶可以挖吧!
這邊主要提供Android Java
層和C++
層的API
。開發App
時用的class
和function
就是由這裡提供的。要注意這裡包含了C++
層--事實上Android Framework主要是用C++
寫的!
那為什麼我們是用Java
寫Android app呢?其實是因為Android Framework在啟動的最後階段準備了一個JVM
,並在所有C++
層的部份準備完成後切到JVM
上,並執行Android Framework中Java
的程式碼。這些Java
程式碼會使用JNI
來使用C++
相關的API
(包括公開給app使用的以及framework專用的)。而負責載入app
的部份會用JVM
來執行我們寫的app
,所以android app
才可以用Java
寫。當然啦,如果想要的話其實你也可以用C++
寫,不過工具和資源就不像Java
這麼多。
另外其實這些C++
frameworkAPI
可以讓我們可以寫純C++
程式,並在AOSP
環境編譯。編譯出來的執行檔可以用adb
放到你的裝置上執行。
負責處理IPC(Inter Process Communication)
相關的機制。如果你用過Handler
、IBinder
或Context.getSystemService(String)
等一些可以跨行程的API
,就是由這裡集中處理的。Android的IPC
機制通常也是研究AOSP
的重點之一。
Android系統提供的服務,像是WindowManager
、ActivityManager
、TelephonyManager
、PackageManager
及PowerManager
等等,都是這層提供的服務。
即Hardware Abstract Layer
,直譯就是硬體抽象層,目的是為了讓driver可以不寫在Linux Kernel
內,藉此避開Linux Kernel
的GPL
授權。HAL可以提供一些特別的feature給framework。各家晶片廠商會花不少心力在這上面。
Kernel必需要先準備好,才行執行Android。負責和硬體溝通的driver會在這裡。另外值得一提的是Android用的Linux Kernel
是特製的,像是binder driver
就是Linux Kernel
另外加入的部份。(之後再討論這部份)
整個Android framework相關的程式碼全部都在裡面。從C++
($TOP/framework/native
)到Java
($TOP/framework/base
)的程式碼都在這裡面。基本上開發AOSP
時我們大多都是在修改/研究這個資料夾。
以下$TOP
指AOSP的根目錄。
以開發AOSP
來說,最主要看的程式碼會在:
$TOP/framework
- 整個Android framework最主要的程式碼$TOP/external
- 編譯Android時需要的外部library$TOP/hardware
-HAL
層相關程式碼$TOP/system
- 負責Android framework在啟動前要處理的事。Android的第一行程式碼在這裡面$TOP/out
- 編譯AOSP
後才會出現。所有編譯的暫用檔和結果都會在這個資料夾內。
AOSP
有用到的外部libraries都會放在這邊。追source code比較深的話就會進來這裡看。
HAL
層相關。HAL
為Hardware Abstract Layer
的縮寫。
各家廠商由於商業機密的關係,很多driver相關的程式碼是不願意公開的。而AOSP
為了閃Linux Kernel
的GPL
授權,所以做了一個能在user space
執行的driver架構。由於HAL
相關的程式碼沒有要求也用GPL
授權,所以各家廠商為HAL
寫的程式碼就不用公開了。
簡單描述一下其它比較重要,但不在我們研究範圍內的資料夾
這邊放的是AOSP
中編譯相關的工具
AOSP
中不是用一般的C library,而是自己做了一個bionic
廠商自製的AOSP
裝置的設定檔會放在這
兩者皆為Android的JVM
cts
測試相關
開發AOSP
的工具集
AOSP
文件相關
TODO: 其它資料夾
到這邊相信你對Android
的大架構及AOSP
原始碼有了一定的了解,接下來讓我們設定Android Studio
來開發AOSP
吧。