• 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文件是运行时真正需要的文件。
  • 相关阅读:
    Nginx如何配置基础缓存
    Websocket消息过长自动断开连接?
    Docker错误删除Postgresql容器如何恢复?
    Docker安装带中文全文搜索插件zhparser的Postgresql数据库
    Postgresql数据库安装中文全文搜索插件zhparser的问题
    Presto通过RESTful接口新增Connector
    在windows的IDEA运行Presto
    Druid.io通过NiFi摄取流数据
    Druid.io SQL乱码问题
    Druid.io启用SQL支持
  • 原文地址:https://www.cnblogs.com/mxgsa/p/1905815.html
Copyright © 2020-2023  润新知