APP Tech · 2019年10月20号 0

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 墙纸
可以看到package中还包含内容提供者,像我们在应用上能都访问手机系统通讯录,系统日历,

都是package中写好的内容提供者,所以我们才能调用那些uri对系统数据进行增删改查操作。

3.其他
我们如果要修改源码,就要先知道修改的文件在源码目录的哪个位置。这个不懂可以上网多查查。

然后修改源码,也不是一个简单的活。如果只是一两行代码,随便打开一个文本编辑器,编辑保持即可。

如果是编辑里面一个大项目,并且要看里面的相关逻辑,可以使用Source Insight这个专门查看编辑源码的工具。

如果编辑的是源码里面的小Demo,我建议可以把代码复制出来,弄到Eclipse或Studio中调试,
因为源码的调试真的很麻烦,改几句代码编译、烧录半小时就过去了。

但是源码的代码也不能直接Import 到Eclipse或Studio中,源码有的是java代码和res代码
所以我的做法是创建一个项目然后报源码中的java代码和res代码复制进去,记得AndroidManifest复制进去。
在Studio中记得改app中的build.gradle的包名和版本。
运行程序后,不断调试,修改源码。
记得把修改的位置用另一个文档记录下来,然后在源码目录中修改代码。

这里只是简单分享了一下Android系统源码的知识。后面还会深入探究的。