Android 10 根文件系统和编译系统(四):Android源码目录结构

配套系列教学视频链接:

Android 10.0 AOSP源码编译:

        https://www.100ask.net/detail/p_60a1e037e4b0adb2d864c6d8/6

Android 10.0 根文件系统和编译系统:

        https://www.100ask.net/detail/p_60ab34b7e4b00176519e388c/6


说明

系统:AOSP Android10.0

设备:Android模拟器

前言

本章节重点介绍AOSP下载后的Android10.0源码目录结构, 方便大家对Android源码有一个总体的认识。


一, 顶层目录

目录名

说明

art/

Anroid RunTime(Android运行环境),Android5.0之后java虚拟机就使用ART

bionic/

基础C库源代码,Android改造的C/C++库, 比传统的glibc更精简,不受GPL限制,支持 pthread_cancel(), 不支持C++ exception和C++ STL模板编程。

bootable/

包含了recovery程序(恢复出厂/升级)的代码。

build/

Android编译系统,定义了各种编译规则,并包含通用产品配置。

cts

Android兼容性测试套件,CTS 是一个自动化测试套件,包含PC端和设备端(被测设备), 对手机的硬件,软件,接口,性能进行测试 ,测试项目包含平台 API 测试,平台 Intent,蓝牙设备的连接状况, 相机拍照功能等,通过make cts编译, out/host/linux-x86/cts/下生成android-cts文件夹。

由于Android是开源的,对于Google Android的开发联盟中的Motorola、Samsung、Qualcomm 、Sony Ericsson、中国移动、ZTE、华为等,底层的代码也是开放的。手机制造商及运营商可以在Android上打造,定制自己特有的手机操作系统,这势必在源码级别上对Android系统进行代码的添加和更改。如果不规范这些更改则会给上层的应用开放的移植带来问题(那个时候你会看到MOTO上跑的愤怒的小鸟会在三星的Android手机上运行不了,每个应用需要都要发布不同厂商的Android手机的版本),只有通过CTS测试的Android手机系统,Google才会颁发许可,以保证不同生产商之间的Android系统的兼容。

dalvik

Android Dalvik虚拟机相关内容,主要是提供了一下工具,如dexdump, vm主代码已经移除

developers

开发者目录, 一些应用程序的参考实例demo代码

development

提供应用开发的工具, 应用例子,monkey命令,shell脚本和python脚本:

development/scripts/stack:用于展开进程异常时的堆栈信息, 配合tombstone文件

development/scripts/gdbclient.py: 用于gdb调试

development/scripts/native_heapdump_viewer.py脚本将dumpheap进程结果转换成更易读的html格式

development/tools/make_keys: 系统签名生成器

development/tools/idegen: 用于生成android.ipr、android.iml IEDA工程配置文件,可以用android studio来导入android源码

device

设备产品定制目录, 该目录是厂商和产品公司定制文件比较多的地方

vendor

厂商定制目录,该目录可以新建出来

external

外部第三方开源的库和工具,比如ppp, wpa_supplicant, libz, libcurl等

frameworks

Android 应用框架层核心代码, 包括各种系统资源, 后台服务, SystemUI, 大部分都是java代码, 同时也包含了各种子系统的native代码, 如av, net等

hardware

硬件抽象层代码, 如gps, wifi, viberate

kernel

内核源码,厂商可以将内核源码集成到该目录

libcore

Android 系统中支持众多 Java 标准的库,例如 java.lang 包,libart库,JSON库

luni/src/main/java/java/nio

ojluni/src/main/java/sun

ojluni/src/main/java/java/io

./ojluni/src/main/java/java/util/Set.java

./ojluni/src/main/java/java/util/Arrays.java

./ojluni/src/main/java/java/util/HashSet.java

./ojluni/src/main/java/java/util/Stack.java

./ojluni/src/main/java/java/util/JumboEnumSet.java

./ojluni/src/main/java/java/util/Vector.java

./ojluni/src/main/java/java/lang/Double.java

./ojluni/src/main/java/java/lang/String.java

libnativehelper

JNI编程时调用的各种接口实现代码, 如findClass(), 最终编译成libnativehelper.so

packages

系统内置的app源码, 如设置, 墙纸,输入法,屏保等。

apps:核心应用程序

inputmethods:输入法目录

providers:内容提供者目录

screensavers:屏幕保护

services:通信服务

wallpapers:墙纸

pdk

Platform Development Kit 的缩写,平台开发套件, PDK的目标是帮助芯片组供应商和原始设备制造商迁移到新的版本。在PDK推出之前,未能参与Google早期开发设备计划的OEM厂商和半导体供应商必须等到Android开源版本公布后,才能开始进行开发。而从Jelly Bean,也就是Android 4.1版本开始Google在发布新的Android版本之前会Release给与其签约过的OEM厂商和半导体供应商PDK(PDK的获取需要授权,因为PDK中的新版Android尚未正式发布),这样OEM厂商不会再落后于Google挑选的独家早期开发伙伴。PDK版本只包含开发android HAL(硬件抽象层)所必需的组件。请注意,完整的android版本是PDK版本的超集,并且没有单独的PDK发布给公众.

sdk

编译sdk规则目录, Android的SDK包含该平台为应用程序开发人员提供的开发工具,主要是所有公开API的集合,应用程序开发人员可以借助SDK中的API快速的进行应用的开发.

platform_testing

Android平台测试程序

prebuilts

预编译文件夹, x86和arm架构下预编译的一些资源,如ndk工具包, gcc编译器等

system

Android底层文件系统库、应用和组件,如busybox, init进程

test

Android Vendor测试框架,如vts(vendor test suit) ,Mainline Test Suite (MTS), mlts

vts的概念: CTS确保保了 APP 与 Android Framework 之间有一致的调用接口(API),这使得 APP 开发者编写的同一款程序可以运行在不同系统版本(向前兼容)、不同硬件平台、不同厂商制造的不同设备上。 VTS 类似 CTS,通过对 Vendor Interface 进行测试,确保同一个版本的 Android Framework 可以运行在不同 HAL 上,或不同 Android Framework 可以运行在 同一个 HAL 上。 通过这样的 Framework / HAL 分离设计和接口一致性保证,也使得 8.0 版本之后的 Android 系统在进行升级时,可以直接对 Framework 进行升级而不用考虑 HAL 层的改动,从而缩短了用户手上设备得到系统升级 OTA 推送的时间

Mainline Test Suite (MTS), MTS由一组测试框架和测试用例组成,旨在帮助增强主线分支代码的健壮性、可靠性和合规性。

mlts是Android 机器学习测试套件

toolchain

没什么内容,都是一些python测试脚本

tools

一些特殊命令, 如acloud命令用于连接谷歌云端工作站的,apkzlib用于apk打包的

二,out目录

目录下主要两个子目录,host当前编译主机需要用到的工具和库, 一般都是x86架构的

host/

├── common

│   └── obj

└── linux-x86

    ├── bin

    ├── com.android.runtime

    ├── fake_packages

    ├── framework

    ├── lib

    ├── lib64

    ├── obj

    ├── obj32

    ├── testcases

    └── usr

另外一个就是target目录,就是目标机器运行所需要二进制文件, 普遍都是arm架构的二进制文件, 当然如果是选择了generic_x86相关的产品, 就是x86架构的二进制, 里面就是我们真正制作根文件系统的原材料, 该目录一般都是存放编译的中间文件,如.o文件, 以及目标文件,包含strip和unstrip的。同时对这些文件进行分门别类的进行存放。

生成的中间文件:

tree -L 1 out/target/product/generic_x86_64

├── obj:这个就是64位的二进制文件目录 

├── obj_x84 : 这个就是32位的二进制文件目录,如果是arm架构的, 这个名字就是obj_arm

tree –L 1 out/target/product/rk3399_roc_pc_plus/obj

├── APPS : 内置app的中间编译文件

├── CONFIG

├── ETC :  etc的中间编译文件,一般都会最终生成到system/etc或者vendor/etc目录

├── EXECUTABLES:可执行的中间编译文件

├── FAKE

├── HEADER_LIBRARIES

├── include

├── JAVA_LIBRARIES: java jar库的中间编译文件

├── NATIVE_TESTS

├── PACKAGING:镜像打包时的中间编译文件

├── RENDERSCRIPT_BITCODE

├── SHARED_LIBRARIES:动态库的中间编译文件

└── STATIC_LIBRARIES:静态库的中间编译文件

生成的目标文件:主要就是包含各种镜像, 以及镜像对应的目录文件夹

├── ramdisk

├── ramdisk-debug.img

├── ramdisk.img

├── recovery

├── root

├── rootfs

├── snapshots

├── split

├── super_empty.img

├── super.img

├── symbols

├── system

├── system.img

├── system-qemu.img

├── userdata.img

├── userdata-qemu.img

├── userdata-qemu.img.qcow2

├── vbmeta.img

├── vendor

├── vendor.img

├── vendor-qemu.img

三, system目录

Android作为linux系统, 在构建最小系统时,需要祖先init进程, 依赖库,二进制工具linux命令,以及各种守护进程等, system目录就提供了这些东西,该目录大部分都是C/C++代码。

system/

├── apex:apexd守护进程源码,负责处理apex安装包的。

├── ashmemd

├── bpf

├── bpfprogs

├── bt : Android bluedroid协议栈

├── ca-certificates

├── chre: Context Hub Runtime Environment (CHRE),用于平衡大小核运行不同程序的场景, 提供api,保证小型的本机应用程序(称为nanoapps )在低功耗处理器上执行。

├── connectivity: 包含wificond进程,该进程通过标准 nl80211命令与WLAN 驱动程序进行通信

├── core:包含各种依赖库,adb,祖先init进程源码,lmkd,logcat, toolbox 

├── extras:各种额外的命令工具, 比如su,memtrack(追踪graphic相关内存),playwav命令,以及一些测试代码

├── gatekeeper:防护程序,如锁屏密码等

├── gsid: 通用系统镜像守护进程

├── hardware: 网络相关的HIDL描述文件。

├── hwservicemanager:HAL服务管理中心,负责管理系统中的所有HAL服务,由init进程启动,属于vendor的binder通信机制,类似framework中的binder.

├── iorap : IOrap用于缩短应用程序的启动时间,该目录包含iorapd守护进程和相应的库文件。

├── keymaster:

├── libfmq

├── libhidl :  硬件接口定义语言依赖库

├── libhwbinder : hwbinder依赖库

├── libsysprop:sysprop说明文件 (.sysprop) 将系统属性定义为 API, 在java/c++代码中可以通过api访问跨分区的属性,类似以前android版本中的SystemProperties

├── libufdt

├── libvintf

├── linkerconfig

├── media :包括alsa、audio、camera相关的头文件

├── netd: Android中专门负责网络管理和控制的后台守护进程,如管理DNS,设置防火墙,带宽控制

├── nfc

├── nvram

├── security:

├── sepolicy:selinux权限策略配置目录

├── server_configurable_flags

├── testing

├── timezone

├── tools: aidl,hidl可执行程序的源码路径

├── ucontainer

├── update_engine:  负责A/B升级的核心逻辑代码。

└── vold:Volume守护进程,用来管理Android中存储类的热拔插事件,如设备增加,删除,修改等事件处理

四, framework目录

├── av: audio/video, 如音视频解码器,录屏工具, 摄像头框架相关代码, 多媒体框架供上层程序调用的java API,连接java和C/C++的jni部分, 在framework/base/media 下

│   ├── apex

│   ├── camera: libcamera_client共享库,是camera框架部分的client代码

│   ├── CleanSpec.mk

│   ├── cmds:包括录屏工具,stagefright进程。

│   ├── drm:

│   ├── include

│   ├── media:提供音视频编解码的各种库和工具,后台进程如audioserver, mediaserver(通过binder的进程间通信方式来完成其他进程(如音乐播放器)的请求)

│   ├── MODULE_LICENSE_APACHE2

│   ├── NOTICE

│   ├── OWNERS

│   ├── services:多媒体相关的后台服务, 如cameraservice,audioflinger

│   ├── soundtrigger

│   └── tools

├── base : 基础核心代码

├── compile :包含libbcc,mclinker(llvm编译器的插件)  slang(Renderscript语言的编译器)

├── ex : Android内部使用的公共类,如联系人、小部件、io, 以及全新的相机框架 Camera2的部分代码。

├── hardware : 描述传感器,虚拟现实VR,camera等硬件的HIDL接口的文件.hal

├── layoutlib : 布局相关

├── minikin : Android原生字体,连体字效果

├── ml :机器视觉

├── multidex :多dex加载器,大多数App,解压其apk后,一般只有一个classes.dex文件,采用MultiDex的App解压后可以看到有classes.dex,classes2.dex,… classes(N).dex

├── native :c/c++本地语言编写的相关工具源码和特定硬件控制的头文件,如 bugreport, dumpstate, 各种硬件的访问权限声明.

├── opt :一些UI插件和java后台服务,如timezonepicker,datetimepicker, colorpicker, 网络服务,如EthernetService, WifiService, 电话服务telephony

├── rs :渲染脚本rendor script

└── wilhelm: 基于Khronos的OpenSL ES/OpenMAX AL的audio/multimedia实现

其中base目录中是应用框架层的主要核心代码,目录结构如下:

base/

├── apct-tests

├── api :主要是txt文件, 声明了android应用框架层类、属性和资源

├── cmds:  开机启动的进程代码和命令(脚本), 著名的zygote进程代码和启动动画代码就在此处。

├── config

├── core :

├── java: Android应用开发锁依赖的各种包, 四大组件代码就在此,如android/app/Activity.java

          android/app/Service.java,android/content/ContentProvider.java, ./android/content/BroadcastReceiver.java

├── jni: 服务于android系统java核心代码所需要的jni,被编译成libandroid_runtime.so

├── proto

├── res: 系统中所需要的各种资源, 图片,字符串,尺寸,布局文件等

├── tests

└── xsd 

├── data:系统默认的铃声,字体, 根文件系统etc目录部分配置文件,触摸需要的kl, kcm文件等。

├── docs

├── drm:Digital Rights Management(数字版权管理) ,应用根据与受版权保护的内容关联的许可限制来管理自己的内容,从而达到保护应用内容的知识产权。

├── graphic:为应用提供的android.graphics包,提供基本的图形原语(如画点画线,设置图形上下文等)

    另外和图形相关的包:android.view图形事件机制和android.widget包提供开发图形用户界面的控件

├── keystore: 提供android.security.keystore包, 应用可以通过KeyStore API生成密钥、使用密钥签名, keystorek可以保护密钥材料免遭未经授权的使用

├── libs:大部分都是c/c++代码,编译成so, 如Canvas 的drawing 操作转换为OpenGL 的操作的libhwui.so

├── location :定位相关接口,被App调用的,API包是android.location

├── lowpan:提供android.net.lowpan报,提供基于IPv6的低速无线个域网的API, lowpan功能与Zigbee类似

├── media: 多媒体相关接口,被App调用的, 包含MediaPlayer代码

├── native : 部分硬件相关的jni库:如sensor, net, 存储管理, 最后合并在libandroid.so中

├── nfc-extras

├── NOTICE

├── obex:蓝牙文件传输obex协议

├── opengl: 提供android.opengl包, 提供android 2D/3D图形处理各种API

├── packages:著名的SystemUI,彩蛋,锁屏,SettingProvider(系统设置数据提供者)

├── proto

├── rs: 提供android.renderscript 包,RenderScript 是Android 平台上的一种类C脚本语言,用于渲染绘

├── samples

├── sax

├── services :android开机启动的大部分后台服务,如PMS, AMS, WMS等

├── startop

├── telecomm

├── telephony

├── test-base

├── test-legacy

├── test-mock

├── test-runner

├── tests

├── tools: 提供应用开发的各种工具和脚本:如aapt

└── wifi: 提供android.net.wifi包,如wifi扫描, p2p,hotspot2相关API

五,libcore目录

 libcore 提供Android 系统中支持众多 Java 标准的库,例如 java.lang 包

luni

Java 基础包、扩展包、组织提供的类库等,luni 实际上是 lang、util、net、io 这 4 个内容头字母的组合,通过文件luni/src/module/java/module-info.java可以导出的所有类

libart

art 运行时部分相关包

dalvik

dalvik 虚拟机相关的包

dom

文档对象模型,用于解析xml

json

json 串在 Java 中的支持

xml

一种轻量级的xml解析工具

ojluni

Open JDK 版的 Java 包,android7.0之后就开始用这个开源的java api

tree -L 2 ojluni/src/main/java/

ojluni/src/main/java/

├── com

│   └── sun

├── java

│   ├── awt

│   ├── beans

│   ├── io

│   ├── lang

│   ├── net

│   ├── nio

│   ├── security

│   ├── sql

│   ├── text

│   ├── time

│   └── util

├── javax

│   ├── crypto

│   ├── net

│   ├── security

│   └── sql

├── jdk

│   └── net

└── sun

    ├── invoke

    ├── misc

    ├── net

    ├── nio

    ├── reflect

    ├── security

    └── util

总结

Android源码比较庞大, 目录层级结构比较深, 通过以上介绍, 可以对Android源码有一个整体的认识。

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旗浩QH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值