Android 源码结构分析

深入解析Android系统架构与组件
本文详述了Android系统的核心组件与启动流程,包括Zygote进程、AndroidRuntime、系统服务初始化等关键环节,提供了对Android系统底层原理的深入理解。

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

关于cameraHAL接口库。最终生成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 managerjava库形式分发到目标系统/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会和kernelbinder 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 serverlibsystem_server.so->system/lib/libsystem_server.sosystem_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.aaudio 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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值