ANDROID 源码结构(转)

 http://www.cnblogs.com/Tiger-Dog/articles/2023281.html

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文件是运行时真正需要的文件 
原文地址:https://www.cnblogs.com/ahuo/p/2528935.html