Android系统的整个源码目录结构分析
本文介绍的Android系统源码并不是像某一个类(比如:Handler)的源码,而是支持整个Android系统能够运行的源码。
这里只对Android系统源码目录进行分析,具体的源码一般都是根据需求来看。
一.Android源码的基本知识
Android源码包含比较多的文件,比如Android系统的所有页面,里面的所有app程序,还包含了sdk,各种镜像img等等
像我接触过的几个完整Android源码基本在200G左右!而且这还是比较初始的设计板,里面几个基本功能的app程序。
Android源码编译得到镜像文件img并不是很大,一般1-2G,把这几个镜像烧录到我们的Android设备上,Android设备就可以运行起来,就像我们正常使用的手机那样。
Android系统架构分为四层,从上到下依次是应用层、应用框架层、系统运行库层和Linux内核层。
大部分Android程序员开发App都是只接触应用层。即使那些很复杂的App,或者需要很多C语言类库支持的App的开发,都只是应用层的开发。
应用框架层是能管理这些App的程序,或者镶嵌在设备本身的那些程序的管理开发。
比如手机Home键,Back键的逻辑都可以在框架层做处理,通知窗口,电话窗口。。。
还有Android系统本身的音乐播放,系统设置这些程序都是在框架层的源码中可以修改的。
1.Android系统源码目录
我们要先了解Android系统源码目录,为后期源码学习打下基础。
关于源码的阅读,你可以访问:
http://androidxref.com/
来阅读系统源码。
当然,最好是将源码下载下来。下载源码可以使用清华大学开源软件镜像站提供的Android 镜像:
https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/ 。
如果觉得麻烦也可以查找国内的网盘进行下载,推荐使用该百度网盘地址下载:http://pan.baidu.com/s/1ngsZs,
它提供了多个Android版本的的源码下载。
整体结构
各个版本的源码目录基本是类似,如果是编译后的源码目录会多增加一个out文件夹,用来存储编译产生的文件。
Android7.0的根目录结构说明如下表所示。
Android源码根目录 描述
abi 应用程序二进制接口
art 全新的ART运行环境
bionic 系统C库
bootable 启动引导相关代码
build 存放系统编译规则及generic等基础开发包配置
cts Android兼容性测试套件标准
dalvik dalvik 虚拟机
developers 开发者目录
development 应用程序开发相关
device 设备相关配置
docs 参考文档目录
external 开源模组相关文件
frameworks 应用程序框架,Android系统核心部分,由Java和C++编写
hardware 主要是硬件抽象层的代码
libcore 核心库相关文件
libnativehelper 动态库,实现JNI库的基础
ndk NDK相关代码,帮助开发人员在应用程序中嵌入C/C++代码
out 编译完成后代码输出在此目录
packages 应用程序包
pdk Plug Development Kit 的缩写,本地开发套件
platform_testing 平台测试
prebuilts x86和arm架构下预编译的一些资源
sdk sdk和模拟器
system 底层文件系统库、应用和组件
toolchain 工具链文件
tools 工具文件
Makefile 全局Makefile文件,用来定义编译规则
上面这么多文件夹,有些是一直不需要去理会的,比如说我接触较多的就文件夹:device,build,out,packages。
device下都是一些配置文件,比如Wifi Adb端口如果需要写死,可以添加属性并设置里面的参数
build下是一些编译规则,比如可以设置某些程序是否安装。
out下是编译完成后生产的各种文件,比如各种系统的apk文件,这些都是即将安装到Android设备上面的
package下包含很多Android项目的源码,手机上所有可以点击的图标其实都是一个Android项目,比如录音,电话,系统设置,或者三方的一些程序(阅读器,应用商城)等等
Android系统源码也不是没有bug的,比如我之前的一个Android板子上的Music就有几个bug,需要进去package/apps/Music里面修改源码
把源码修改后重新编译,再把编译生成的镜像文件烧录到Android设备上就可以了。
接下来分析packages中的内容,也就是应用层部分。
2.应用层packages部分
应用层位于整个Android系统的最上层,开发者开发的应用程序以及系统内置的应用程序都是在应用层。
源码根目录中的packages目录对应着系统应用层。它的目录结构:
packages目录 描述
apps 核心应用程序
experimental 第三方应用程序
inputmethods 输入法目录
providers 内容提供者目录
screensavers 屏幕保护
services 通信服务
wallpapers 墙纸
这里我们还提供了kernel的一些目录文件
arch: 体系结构,每个架构的CPU对应有一个子目录
block: 块设备通用函数
crypto: 常用加密和散列算法
drivers: 设备驱动程序目录
fs: 文件系统
include: 内核头文件
init: 内核初始化代码
ipc, 进行间通信的代码
kernel. 内核管理的核心代码.与处理器相关的代码位于arch//kernel目最下
lib· 内核常用的庫函数代码
mm, 内存管理代码,与处理器相关的代码位于arch//mm目最下
net 网络支持代码
security 安全、密钥相关代码
sound·音频设各的驱动程序
usr.该目录中的代码为内核尚未完全启动时执行用户空间代码提供了支持(initrd镜像)
Documentaion.内核相关文档
scrips 内核脚本文件
常用目录:
arch/arm/boot/dts与芯片平台有关,dts芯片平台硬件驱动相关配置
drivers目录,驱动,重点关注cpufreq,mtd,gpio,regulator,rtc,input,media,net,usb,power,misc,video等
include目录,驱动头文件
net目录,调试网络驱动要用到
sound/soc目录,调试音频相关
scripts目录,自行编写的脚本文件可以运行
可以看到package中还包含内容提供者,像我们在应用上能都访问手机系统通讯录,系统日历,
都是package中写好的内容提供者,所以我们才能调用那些uri对系统数据进行增删改查操作。
3.其他
我们如果要修改源码,就要先知道修改的文件在源码目录的哪个位置。这个不懂可以上网多查查。
然后修改源码,也不是一个简单的活。如果只是一两行代码,随便打开一个文本编辑器,编辑保持即可。
如果是编辑里面一个大项目,并且要看里面的相关逻辑,可以使用Source Insight这个专门查看编辑源码的工具。
如果编辑的是源码里面的小Demo,我建议可以把代码复制出来,弄到Eclipse或Studio中调试,
因为源码的调试真的很麻烦,改几句代码编译、烧录半小时就过去了。
但是源码的代码也不能直接Import 到Eclipse或Studio中,源码有的是java代码和res代码
所以我的做法是创建一个项目然后报源码中的java代码和res代码复制进去,记得AndroidManifest复制进去。
在Studio中记得改app中的build.gradle的包名和版本。
运行程序后,不断调试,修改源码。
记得把修改的位置用另一个文档记录下来,然后在源码目录中修改代码。
这里只是简单分享了一下Android系统源码的知识。后面还会深入探究的。