Android 源碼結構【搜集】

來源:互聯網
上載者:User
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檔案是運行時真正需要的檔案。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.