配套系列教学视频链接:
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源码有一个整体的认识。