來源:Google Android源代码结构 zz – - JavaEye技术网站
Google提供的Android手機開發平台包含了原始Android的目標機代碼,主機編譯工具、仿真環境,代碼包經過解壓縮後,第一級別的目錄和文件如下所示:
. |-- Makefile (全局的Makefile) |-- bionic (Bionic含義為仿生,這裡面是一些基礎的庫的源代碼) |-- bootloader (引導加載器) |-- build (build目錄中的內容不是目標所用的代碼,而是編譯和配置所需要的腳本和工具) |-- dalvik (JAVA虛擬機) |-- development (程序開發所需要的模板和工具) |-- external (目標機器使用的一些庫) |-- frameworks (應用程序的框架層) |-- hardware (與硬件相關的庫) |-- kernel (Linux2.6的源代碼) |-- packages (Android的各種應用程序) |-- prebuilt (Android在各種平台下編譯的預置腳本) |-- recovery (與目標的恢復功能相關) \-- system (Android的底層的一些庫)
bionic目錄展開一個級別的目錄如下所示:
bionic/ |-- Android.mk |-- libc |-- libdl |-- libm |-- libstdc++ |-- libthread_db \-- linker
bootloader目錄展開的兩個級別目錄:
bootloader/ \-- legacy |-- Android.mk |-- README |-- arch_armv6 |-- arch_msm7k |-- fastboot_protocol.txt |-- include |-- libboot |-- libc |-- nandwrite \-- usbloader
build目錄展開的一個級別的目錄如下所示:
build/ |-- buildspec.mk.default |-- cleanspec.mk |-- core (各種以mk為結尾的文件,它門是編譯所需要的Makefile) |-- envsetup.sh |-- libs |-- target (包含board和product兩個目錄,為目標所需要文件) \-- tools (編譯過程中主機所需要的工具,一些需要經過編譯生成)
其中,core中的Makefile是整個Android編譯所需要的真正的Makefile,它被頂層目錄的Makefile引用。
envsetup.sh是一個在使用仿真器運行的時候,用於設置環境的腳本。
dalvik目錄用於提供Android JAVA應用程序運行的基礎————JAVA虛擬機。
development目錄展開的一個級別的目錄如下所示:
development |-- apps (Android應用程序的模板) |-- build (編譯腳本模板) |-- cmds |-- data |-- docs |-- emulator (仿真相關) |-- host (包含windows平台的一些工具) |-- ide |-- pdk |-- samples (一些示例程序) |-- simulator (大多是目標機器的一些工具) \-- 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文件是運行時真正需要的文件。






最新回應