Android源代码结构解析

来源:互联网 发布:dota2伪随机算法 编辑:程序博客网 时间:2024/04/29 05:59
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 
|--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文件是运行时真正需要的文件。