Google提供的Android手機開發平台包含了原始Android的目標機代碼,主機編譯工具、模擬環境,程式碼封裝經過解壓縮後,第一層級的目錄和檔案如下所示:
.
|-- Makefile (全域的Makefile)
|-- bionic (Bionic C庫)
|-- bootloader (引導相關代碼)
|-- build (build目錄中的內容不是目標所用的代碼,而是編譯和配置所需要的指令碼和工具)
|-- cts (Android相容性測試套件標準)
|-- dalvik (JAVA虛擬機器)
|-- development (程式開發所需要的模板和工具)
|-- external (目標機器使用的一些庫,android使用的一些開源的模組)
|-- frameworks (應用程式的架構層 核心架構)
|-- fw_tools
|-- hardware (部分廠家開源的硬解適配層HAL代碼)
|-- out (編譯完成後的代碼輸出與此目錄)
|-- kernel (Linux2.6的原始碼)
|-- packages (Android的各種應用程式)
|-- prebuilt (Android在各種平台下編譯的預置指令碼)
|-- sdk (sdk及模擬器)
|-- system (底層檔案系統庫、應用及組件——C語言)
`-- vendor (廠商定製代碼)
bionic目錄展開一個層級的目錄如下所示:
bionic 目錄
|-- libc (C庫)
| |-- arch-arm (ARM架構,包含系統調用彙編實現)
| |-- arch-x86 (x86架構,包含系統調用彙編實現)
| |-- bionic (由C實現的功能,架構無關)
| |-- docs (文檔)
| |-- include (標頭檔)
| |-- inet (inet相關,具體作用不明)
| |-- kernel (Linux核心中的一些標頭檔)
| |-- netbsd (nesbsd系統相關,具體作用不明)
| |-- private (一些私人的標頭檔)
| |-- stdio (stdio實現)
| |-- stdlib (stdlib實現)
| |-- string (string函數實現)
| |-- tools (幾個工具)
| |-- tzcode (時區相關代碼)
| |-- unistd (unistd實現)
| `-- zoneinfo (時區資訊)
|-- libdl (libdl實現,dl是動態連結,提供訪問動態連結程式庫的功能)
|-- libm (libm數學庫的實現,)
| |-- alpha (apaha架構)
| |-- amd64 (amd64架構)
| |-- arm (arm架構)
| |-- bsdsrc (bsd的源碼)
| |-- i386 (i386架構)
| |-- i387 (i387架構)
| |-- ia64 (ia64架構)
| |-- include (標頭檔)
| |-- man (數學函數,尾碼名為.3,一些為freeBSD的庫檔案)
| |-- powerpc (powerpc架構)
| |-- sparc64 (sparc64架構)
| `-- src (原始碼)
|-- libstdc++ (libstdc++ C++實現庫)
| |-- include (標頭檔)
| `-- src (源碼)
|-- libthread_db (多線程程式的調試器庫)
| `-- include (標頭檔)
`-- linker (動態連結器)
`-- arch (支援arm和x86兩種架構)
bootloader目錄展開的兩個層級目錄:
bootloader/
.
|-- bootloader (適合各種bootloader的通用代碼)
| `-- legacy (估計不能直接使用,可以參考)
| |-- arch_armv6 (V6架構,幾個簡單的彙編檔案)
| |-- arch_msm7k (高通7k處理器架構的幾個基本驅動)
| |-- include (通用標頭檔和高通7k架構標頭檔)
| |-- libboot (啟動庫,都寫得很簡單)
| |-- libc (一些常用的c函數)
| |-- nandwrite (nandwirte函數實現)
| `-- usbloader (usbloader實現)
|-- diskinstaller (android鏡像打包器,x86可生產iso)
`-- recovery (系統復原相關)
|-- edify (升級指令碼使用的edify指令碼語言)
|-- etc (init.rc恢複指令碼)
|-- minui (一個簡單的UI)
|-- minzip (一個簡單的壓縮公用程式)
|-- mtdutils (mtd工具)
|-- res (資源)
| `-- images (一些圖片)
|-- tools (工具)
| `-- ota (OTA Over The Air Updates升級工具)
`-- updater (升級器)
build目錄展開的一個層級的目錄如下所示:
.
|-- bootloader (適合各種bootloader的通用代碼)
| `-- legacy (估計不能直接使用,可以參考)
| |-- arch_armv6 (V6架構,幾個簡單的彙編檔案)
| |-- arch_msm7k (高通7k處理器架構的幾個基本驅動)
| |-- include (通用標頭檔和高通7k架構標頭檔)
| |-- libboot (啟動庫,都寫得很簡單)
| |-- libc (一些常用的c函數)
| |-- nandwrite (nandwirte函數實現)
| `-- usbloader (usbloader實現)
|-- diskinstaller (android鏡像打包器,x86可生產iso)
`-- recovery (系統復原相關)
|-- edify (升級指令碼使用的edify指令碼語言)
|-- etc (init.rc恢複指令碼)
|-- minui (一個簡單的UI)
|-- minzip (一個簡單的壓縮公用程式)
|-- mtdutils (mtd工具)
|-- res (資源)
| `-- images (一些圖片)
|-- tools (工具)
| `-- ota (OTA Over The Air Updates升級工具)
`-- updater (升級器)
build目錄
|-- core (核心編譯規則)
|-- history (記錄)
|-- libs
| `-- host (主機端庫,有android “cp”功能替換)
|-- target (目標機編譯對象)
| |-- board (開發平台)
| | |-- emulator (模擬器)
| | |-- generic (通用)
| | |-- idea6410 (自己添加的)
| | `-- sim (最簡單)
| `-- product (開發平台對應的編譯規則)
| `-- security (密鑰相關)
`-- tools (編譯中主機使用的工具及指令碼)
|-- acp (Android "acp" Command)
|-- apicheck (api檢查工具)
|-- applypatch (補丁工具)
|-- apriori (預連結工具)
|-- atree (tree工具)
|-- bin2asm (bin轉換為asm工具)
|-- check_prereq (檢查編譯時間戳工具)
|-- dexpreopt (模擬器相關工具,具體功能不明)
|-- droiddoc (作用不明,java語言,網上有人說和JDK5有關)
|-- fs_config (This program takes a list of files and directories)
|-- fs_get_stats (擷取檔案系統狀態)
|-- iself (判斷是否ELF格式)
|-- isprelinked (判斷是否prelinked)
|-- kcm (按鍵相關)
|-- lsd (List symbol dependencies)
|-- releasetools (產生鏡像的工具及指令碼)
|-- rgb2565 (rgb轉換為565)
|-- signapk (apk簽名工具)
|-- soslim (strip工具)
`-- zipalign (zip archive alignment tool)
其中,core中的Makefile是整個Android編譯所需要的真正的Makefile,它被頂層目錄的Makefile引用。
envsetup.sh是一個在使用模擬器啟動並執行時候,用於設定環境的指令碼。
dalvik目錄用於提供Android JAVA應用程式啟動並執行基礎————JAVA虛擬機器。
development目錄展開的一個層級的目錄如下所示:
|-- apps (一些核心應用程式)
| |-- BluetoothDebug (藍芽偵錯工具)
| |-- CustomLocale (自訂地區)
| |-- Development (開發)
| |-- Fallback (和語言相關的一個程式)
| |-- FontLab (字型檔)
| |-- GestureBuilder (手勢動作)
| |-- NinePatchLab ()
| |-- OBJViewer (OBJ查看器)
| |-- SdkSetup (SDK安裝器)
| |-- SpareParts (進階設定)
| |-- Term (遠程登入)
| `-- launchperf ()
|-- build (編譯指令碼模板)
|-- cmds (有個monkey工具)
|-- data (配置資料)
|-- docs (文檔)
|-- host (主機端USB驅動等)
|-- ide (整合式開發環境)
|-- ndk (本地開發套件——c語言開發套件)
|-- pdk (Plug Development Kit)
|-- samples (常式)
| |-- AliasActivity ()
| |-- ApiDemos (API示範程式)
| |-- BluetoothChat (藍芽聊天)
| |-- BrowserPlugin (瀏覽器外掛程式)
| |-- BusinessCard (商業卡)
| |-- Compass (指南針)
| |-- ContactManager (連絡人管理器)
| |-- CubeLiveWallpaper (動態壁紙的一個簡單常式)
| |-- FixedGridLayout (像是布局)
| |-- GlobalTime (全球時間)
| |-- HelloActivity (Hello)
| |-- Home (Home)
| |-- JetBoy (jetBoy遊戲)
| |-- LunarLander (貌似又是一個遊戲)
| |-- MailSync (郵件同步)
| |-- MultiResolution (多解析度)
| |-- MySampleRss (RSS)
| |-- NotePad (記事本)
| |-- RSSReader (RSS閱讀器)
| |-- SearchableDictionary (目錄搜尋)
| |-- SimpleJNI (JNI常式)
| |-- SkeletonApp (空殼APP)
| |-- Snake (snake程式)
| |-- SoftKeyboard (軟鍵盤)
| |-- Wiktionary (維基)
| `-- WiktionarySimple(維基常式)
|-- scripts (指令碼)
|-- sdk (sdk配置)
|-- simulator (模擬器)
|-- testrunner (測試用)
`-- tools (一些工具)
在emulator目錄中qemud是使用QEMU模擬時目標機器啟動並執行背景程式,skins是模擬時手機的介面。
samples中包含了很多Android簡單工程,這些工程為開發人員學習開發Android程式提供了很大便利,可以作為模板使用。
external目錄展開的一個層級的目錄如下所示:
external/
|-- aes
|-- apache-http
|-- bluez
|-- clearsilver
|-- dbus
|-- dhcpcd
|-- dropbear
|-- elfcopy
|-- elfutils
|-- emma
|-- esd
|-- expat
|-- fdlibm
|-- freetype
|-- gdata
|-- giflib
|-- googleclient
|-- icu4c
|-- iptables
|-- jdiff
|-- jhead
|-- jpeg
|-- libffi
|-- libpcap
|-- libpng
|-- libxml2
|-- netcat
|-- netperf
|-- neven
|-- opencore
|-- openssl
|-- oprofile
|-- ping
|-- ppp
|-- protobuf
|-- qemu
|-- safe-iop
|-- skia
|-- sonivox
|-- sqlite
|-- srec
|-- strace
|-- tagsoup
|-- tcpdump
|-- tinyxml
|-- tremor
|-- webkit
|-- wpa_supplicant
|-- yaffs2
`-- zlib
在external中,每個目錄表示Android目標系統中的一個模組,可能有一個或者若干個庫構成。其中:
opencore為PV(PacketVideo),它是Android多媒體架構的核心。
webkit是Android網路瀏覽器的核心。
sqlite是Android資料庫系統的核心。
openssl是Secure Socket Layer,一個網路通訊協定層,用於為資料通訊提供安全支援。
frameworks目錄展開的一個層級的目錄如下所示:
frameworks/
|-- base
|-- opt
`-- policies
frameworks是Android應用程式的架構。
hardware是一些與硬體相關的庫
kernel是Linux2.6的原始碼
packages目錄展開的兩個層級的目錄如下所示:
packages/
|-- apps
| |-- AlarmClock
| |-- Browser
| |-- Calculator
| |-- Calendar
| |-- Camera
| |-- Contacts
| |-- Email
| |-- GoogleSearch
| |-- HTMLViewer
| |-- IM
| |-- Launcher
| |-- Mms
| |-- Music
| |-- PackageInstaller
| |-- Phone
| |-- Settings
| |-- SoundRecorder
| |-- Stk
| |-- Sync
| |-- Updater
| `-- VoiceDialer
`-- providers
|-- CalendarProvider
|-- ContactsProvider
|-- DownloadProvider
|-- DrmProvider
|-- GoogleContactsProvider
|-- GoogleSubscribedFeedsProvider
|-- ImProvider
|-- MediaProvider
`-- TelephonyProvider
packages中包含兩個目錄,其中apps中是Android中的各種應用程式,providers是一些內容提供者(在Android中的一個資料來源)。
packages中兩個目錄的內容大都是使用JAVA編寫的程式,各個檔案夾的階層是類似的。
prebuilt目錄展開的一個層級的目錄如下所示:
prebuilt/
|-- Android.mk
|-- android-arm
|-- common
|-- darwin-x86
|-- linux-x86
`-- windows
system目錄展開的兩個層級的目錄如下所示:
system/
|-- bluetooth
| |-- bluedroid
| `-- brfpatch
|-- core
| |-- Android.mk
| |-- README
| |-- adb
| |-- cpio
| |-- debuggerd
| |-- fastboot
| |-- include (各個庫介面的標頭檔)
| |-- init
| |-- libctest
| |-- libcutils
| |-- liblog
| |-- libmincrypt
| |-- libnetutils
| |-- libpixelflinger
| |-- libzipfile
| |-- logcat
| |-- logwrapper
| |-- mkbootimg
| |-- mountd
| |-- netcfg
| |-- rootdir
| |-- sh
| `-- toolbox
|-- extras
| |-- Android.mk
| |-- latencytop
| |-- libpagemap
| |-- librank
| |-- procmem
| |-- procrank
| |-- showmap
| |-- showslab
| |-- sound
| |-- su
| |-- tests
| `-- timeinfo
`-- wlan
`-- ti
Android編譯完成後的代碼結構
Android編譯完成後,將在根目錄中產生一個out檔案夾,所有產生的內容均放置在這個檔案夾中。out檔案夾如下所示:
out/
|-- CaseCheck.txt
|-- casecheck.txt
|-- host
| |-- common
| `-- linux-x86
`-- target
|-- common
`-- product
主要的兩個目錄為host和target,前者表示在主機(x86)產生的工具,後者表示目標機(模認為ARMv5)啟動並執行內容。
host目錄的結構如下所示:
out/host/
|-- common
| `-- obj (JAVA庫)
`-- linux-x86
|-- bin (二進位程式)
|-- framework (JAVA庫,*.jar檔案)
|-- lib (共用庫*.so)
`-- obj (中間產生的目標檔案)
host目錄是一些在主機上用的工具,有一些是二進位程式,有一些是JAVA的程式。
target目錄的結構如下所示:
out/target/
|-- common
| |-- R (資源檔)
| |-- docs
| `-- obj (目標檔案)
`-- product
`-- generic
其中common目錄表示通用的內容,product中則是針對產品的內容。
在common目錄的obj中,包含兩個重要的目錄:
APPS 中包含了JAVA應用程式產生的目標,每個應用程式對應其中一個子目錄,將結合每個應用程式的原始檔案產生Android應用程式的APK包。
JAVA_LIBRARIES 中包含了JAVA的庫,每個庫對應其中一個子目錄。
在預設的情況下,Android編譯將產生generic目錄,如果選定產品還可以產生其他的目錄。generic包含了以下內容:
out/target/product/generic/
|-- android-info.txt
|-- clean_steps.mk
|-- data
|-- obj
|-- ramdisk.img
|-- root
|-- symbols
|-- system
|-- system.img
|-- userdata-qemu.img
`-- userdata.img
在generic/obj/APPS目錄中包含了各種JAVA應用,與common/APPS相對應,但是已經打成了APK包。
system目錄是主要的檔案系統,data目錄是存放資料的檔案系統。
obj/SHARED_LIBRARIES中存放所有動態庫。
obj/STATIC_LIBRARIES中存放所有靜態庫。
幾個以img為結尾的檔案是幾個目標映像檔案,其中ramdisk是作為記憶體盤的根檔案系統映像,system.img是主要檔案系統的映像,這是一個比較大的檔案,data.img是資料內容映像。這幾個image檔案是運行時真正需要的檔案。