`
maoxy
  • 浏览: 141640 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

Android原码结构分析(转载)

阅读更多

以下内容转载于网上论坛。正确性未一一验证,但是看了部分结构解释正确。

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文件是运行时真正需要的文件。

分享到:
评论

相关推荐

    Android 原码

    假如eclipse的sdk所在目录为D:\sdk\platforms\android-14,而下载的源码为android-14,将其拷至D:\sdk\platforms\android-14目录,新建sources目录。版本对应关系可以查看android-x中的source.properties文件。 重启...

    android系统原码TextView.java

    android 8系统中的原码TextView.java, 可以查看官方的实现原理 ,对自定义 组件有一定 启发

    Android音乐播放器 原码

    在这个“Android音乐播放器原码”中,我们可以深入学习如何构建这样一个功能丰富的应用。 首先,让我们讨论标题中的关键点——音乐播放器。在Android上实现音乐播放,主要涉及以下技术点: 1. **媒体库访问**:...

    Android应用程序开发原码例子

    出于这个目的,Android 将补充,而不会替代谷歌长期以来奉行的移动发展战略:通过与全球各地的手机制造商和移动运营商结成合作伙伴,开发既有用又有吸引力的移动服务,并推广这些产品。本代码晚看易懂。是广大爱好者...

    android 微信原码

    对于Android开发者来说,分析微信的源码不仅可以提升自身的编程技能,还能深入了解移动应用的架构设计、性能优化以及用户体验的打造。本文将基于“微信原代码下载”这一主题,探讨其中蕴含的关键知识点。 首先,...

    android五子棋原码

    - 使用Android Studio的调试工具,如Logcat,分析程序运行过程,定位并修复问题。 以上是对"android五子棋原码"的详细解析,涵盖了从UI设计到游戏逻辑实现的多个关键方面。深入理解这个项目,不仅能够提升Android...

    android坦克大战原码

    反编的java 都用独立的类取代原码的类中类,匿名类。 虽然对于只使用一次对象值的(通常是监听类),都可以将独立类改为匿名类。但笔者认为, 将一大段匿名类代码放在方法的参数中,会影响阅读性, 倾向于独立类的...

    android 视频播放器 项目和原码

    通过分析这个项目的源码,开发者不仅可以学习到Android视频播放器的基本实现,还能了解到如何处理播放过程中的各种问题,以及如何进行性能优化。对于希望深入理解Android多媒体开发的程序员来说,这是一个非常有价值...

    android 音乐播放器原码

    以上是基于提供的"android 音乐播放器原码"所涵盖的主要技术点,深入理解和实践这些知识点对于Android开发者来说是非常有价值的。通过研究和修改这个源代码,开发者可以学习到如何创建自己的音乐播放应用,并进一步...

    8个Android应用程序源代码

    1. **Android应用程序结构**:每一个Android应用都由一系列组件构成,包括Activity(活动)、Service(服务)、BroadcastReceiver(广播接收器)、ContentProvider(内容提供者)和Intent(意图)。通过研究源代码,...

    android源码下载

    Android源码下载是Android开发人员深入理解系统工作原理和进行定制化开发的重要步骤。源码提供了Android操作系统的底层...通过掌握源码的获取、编译和分析,开发者能更深入地理解Android的工作原理,从而提升开发能力。

    原码一位乘法器——组成原理课程设计

    Verilog 和 VHDL 是两种常用的硬件描述语言,用于描述数字电路的结构和行为。 在实现原码一位乘法器时,还需要进行仿真调试,以确保原码一位乘法器的正确性和可靠性。仿真调试可以使用 ModelSim、VCS 等EDA 软件来...

    模拟一位原码乘法

    本文通过对给定的代码片段进行了详细分析,介绍了如何实现一位原码乘法的过程。通过了解这些基础知识,读者可以更好地理解计算机内部是如何执行乘法运算的。此外,熟悉这些底层实现有助于加深对计算机体系结构的理解...

    NRF52832 手机端安卓原码

    "手机端安卓原码"指的是针对Android平台的源代码,用于与NRF52832进行通信。这通常涉及到Android应用开发,使用Java或Kotlin语言编写,可能包含BLE库,如Android BluetoothGatt API,用于连接、读取、写入和订阅NRF...

    Android源码——闹钟源代码.zip

    通过对这些源代码的学习和分析,我们可以深入了解Android系统如何实现闹钟功能。 首先,`DeskClock`是Android系统中的一个应用,它提供了时钟、闹钟、计时器和秒表等功能。在源代码中,我们可以找到关于闹钟设置、...

    疯狂Android讲义书上所有例子原码part2

    疯狂Android讲义书上所有例子原码part2 放心使用

    Android8.0 源代码(O)

    2. **com**、**tck**、**android**、**org**: 这些目录通常代表Java包结构,其中包含了大量的类和接口。例如,`com.android`通常包含Android特定的类,如系统服务、应用框架等。`tck`可能表示技术兼容性套件,用于...

    Android愤怒的小鸟源码

    【Android愤怒的小鸟源码】是一个专为学习者设计的游戏开发资源,旨在帮助开发者深入了解游戏制作过程,特别是...通过深入分析和实践这个源码,开发者可以提升自己的Android游戏开发能力,并为今后的项目打下坚实基础。

Global site tag (gtag.js) - Google Analytics