Skip to content

Latest commit

 

History

History
 
 

ch6_aosp_overview

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 

AOSP 架構總覽

上一章:使用adb工具開發AOSP

本章節對Android架構做個簡介,同時介紹AOSP原始碼架構。

首先大家要有一個認識:Android是由許多跑在Linux Kernel上的User Space Process合作運行的。

Android 架構

在進入AOSP資料夾的細節前,先讓我們了解Android整體的架構,看看裡面有哪些寶可以挖吧!

Aplication Framework

這邊主要提供Android Java層和C++層的API。開發App時用的classfunction就是由這裡提供的。要注意這裡包含了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放到你的裝置上執行。

Binder IPC Proxies

負責處理IPC(Inter Process Communication)相關的機制。如果你用過HandlerIBinderContext.getSystemService(String)等一些可以跨行程的API,就是由這裡集中處理的。Android的IPC機制通常也是研究AOSP的重點之一。

Android System Service

Android系統提供的服務,像是WindowManagerActivityManagerTelephonyManagerPackageManagerPowerManager等等,都是這層提供的服務。

HAL

Hardware Abstract Layer,直譯就是硬體抽象層,目的是為了讓driver可以不寫在Linux Kernel內,藉此避開Linux KernelGPL授權。HAL可以提供一些特別的feature給framework。各家晶片廠商會花不少心力在這上面。

Linux Kernel

Kernel必需要先準備好,才行執行Android。負責和硬體溝通的driver會在這裡。另外值得一提的是Android用的Linux Kernel是特製的,像是binder driver就是Linux Kernel另外加入的部份。(之後再討論這部份)

$TOP/framework

整個Android framework相關的程式碼全部都在裡面。從C++$TOP/framework/native)到Java$TOP/framework/base)的程式碼都在這裡面。基本上開發AOSP時我們大多都是在修改/研究這個資料夾。

AOSP Source Code Overview

以下$TOP指AOSP的根目錄。

以開發AOSP來說,最主要看的程式碼會在:

  • $TOP/framework - 整個Android framework最主要的程式碼
  • $TOP/external - 編譯Android時需要的外部library
  • $TOP/hardware - HAL層相關程式碼
  • $TOP/system - 負責Android framework在啟動前要處理的事。Android的第一行程式碼在這裡面
  • $TOP/out - 編譯AOSP後才會出現。所有編譯的暫用檔和結果都會在這個資料夾內。

$TOP/external

AOSP有用到的外部libraries都會放在這邊。追source code比較深的話就會進來這裡看。

$TOP/hardware

HAL層相關。HALHardware Abstract Layer的縮寫。 各家廠商由於商業機密的關係,很多driver相關的程式碼是不願意公開的。而AOSP為了閃Linux KernelGPL授權,所以做了一個能在user space執行的driver架構。由於HAL相關的程式碼沒有要求也用GPL授權,所以各家廠商為HAL寫的程式碼就不用公開了。

其它重要的資料夾

簡單描述一下其它比較重要,但不在我們研究範圍內的資料夾

$TOP/build

這邊放的是AOSP中編譯相關的工具

$TOP/bionic

AOSP中不是用一般的C library,而是自己做了一個bionic

$TOP/device

廠商自製的AOSP裝置的設定檔會放在這,可以在裡面看到 htc, huawei, moto...等廠商。理論上,公司新增的資料夾會在這裡,雖然 Android 並沒有強迫這麼做(Samsung 不在裡面)。

其它資料夾

$TOP/art & $TOP/dalvik

兩者皆為Android的JVM

$TOP/cts

cts測試相關

$TOP/development

開發AOSP的工具集

$TOP/doc

AOSP文件相關

$TOP/bootable

啟動或是引導相關的C++語言程式碼,可以在 recovery 資料夾中看到, install.cpp 安裝, ui.cpp 顯示UI, adb_install.cpp adb安裝...。

$TOP/dalvik

dalvik虛擬機

Java字節碼(bytecode)被轉換成Dalvik虛擬機所使用的替代指令集。 一個未壓縮dex檔案通常稍小於一個已經壓縮的.jar檔。

$TOP/out

編譯完後的程式碼會存在這個目錄裡面,不同平台編譯出來的產物會不太一樣。

$TOP/packages

可以在裡面看到

  • App (應用程式) :
    鬧鐘,電視,計算機,照相機...等各種APP。
  • inputmethods(輸入法):
    LatinIME 拉丁文輸入法,OpenWnn 輸入法。
  • providers (提供器):
    CalendarProvider聯絡人提供器,CalendarProvider 日曆提供器,DownloadProvider 下載提供器...

$TOP/system

使用C語言的比較底層的應用,例如:打開 Core 可以看到 fastboot 快速啟動相關, init 的原始碼, libcrypto_utils 加密相關,logcat log工具 ...

$TOP/tools

工具

$TOP/sdk

SDK 和模擬器

$TOP/pdk

$TOP/platform_testing

$TOP/prebuilts

$TOP/toolchain

$TOP/developers

$TOP/kernel

$TOP/libcore

$TOP/libnativehelper

TODO: 其它資料夾

完成!

到這邊相信你對Android的大架構及AOSP原始碼有了一定的了解,接下來讓我們設定Android Studio來開發AOSP吧。

下一章:設定 Android Studio

Reference