Android 2.1
|-- Makefile
|--bionic (bionic C库)
|--bootable (启动引导相关代码)
|--build (存放系统编译规则及generic等基础开发包配置)
|--cts (Android兼容性测试套件标准)
|--dalvik (dalvik JAVA虚拟机)
|--development (应用程序开发相关)
|--external (android使用的一些开源的模组)
|--frameworks (核心框架——java及C++语言)
|--hardware (主要保护硬解适配层HAL代码)
|--out (编译完成后的代码输出与此目录)
|--packages (应用程序包)
|--prebuilt (x86和arm架构下预编译的一些资源)
|--sdk (sdk及模拟器)
|--system (文件系统库、应用及组件——C语言)
`--vendor (厂商定制代码)
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两种架构)
bootable 目录
.
|--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)
dalvik目录 dalvik虚拟机
.
|--dalvikvm (main.c的目录)
|--dexdump (dex反汇编)
|--dexlist (List all methods in allconcrete classes in a DEX file.)
|--dexopt (预验证与优化)
|--docs (文档)
|--dvz (和zygote相关的一个命令)
|--dx (dx工具,将多个java转换为dex)
|--hit (?java语言写成)
|--libcore (核心库)
|--libcore-disabled (?禁用的库)
|--libdex (dex的库)
|--libnativehelper (Support functions for Android's classlibraries)
|-- tests (测试代码)
|--tools (工具)
`--vm (虚拟机实现)
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 (一些工具)
external 目录
.
|-- aes (AES加密)
|-- apache-http (网页服务器)
|-- astl (ASTL (Android STL) is aslimmed-down version of the regular C++ STL.)
|-- bison (自动生成语法分析器,将无关文法转换成C、C++)
|-- blktrace (blktrace is a block layer IOtracing mechanism)
|-- bluetooth (蓝牙相关、协议栈)
|-- bsdiff (diff工具)
|-- bzip2 (压缩工具)
|-- clearsilver (html模板系统)
|-- dbus (低延时、低开销、高可用性的IPC机制)
|-- dhcpcd (DHCP服务)
|-- dosfstools (DOS文件系统工具)
|-- dropbear (SSH2的server)
|-- e2fsprogs (EXT2文件系统工具)
|-- elfcopy (复制ELF的工具)
|-- elfutils (ELF工具)
|-- embunit (Embedded Unit Project)
|-- emma (java代码覆盖率统计工具)
|-- esd (Enlightened Sound Daemon,将多种音频流混合在一个设备上播放)
|-- expat (Expat is a stream-orientedXML parser.)
|-- fdlibm (FDLIBM (FreelyDistributable LIBM))
|-- freetype (字体)
|-- fsck_msdos (dos文件系统检查工具)
|-- gdata (google的无线数据相关)
|-- genext2fs (genext2fs generates an ext2filesystem as a normal (non-root) user)
|-- giflib (gif库)
|-- googleclient (google用户库)
|-- grub (This is GNU GRUB, the GRandUnified Bootloader.)
|-- gtest (Google C++ TestingFramework)
|-- icu4c (ICU(InternationalComponent for Unicode)在C/C++下的版本)
|-- ipsec-tools (This package provides away to use the native IPsec functionality )
|-- iptables (防火墙)
|-- jdiff (generate a reportdescribing the difference between two public Java APIs.)
|-- jhead (jpeg头部信息工具)
|-- jpeg (jpeg库)
|-- junit (JUnit是一个Java语言的单元测试框架)
|-- kernel-headers (内核的一些头文件)
|-- libffi (libffi is a foreignfunction interface library.)
|-- libpcap (网络数据包捕获函数)
|-- libpng (png库)
|-- libxml2 (xml解析库)
|-- mtpd (一个命令)
|-- netcat (simple Unix utility whichreads and writes dataacross network connections)
|-- netperf (网络性能测量工具)
|-- neven (看代码和JNI相关)
|-- opencore (多媒体框架)
|-- openssl (SSL加密相关)
|-- openvpn (VPN开源库)
|-- oprofile (OProfile是Linux内核支持的一种性能分析机制。)
|-- ping (ping命令)
|-- ppp (pppd拨号命令,好像还没有chat)
|-- proguard (Java class file shrinker,optimizer, obfuscator, and preverifier)
|-- protobuf (a flexible, efficient,automated mechanism for serializing structured data)
|-- qemu (arm模拟器)
|-- safe-iop (functions for performing safeinteger operations )
|-- skia (skia图形引擎)
|-- sonivox (sole MIDI solution for GoogleAndroid Mobile Phone Platform)
|-- speex (Speex编/解码API的使用(libspeex))
|-- sqlite (数据库)
|-- srec (Nuance 公司提供的开源连续非特定人语音识别)
|-- strace (trace工具)
|-- svox (Embedded Text-to-Speech)
|-- tagsoup (TagSoup是一个Java开发符合SAX的HTML解析器)
|-- tcpdump (抓TCP包的软件)
|-- tesseract (Tesseract Open Source OCREngine.)
|-- tinyxml (TinyXml is a simple, small,C++ XML parser)
|-- tremor (I stream and file decoderprovides an embeddable,integer-only library)
|-- webkit (浏览器核心)
|-- wpa_supplicant (无线网卡管理)
|-- xmlwriter (XML 编辑工具)
|-- yaffs2 (yaffs文件系统)
`-- zlib (a general purpose datacompression library)
Android Framework 分析(一)
1.目录树
/framework/base/api
/framework/base/awt
/framework/base/build
/framework/base/camera
关于camera的HAL接口库。最终生成native共享库libcamera.so ,编译时根据是否定义USE_CAMERA_STUB来决定系统是否有Camera硬件支持。若没有实际的Camera硬件,则编译时会和虚拟camera静态库(libcamerastub.a,由camerahardwarestub.cpp,fakecamera生成)链接生成libcamera.so。
/framework/base/cmds 关于android系统启动时用到的command等
/framework/base/cmds/am
/framework/base/cmds/app_process
可执行文件app_process,该文件可以根据输入参数决定是Zygote启动(参考init.rc中的语句 service zygote/system/bin/app_process -Xzygote /system/bin --zygote --start-system-server).
该执行程式会链接libandroid_runtime.so去链接android runtime。后面我会在详细分析此部分。
/framework/base/cmds/backup
可执行程式btool
/framework/base/cmds/bmgr
java可执行程式, backup manager, java库形式分发到目标系统/system/framework/bmgr.jar
/framework/base/cmds/bootanimation
android启动动画效果程式,该程式必须在android runtime启动后运行。
/framework/base/cmds/dumpstate
android系统调试辅助工具,生成可执行程式dumpstate,同时建立两个程式dumpcrash bugreport指向该程式。
/framework/base/cmds/dumpsys
生成可执行程式dumpsys
/framework/base/cmds/ime
java可执行程式,IME输入法 input method manager, java库形式分发到目标系统/system/framework/ime.jar
/framework/base/cmds/input
java可执行程式,管理input事件例如key event,text event 等,java库形式分发到目标系统/system/framework/input.jar
/framework/base/cmds/installd
可执行程式installd,install manager,仅在非simulator系统中运行,安装到目标系统/system/bin/installd
/framework/base/cmds/keystore
可执行程式keystore,用途???仅在非simulator系统中运行,安装到目标系统/system/bin/keystore
/framework/base/cmds/pm
java可执行程式,package manager,java库形式分发到目标系统/system/framework/pm.jar
/framework/base/cmds/runtime
runtime可执行程式,仅在simulator中使用
/framework/base/cmds/service
service可执行程式,用来查找,检查,呼叫service,安装到目标系统/system/bin/service
/framework/base/cmds/servicemanager
android系统的service manager,可执行文件,安装到目标系统/system/bin/servicemanager
servicemanager会和kernel的binder driver协作共同完成service的添加、查询、获取、检查等。
/framework/base/cmds/surfaceflinger
surfaceflinger可执行程式,安装到目标系统/system/bin/surfaceflinger,
该程式会初始化surfaceflinger,surfaceflinger::inistantiate(),该程式会链接到libsurfaceflinger.so
/framework/base/cmds/svc
/framework/base/cmds/system_server
system server库libsystem_server.so->system/lib/libsystem_server.so和system_server可执行程式->system/bin/system_server.
该可执行程式不清楚什么用途????
/framework/core/
/framework/core/config
几个简单java常量,(debug标志等)
/framework/core/java/*
framewor
k的核心,此处主要指applicationframework,java库形式分发到/system/framework/
包括framework.jar,framework-tests.jarsure???
/framework/core/jni
framework所需的JNI接口实现库,分发到/system/lib/lib/libandroid_runtime.so
/framework/core/res
framework所需的资源文件打包,/system/framework/framework-res.apk,
/framework/libs
/framework/libs/audioflinger,
生成libaudioflinger.so,
若无实际硬件和静态库libaudiointerface.a(audio interface虚拟设备)链接。
若有实际硬件和libaudio.so链接,若支持bluetooth,则和liba2dp.so链接
/framework/libs/surfaceflinger
生成libsurfaceflinger.so
/framework/libs/ui
生成libui.so
/framework/libs/utils
生成libutils.so
/framework/services/java/*
system server java可执行程式service.jar,分发到/system/framework/service.jar
/framework/services/jni/*
system server JNI接口实现库,libanroid_servers.so,分发到/system/lib/libanroid_servers.so
android framework 分析(二)
启动 Zygote
-Xzygote /system/bin --zygote--start-system-server
AndroidRuntime->AppRuntime
int main(int argc,const char* const argv[])
{
AppRuntime runtime;生成AndroidRuntime实例
...
AndroidRuntime.Start("com.android.internal.os.ZygoteInit",startSystemServer);
}
其中AndroidRuntime.Start("com.android.internal.os.ZygoteInit",startSystemServer);
呼叫Android::Start(constchar* className,const bool startSystemServer)
/framework/base/core/jni/AndroidRuntime.cpp
该函数的处理内容:
1.处理Jave Virtual Machine的一些参数选项;
2.创建Dalvik Java虚拟机,JNI_CreateJavaVM(&mJavaVM,&env,&initArgs);
3.注册Android Runtime中的JNI接口给虚拟机;
4.呼叫Java类com.android.internal.os.ZygoteInit的main函数
在 类 com.android.internal.os.ZygoteInit的main函数中,
1.注册Zygote socket用来接收请求;
2.加载preloaded class、resources用来加快启动速度,文件清单在framework.jar中的preloaded-classes,framework-res.apk中的res中;
3.启动System Server;
fork出独立的进程名称为system-server,呼叫com.android.server.SystemServer类的main函数;
在HandleSystemServerProcess函数中,RuntimeInit.ZygoteInit调用会呼叫AppRuntime的OnZygoteInit函数
4.RuntimeInit.ZygoteInit函数会呼叫com.android.server.SystemServer类的main函数。
在此main函数中,系统首先加载android_server共享库libandroid_server.so 源代码位于/framework/base/service/jni
在该库中有定义JNI_OnLoad函数,所以Dalvik在加载 libandroid_server.so 的时候会首先呼叫该JNI_OnLoad函数,该函数将android server注册到Java虚拟机中,包括KeyInputQueue,HardwareService,AlarmManager,BatteryService,SensorService,SystemServer等;
呼叫在libanroid_server.so中注册的native函数init1,该函数位于/frameworks/base/services/jni/com_android_server_SystemServer.cpp中;
init1函数呼叫libsystem_server中的system_init函数,该函数位于/frameworks/base/cmds/system_server/library/system_init.cpp中,该函数将SurfaceFlinger/AudioFlinger /MediaPlayer/CameraService等组件注册到ServiceManager中
system_init函数反过来呼叫java类com.android.server.SystemServer的init2函数;
5.在init2函数中,android创建了serverthread,在该thread中android开始注册各种service到service manager中
包括EntropyService,PowerManager,ActivityManager,Telephony,PackageManager,ContentManager,ContentProvider,
BatteryService,HardwareService,AlarmManager等等。
注意该线程使用Looper来执行thread
至此androidsystem server启动完成。
本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/taoshengyang/archive/2010/06/10/5661699.aspx
framework主要是一些核心的文件,从后缀名为jar可以看出是是系统平台框架。
\system\framework\am.jar
\system\framework\am.odex
\system\framework\android.awt.jar AWT库
\system\framework\android.awt.odex
\system\framework\android.policy.jar
\system\framework\android.policy.odex
\system\framework\android.test.runner.jar
\system\framework\android.test.runner.odex
\system\framework\com.google.android.gtalkservice.jar GTalk服务
\system\framework\com.google.android.gtalkservice.odex
\system\framework\com.google.android.maps.jar 电子地图库
\system\framework\com.google.android.maps.odex
\system\framework\core.jar 核心库,启动桌面时首先加载这个
\system\framework\core.odex
\system\framework\ext.jar
\system\framework\ext.odex
\system\framework\framework-res.apk
\system\framework\framework-tests.jar
\system\framework\framework-tests.odex
\system\framework\framework.jar
\system\framework\framework.odex
\system\framework\input.jar 输入库
\system\framework\input.odex
\system\framework\itr.jar
\system\framework\itr.odex
\system\framework\monkey.jar
\system\framework\monkey.odex
\system\framework\pm.jar 包管理库
\system\framework\pm.odex
\system\framework\services.jar
\system\framework\services.odex
\system\framework\ssltest.jar
\system\framework\ssltest.odex
\system\framework\svc.jar 系统服务
\system\framework\svc.odex