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 anddirectories)
|--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目录用于提供AndroidJAVA应用程序运行的基础————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 SocketLayer,一个网络协议层,用于为数据通讯提供安全支持。
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
|--GoogleSubscribedFeedsPro vider
|-- 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文件是运行时真正需要的文件。
.
|--Makefile
|--bionic
|--bootloader
|--build
|--cts
|--dalvik
|--development
|--external
|--frameworks
|-- fw_tools
|--hardware
|--out
|--kernel
|--packages
|--prebuilt
|-- sdk
|--system
`--vendor
bionic目录展开一个级别的目录如下所示:
bionic 目录
|--libc
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|--libdl
|--libm
|
|
|
|
|
|
|
|
|
|
|
|
|--libstdc++
|
|
|--libthread_db
|
`--linker
`--arch
bootloader目录展开的两个级别目录:
bootloader/
.
|--bootloader
|
|
|
|
|
|
|
|
|--diskinstaller
`--recovery
|--edify
|--etc
|--minui
|--minzip
|--mtdutils
|--res
|
|--tools
|
`--updater
build目录展开的一个级别的目录如下所示:
.
|--bootloader
|
|
|
|
|
|
|
|
|--diskinstaller
`--recovery
|--edify
|--etc
|--minui
|--minzip
|--mtdutils
|--res
|
|--tools
|
`--updater
build目录
|--core
|--history
|--libs
|
|--target
|
|
|
|
|
|
|
`--tools
|--acp
|--apicheck
|--applypatch
|--apriori
|--atree
|--bin2asm
|--check_prereq
|--dexpreopt
|--droiddoc
|--fs_config
|--fs_get_stats
|--iself
|--isprelinked
|--kcm
|--lsd
|--releasetools
|--rgb2565
|--signapk
|--soslim
`--zipalign
其中,core中的Makefile是整个Android编译所需要的真正的Makefile,它被顶层目录的Makefile引用。
envsetup.sh是一个在使用仿真器运行的时候,用于设置环境的脚本。
dalvik目录用于提供AndroidJAVA应用程序运行的基础————JAVA虚拟机。
development目录展开的一个级别的目录如下所示:
|--apps
|
|
|
|
|
|
|
|
|
|
|
|
|--build
|--cmds
|--data
|--docs
|--host
|--ide
|--ndk
|--pdk
|--samples
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|--scripts
|--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 SocketLayer,一个网络协议层,用于为数据通讯提供安全支持。
frameworks目录展开的一个级别的目录如下所示:
frameworks/
|-- base
|-- opt
`-- policies
frameworks是Android应用程序的框架。
hardware是一些与硬件相关的库
kernel是Linux2.6的源代码
packages目录展开的两个级别的目录如下所示:
packages/
|-- apps
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
`-- providers
|-- CalendarProvider
|-- ContactsProvider
|-- DownloadProvider
|-- DrmProvider
|-- GoogleContactsProvider
|--GoogleSubscribedFeedsPro
|-- 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
|
|
|-- core
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|-- extras
|
|
|
|
|
|
|
|
|
|
|
|
`-- wlan
`-- ti
Android编译完成后的代码结构
Android编译完成后,将在根目录中生成一个out文件夹,所有生成的内容均放置在这个文件夹中。out文件夹如下所示:
out/
|-- CaseCheck.txt
|-- casecheck.txt
|-- host
|
|
`-- target
|-- common
`-- product
主要的两个目录为host和target,前者表示在主机(x86)生成的工具,后者表示目标机(模认为ARMv5)运行的内容。
host目录的结构如下所示:
out/host/
|-- common
|
`-- linux-x86
|--bin
|--framework
|--lib
`--obj
host目录是一些在主机上用的工具,有一些是二进制程序,有一些是JAVA的程序。
target目录的结构如下所示:
out/target/
|-- common
|
|
|
`-- product
`-- generic
其中common目录表示通用的内容,product中则是针对产品的内容。
在common目录的obj中,包含两个重要的目录:
APPS
JAVA_LIBRARIES
在默认的情况下,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文件是运行时真正需要的文件。