`
maoxy
  • 浏览: 141625 次
  • 性别: 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的工作原理,从而提升开发能力。

    模拟一位原码乘法

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

    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游戏开发能力,并为今后的项目打下坚实基础。

    android monkey原码

    Monkey是Android平台上的一种自动化测试工具,它通过向系统发送伪随机的用户事件流来实现对应用程序的稳定性测试。Monkey测试的原理是模拟用户在设备上进行各种随机操作,如触摸屏幕、滑动、按键等,以此来检测应用...

Global site tag (gtag.js) - Google Analytics