Android源代码结构分析(ZT)
Android源代码结构分析
Google提供的Android包含了:Android源代码,工具链,基础C库,仿真环境,开发环境等,完整的一套。
第一级别的目录和文件如下所示:
[cpp]
----------------
├──Makefile全局的Makefile
├──build系统编译规则和配置所需要的脚本和工具
----------------
├──prebuilt各种平台编译工具链
├──bionic基础C库源代码
----------------
├──frameworks*Android应用程序的核心框架层(java及C++语言)
├──system*底层文件系统/库/应用及组件(C语言)
├──dalvikJAVA虚拟机
├──externalandroid使用的一些额外开源库
├──libcore与媒体播放框架代码相关
----------------
├──packages各种应用程序实例
├──development程序开发所需要的实例/模板/工具
----------------
├──ndk
├──sdk
├──ctsAndroidCTS兼容性规范测试用例
----------------
├──vendor*厂商定制代码
├──device*厂商定制代码
├──hardware*一些与硬件相关的库,部分厂家开源的硬解适配层HAL代码
├──kernel*Linux源代码
├──bootable引导加载器
├──recovery与目标的恢复功能相关
----------------android的移植按如下流程:
(1)androidlinux内核的普通驱动移植,让内核可以在目标平台上运行起来。
(2)正确挂载文件系统,确保内核启动参数和android源代码system/core/rootdir目录下的init.rc中的文件系统挂载正确。
(3)调试控制台,让内核启动参数中的console参数以及android源代码system/core/init/init.c中的console_name设置和硬件保持一致
(4)打开 android 相关的驱动(logger,binder 等),串口输入 logcat 看 logger 驱动起来,没有的话调试logger 驱动。解决底层问题方法:解除Android系统的耦合l
1将Dalvik于bionic以及硬件驱动剥离开
2修改Dalvik以支持标准glibc和GNU/Linux
3把Dalvik当作普通应用程序
4 Dalvik可被单独优化和改进build目录
[cpp]
.
|--envsetup.sh是一个在使用仿真器运行的时候,用于设置环境的脚本
|--core(核心编译规则,以mk为结尾的文Makefile件,被顶层目录的Makefile引用)
|--history(历史记录)
|--libs
|`--host(主机端库,有android“cp”功能替换)
|--target(目标机编译对象,包含board和product两个目录,为目标所需要文件)
||--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(Thisprogramtakesalistoffilesanddirectories)
|--fs_get_stats(获取文件系统状态)
|--iself(判断是否ELF格式)
|--isprelinked(判断是否prelinked)
|--kcm(按键相关)
|--lsd(Listsymboldependencies)
|--releasetools(生成镜像的工具及脚本)
|--rgb2565(rgb转换为565)
|--signapk(apk签名工具)
|--soslim(strip工具)
`-- zipalign (zip archive alignment tool)prebuilt 目录
x86和ARM架构下工具链/预编译的一些资源
[cpp]
.
|--android-arm(arm-android相关)
||--gdbserver(gdb调试器)
|`--kernel(模拟的arm内核)
|--android-x86(x86-android相关)
|`--kernel(空的)
|--common(通用编译好的代码,应该是java的)
|--darwin-x86(drawinx86平台)
|`--toolchain(工具链)
||--arm-eabi-4.2.1
||--arm-eabi-4.3.1
|`--arm-eabi-4.4.0
|--darwin-x86_64(drawinx8664bit平台)
|--linux-x86(linuxx86平台)
|`--toolchain(工具链,我们应该主要用这个)
||--arm-eabi-4.2.1
||--arm-eabi-4.3.1
||--arm-eabi-4.4.0
|`--i686-unknown-linux-gnu-4.2.1(x86版编译器)
|--linux-x86_64(linuxx8664bit平台)
|--windows(windows平台)
`-- windows-x86_64 (64bit windows平台)bionic目录
基础C库源代码
[cpp]
.
|--Android.mk
|--libc(C库)
|--libdl(libdl实现,dl是动态链接,提供访问动态链接库的功能)
|--libm(libm数学库的实现)
|--libstdc++(C++实现库libstdc++)
|--libthread_db(多线程程序的调试器库)
`-- linker (动态链接器)frameworks目录
核心框架--java及C++语言
[cpp]
.
|--base(基本内容)
||--api(?都是xml文件,定义了java的api?)
||--awt(AWT库)
||--build(空的)
||--camera(摄像头服务程序库)
||--cmds(重要命令:am、app_proce等)
||--core(核心库)
||--data(字体和声音等数据文件)
||--docs(文档)
||--graphics(图形相关)
||--include(头文件)
||--keystore(和数据签名证书相关)
||--libs(库)
||--location(地区库)
||--media(媒体相关库)
||--obex(蓝牙传输库)
||--opengl(2D-3D加速库)
||--packages(设置、TTS、VPN程序)
||--sax(XML解析器)
||--services(各种服务程序)
||--telephony(电话通讯管理)
||--test-runner(测试工具相关)
||--tests(各种测试)
||--tools(一些叫不上名的工具)
||--vpn(VPN)
|`--wifi(无线网络)
|--opt(可选部分)
||--com.google.android(有个framework.jar)
||--com.google.android.googlelogin(有个client.jar)
|`--emoji(standardmessageelements)
`--policies(Productpoliciesareoperatingsystemdirectionsaimedatspecificuses)
`--base
|--mid(MID设备)
`-- phone (手机类设备,一般用这个)system 目录
底层文件系统/库/应用及组件--C语言
[cpp]
.
|--Bluetooth(蓝牙相关)
|--core(系统核心工具盒接口)
||--adb(adb调试工具)
||--cpio(cpio工具,创建img)
||--debuggerd(调试工具)
||--fastboot(快速启动相关)
||--include(系统接口头文件)
||--init(init程序源代码)
||--libacc(轻量级C编译器)
||--libctest(libc测试相关)
||--libcutils(libc工具)
||--liblog(log库)
||--libmincrypt(加密库)
||--libnetutils(网络工具库)
||--libpixelflinger(图形处理库)
||--libsysutils(系统工具库)
||--libzipfile(zip库)
||--logcat(查看log工具)
||--logwrapper(log封装工具)
||--mkbootimg(制作启动boot.img的工具盒脚本)
||--netcfg(网络配置netcfg源码)
||--nexus(google最新手机的代码)
||--rootdir(rootfs,包含一些etc下的脚本和配置)
||--sh(shell代码)
||--toolbox(toolbox,类似busybox的工具集)
|`--vold(SD卡管理器)
|--extras(额外工具)
||--latencytop(atoolforsoftwaredevelopers,identifyingsystemlatencyhappen)
||--libpagemap(pagemap库)
||--librank(JavaLibraryRankingSystem库)
||--procmem(pagemap相关)
||--procrank(JavaLibraryRankingSystem相关)
||--showmap(showmap工具)
||--showslab(showslab工具)
||--sound(声音相关)
||--su(su命令源码)
||--tests(一些测试工具)
|`--timeinfo(时区相关)
`--wlan(无线相关)
`-- ti (ti网卡相关工具及库)dalvik 目录
提供Android JAVA应用程序运行的基础--JAVA虚拟机
[cpp]
.
|--dalvikvm(main.c的目录)
|--dexdump(dex反汇编)
|--dexlist(ListallmethodsinallconcreteclassesinaDEXfile.)
|--dexopt(预验证与优化)
|--docs(文档)
|--dvz(和zygote相关的一个命令)
|--dx(dx工具,将多个java转换为dex)
|--hit(?java语言写成)
|--libcore(核心库)
|--libcore-disabled(?禁用的库)
|--libdex(dex的库)
|--libnativehelper(SupportfunctionsforAndroid'sclasslibraries)
|--tests(测试代码)
|--tools(工具)
`-- vm (虚拟机实现)external 目录
android使用的一些额外开源库
[cpp]
.
|--aes(AES加密)
|--apache-http(网页服务器)
|--astl(ASTL(AndroidSTL)isaslimmed-downversionoftheregularC++STL.)
|--bison(自动生成语法分析器,将无关文法转换成C、C++)
|--blktrace(blktraceisablocklayerIOtracingmechanism)
|--bluetooth(蓝牙相关、协议栈)
|--bsdiff(diff工具)
|--bzip2(压缩工具)
|--clearsilver(html模板系统)
|--dbus(低延时、低开销、高可用性的IPC机制)
|--dhcpcd(DHCP服务)
|--dosfstools(DOS文件系统工具)
|--dropbear(SSH2的server)
|--e2fsprogs(EXT2文件系统工具)
|--elfcopy(复制ELF的工具)
|--elfutils(ELF工具)
|--embunit(EmbeddedUnitProject)
|--emma(java代码覆盖率统计工具)
|--esd(EnlightenedSoundDaemon,将多种音频流混合在一个设备上播放)
|--expat(Expatisastream-orientedXMLparser.)
|--fdlibm(FDLIBM(FreelyDistributableLIBM))
|--freetype(字体)
|--fsck_msdos(dos文件系统检查工具)
|--gdata(google的无线数据相关)
|--genext2fs(genext2fsgeneratesanext2filesystemasanormal(non-root)user)
|--giflib(gif库)
|--googleclient(google用户库)
|--grub(ThisisGNUGRUB,theGRandUnifiedBootloader.)
|--gtest(GoogleC++TestingFramework)
|--icu4c(ICU(InternationalComponentforUnicode)在C/C++下的版本)
|--ipsec-tools(ThispackageprovidesawaytousethenativeIPsecfunctionality)
|--iptables(防火墙)
|--jdiff(generateareportdescribingthedifferencebetweentwopublicJavaAPIs.)
|--jhead(jpeg头部信息工具)
|--jpeg(jpeg库)
|--junit(JUnit是一个Java语言的单元测试框架)
|--kernel-headers(内核的一些头文件)
|--libffi(libffiisaforeignfunctioninterfacelibrary.)
|--libpcap(网络数据包捕获函数)
|--libpng(png库)
|--libxml2(xml解析库)
|--mtpd(一个命令)
|--netcat(simpleUnixutilitywhichreadsandwritesdataacrossnetworkconnections)
|--netperf(网络性能测量工具)
|--neven(看代码和JNI相关)
|--opencore(多媒体框架)
|--openssl(SSL加密相关)
|--openvpn(VPN开源库)
|--oprofile(OProfile是Linux内核支持的一种性能分析机制。)
|--ping(ping命令)
|--ppp(pppd拨号命令,好像还没有chat)
|--proguard(Javaclassfileshrinker,optimizer,obfuscator,andpreverifier)
|--protobuf(aflexible,efficient,automatedmechanismforserializingstructureddata)
|--qemu(arm模拟器)
|--safe-iop(functionsforperformingsafeintegeroperations)
|--skia(skia图形引擎)
|--sonivox(soleMIDIsolutionforGoogleAndroidMobilePhonePlatform)
|--speex(Speex编/解码API的使用(libspeex))
|--sqlite(数据库)
|--srec(Nuance公司提供的开源连续非特定人语音识别)
|--strace(trace工具)
|--svox(EmbeddedText-to-Speech)
|--tagsoup(TagSoup是一个Java开发符合SAX的HTML解析器)
|--tcpdump(抓TCP包的软件)
|--tesseract(TesseractOpenSourceOCREngine.)
|--tinyxml(TinyXmlisasimple,small,C++XMLparser)
|--tremor(Istreamandfiledecoderprovidesanembeddable,integer-onlylibrary)
|--webkit(浏览器核心)
|--wpa_supplicant(无线网卡管理)
|--xmlwriter(XML编辑工具)
|--yaffs2(yaffs文件系统)
`--zlib(ageneralpurposedatacompressionlibrary)
在external中,每个目录表示Android目标系统中的一个模块,可能有一个或者若干个库构成。其中:
opencore为PV(PacketVideo),它是Android多媒体框架的核心。
webkit是Android网络浏览器的核心。
sqlite是Android数据库系统的核心。
openssl是Secure Socket Layer,一个网络协议层,用于为数据通讯提供安全支持。packages 目录
各种应用程序实例
[cpp]
.
|--apps(应用程序库)
||--AlarmClock(闹钟)
||--Bluetooth(蓝牙)
||--Browser(浏览器)
||--Calculator(计算器)
||--Calendar(日历)
||--Camera(相机)
||--CertInstaller(在Android中安装数字签名,被调用)
||--Contacts(拨号(调用)、联系人、通话记录)
||--DeskClock(桌面时钟)
||--Email(Email)
||--Gallery(相册,和Camera类似,多了列表)
||--Gallery3D(?3D相册)
||--GlobalSearch(为google搜索服务,提供底层应用)
||--GoogleSearch(google搜索)
||--HTMLViewer(浏览器附属界面,被浏览器应用调用,同时提供存储记录功能)
||--IM(即时通讯,为手机提供信号发送、接收、通信的服务)
||--Launcher(登陆启动项,显示图片框架等等图形界面)
||--Launcher2(登陆启动项,负责应用的调用)
||--Mms(?彩信业务)
||--Music(音乐播放器)
||--PackageInstaller(安装、卸载程序的响应)
||--Phone(电话拨号程序)
||--Provision(预设应用的状态,使能应用)
||--Settings(开机设定,包括电量、蓝牙、设备信息、界面、wifi等)
||--SoundRecorder(录音机,可计算存储所需空间和时间)
||--Stk(接收和发送短信)
||--Sync(空)-------○1
||--Updater(空)
|`--VoiceDialer(语音识别通话)
|--inputmethods(输入法)
||--LatinIME(拉丁文输入法)
||--OpenWnn(OpenWnn输入法)
|`--PinyinIME(拼音输入法)
|--providers(提供器,提供应用程序、界面所需的数据)
||--ApplicationsProvider(应用程序提供器,提供应用程序启动项、更新等)
||--CalendarProvider(日历提供器)
||--ContactsProvider(联系人提供器)
||--DownloadProvider(下载管理提供器)
||--DrmProvider(创建和更新数据库时调用)
||--GoogleContactsProvider(联系人提供器的子类,用以同步联系人)
||--GoogleSubscribedFeedsProvider(设置信息提供器)
||--ImProvider(空)
||--ManagementProvider(空)
||--MediaProvider(媒体提供器,提供存储数据)
||--TelephonyProvider(彩信提供器)
||--UserDictionaryProvider(用户字典提供器,提供用户常用字字典)
|`--WebSearchProvider(空)
|--services
||--EasService(空)
|`--LockAndWipe(空)
`--wallpapers(墙纸)
|--Basic(基本墙纸,系统内置墙纸)
|--LivePicker(选择动态壁纸)
|--MagicSmoke(壁纸特殊效果)
`--MusicVisualization(音乐可视化,图形随音乐而变化)
packages中包含两个目录,其中apps中是Android中的各种应用程序,providers是一些内容提供者(是内部自带的数据库源程序)。
packages中两个目录的内容大都是使用JAVA编写的程序,各个文件夹的层次结构是类似的。
作为基于SDK的开发者一般看的都是packages/apps目录下的程序实例,其中setting是我的最爱。development 目录
开发者需要的一些例程及工具
[cpp]
.
|--apps(一些核心应用程序)
||--BluetoothDebug(蓝牙调试程序)
||--CustomLocale(自定义区域设置)
||--Development(开发)
||--Fallback(和语言相关的一个程序)
||--FontLab(字库)
||--GestureBuilder(手势动作)
||--NinePatchLab(?)
||--OBJViewer(OBJ查看器)
||--SdkSetup(SDK安装器)
||--SpareParts(高级设置)
||--Term(远程登录)
|`--launchperf(?)
|--build(编译脚本模板)
|--cmds(有个monkey工具)
|--data(配置数据)
|--docs(文档)
|--emulator(仿真相关)
|--host(主机端USB驱动等)
|--ide(集成开发环境)
|--ndk(本地开发套件——c语言开发套件)
|--pdk(PlugDevelopmentKit)
|--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程序提供了很大便利,可以作为模板使用。vendor 目录
厂家定制内容
[cpp]
.
|--aosp(androidopensourceproject)
|`--products(一些板级规则)
|--htc(HTC公司)
||--common-open(通用部分)
||`--akmd(解压img用的工具)
||--dream-open(G1开放部分)
||--prebuilt-open(预编译开放部分)
|`--sapphire-open(sapphire这款型号开放内容)
|--pv-open(没东西)
|--qcom(里面基本是空的)
`--sample(google提供的样例)
|--apps(应用)
||--client(用户)
|`--upgrade(升级)
|--frameworks(框架)
|`--PlatformLibrary(平台库)
|--products(产品)
|--sdk_addon(sdk添加部分)
`--skins(皮肤)
`-- WVGAMedDpi (WVGA适用的图片)hardware 目录
一些与硬件相关的库,部分厂家开源的硬解适配层HAL代码
[cpp]
.
|--broadcom(博通公司)
|`--wlan(无线网卡)
|--libhardware(硬件库)
||--include(头文件)
|`--modules(Default(andpossiblyarchitecturedependents)HALmodules)
||--gralloc(gralloc显示相关)
|`--overlay(Skeletonforthe"overlay"HALmodule.)
|--libhardware_legacy(旧的硬件库)
||--flashlight(背光)
||--gps(GPS)
||--include(头文件)
||--mount(旧的挂载器)
||--power(电源)
||--qemu(模拟器)
||--qemu_tracing(模拟器跟踪)
||--tests(测试)
||--uevent(uevent)
||--vibrator(震动)
|`--wifi(无线)
|--msm7k(高通7k处理器开源抽象层)
||--boot(启动)
||--libaudio(声音库)
||--libaudio-qsd8k(qsd8k的声音相关库)
||--libcamera(摄像头库)
||--libcopybit(copybit库)
||--libgralloc(gralloc库)
||--libgralloc-qsd8k(qsd8k的gralloc库)
||--liblights(背光库)
|`--librpc(RPC库)
|--ril(无线电抽象层)
||--include(头文件)
||--libril(库)
||--reference-cdma-sms(cdma短信参考)
||--reference-ril(ril参考)
|`--rild(ril后台服务程序)
`--ti(ti公司开源HAL)
|--omap3(omap3处理器)
||--dspbridge(DSP桥)
||--libopencorehw(opencore硬件库)
||--liboverlay(overlay硬件库)
||--libstagefrighthw(stagefright硬件库)
|`--omx(omx组件)
`-- wlan (无线网卡)bootable 目录
引导加载器
[cpp]
|--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(OTAOverTheAirUpdates升级工具)
`-- updater (升级器)out 目录
Android编译完成后,将在根目录中生成一个out文件夹,所有生成的内容均放置在这个文件夹中
[cpp]
.
|--CaseCheck.txt
|--casecheck.txt
|--host(在主机PChost上使用的工具,包括二进制程序以及JAVA的程序)
||--common
||`--obj(JAVA库)
|`--linux-x86
||--bin(二进制程序)
||--framework(JAVA库,*.jar文件)
||--lib(共享库*.so)
|`--obj(中间生成的目标文件)
`--target(在目标机(如ARMv5)上运行的内容)
|--common(common表示通用的内容)
||--R(资源文件)
||--docs
|`--obj(目标文件,1APPS中包含了打成APK包的JAVA应用程序,2JAVA_LIBRARIES中包含了JAVA的库)
`--product(product中则是针对产品的内容)
`--generic
|--android-info.txt
|--clean_steps.mk
|--symbols
|--obj(obj/APPS目录中包含了各种打成了APK包的JAVA应用,obj/SHARED_LIBRARIES中存放所有动态库,obj/STATIC_LIBRARIES中存放所有静态库)
|--root/
|--ramdisk.img(对应于root/目录,挂载在/,)
|--system/
|--system.img(挂载在system/目录,包括了主要系统apps)
|--data/
|--userdata.img(挂载在data/目录,用户数据)
`-- userdata-qemu.imgSDK和NDK目录没有列出。
作为基于SDK的开发者一般看的都是packages/apps目录下的程序实例,其中setting是我的最爱。
而packages/providers是内部自带的数据库源程序。
development/是一些开发的例子,我现在正在看ndk的开发。