一.准备工作
Android 官方声明 AOSP 历来是在 Ubuntu LTS 版本中进行开发和测试。所以为了避免任何其他不必要的麻烦,请使用 Ubuntu 及其他基于 Ubuntu 的发行版
最低环境要求:
- Ubuntu 14.04+
- JDK1.8+
- python3
- GNU make
- git
二.下载Aosp源码
1.安装GIT
首先需要安装Git,因为源码是用Git管理的。
接下来创建一个bin文件夹,并加入到PATH中,有点像Windows的环境变量。
2.安装Python环境
3.安装repo及配置
repo 是一个python 脚本(所以我们上面要配置Python环境),因为Android源码包含数百个git库,简化帮助管理git Android版本库的工具。
(1)安装curl下载的库:
(2)下载repo并设置可以运行权限。
(3)添加下载源
google 的AOSP 的话,因为FQ和数据量太大,且需要需要翻墙影响速度,因此优先考虑国内的镜像(本文使用的是清华的源)。
4.初始化及同步源码
(1)创建文件夹
创建一个AOSP文件夹,cdd到文件夹里面去待会儿需要把源码下载到这里:
(2)初始化Aosp仓库
(3)初始化并指定版本
AOSP对应关系查看地址: 对应关系
(4)开始同步源码
因为Android的源码越来越大,repo sync失败的概率也越来越高。所以我们可以避开使用repo sync的方式,而采用下载预下载包的方式来实现下载源码
5.预下载包的方式
1. 下载预下载包
2. 解压预下载包
3. 查看分支
4. 在aosp目录选择需要同步的版本
5.防止下载源码执行脚本卡死
通过自定义Shell脚本启动源码下载可以有效防止,同步源码时脚本被卡死的问题。
(1)在AOSP文件夹中新建down.sh文件
(2)执行down.sh文件
sh down.sh
三.AOSP源码目录结构
- abi Application Binary Interface 应用程序二进制接口,abi相信同学们在SO库调用上遇到过,如果不支持该平台的话就说不ABI不支持
- art Android Runtime 安卓运行时。这个会提前把字节码编译成二进制机器码保存起来,执行的时候加载速度比较快。Dalvik虚拟机则是在加载以后再去编译的,所以速度上ART会比Dalvik快一点。牺牲空间来赢取时间
- bionic 基础库,Android系统与Linux内核的桥梁。Bionic 音标为 bīˈänik,翻译为"仿生"
- bootable 系统启动引导相关程序
- build 用于构建Android系统的工具,也就是用于编译Android系统的
- cts Compatibility Test Suite 兼容性测试
- dalvik dalvik虚拟机,用于解析执行dex文件的虚拟机
- developers 开发者目录
- developerment 开发目录,比如说应用,application就在里面了,apps
- devices 设备相关的配置信息,什么索尼、HTC、自己的产品,就可以定义在这个目录下了
- docs 文档
- external 开源模组相关文件
- frameworks 系统架构,Android的核心了
- hardware hal层代码,硬件抽象层
- libcore 核心库
- libnativehelper native帮助库,实现JNI的相关文件
- ndk native development kit
- out 输出目录,编译以后生成的目录,相关的产出就在这里了
- packages 应用程序包。一些系统的应用就在这里了,比如说蓝牙,Launcher,相机,拨号之类的。
- pdk Plug-in Development Kit (PDK) is designed to help you build your own pattern projects
- platform_testing 平台测试
- prebuilts x86/arm架构下预编译的文件
- sdk software development kit
- system 底层系统文件
- toolchain 工具链
- tools 工具文件
- Makefile mk文件,用于控制编译
四.AOSP源码整编
编译AOSP源码需要配置好JAVA环境.
1.安装Java编译环境
2.进入AOSP文件夹,进行编译
(1)初始化编译环境
(2)删除上一次编译的结果,初次编译可以不需要这一步
(3)选择与设备对应的编译版本
选择与设备对应的编译版本.如:编译开发工程师的版本lunch aosp_x86-eng,可以方便debug
编译版本选择
如果lunch命令没有加对应的编译版本则会有以下信息输出:
这里需要选择编译目标的格式(选择前面的序号,按回车即可),编译目标的格式组成为BUILD-BUILDTYPE,比如aosp_arm-eng的BUILD为aosp_arm,BUILDTYPE为eng。 其中BUILD表示编译出的镜像可以运行在什么环境,aosp代表Android开源项目,arm表示系统是运行在arm架构的处理器上;
BUILDTYPE 指的是编译类型,有以下三种:
- user:用来正式发布到市场的版本,权限受限,如没有 root 权限,不能 dedug,adb默认处于停用状态。
- userdebug:在user版本的基础上开放了 root 权限和 debug 权限,adb默认处于启用状态。一般用于调试真机。
- eng:开发工程师的版本,拥有最大的权限(root等),具有额外调试工具的开发配置。一般用于模拟器。
- 如果你没有Nexus设备,只想编译完后运行在模拟器查看,那么BUILD可以选择aosp_x86,BUILDTYPE选择eng。
(4)开始编译
j后面数字几就是多少线程,最多不超过你的cpu总线程,
编译成功会显示如下:
会在源码跟目录out/target/product/angler目录下生成镜像文件:
- system.img:系统镜像
- ramdisk.img:根文件系统镜像
- userdata.img:用户数据镜像
- recovery.img:recovery镜像
- boot.img:启动镜像
- vendor.img:驱动镜像
最终会在 out/target/product/generic_x86/目录生成了三个重要的镜像文件: system.img、userdata.img、ramdisk.img。大概介绍着三个镜像文件:
- system.img:系统镜像,里面包含了Android系统主要的目录和文件,通过init.c进行解析并mount挂载到/system目录下。
- userdata.img:用户镜像,是Android系统中存放用户数据的,通过init.c进行解析并mount挂载到/data目录下。
- ramdisk.img:根文件系统镜像,包含一些启动Android系统的重要文件,比如init.rc。
3.编译错误解决
(1)缺少libncurses.so.5
报错信息:
解决方式:
(2)缺少M4
报错信息:
解决方式:
(3)去除所有本地化设置
报错信息:
解决方法:
(4)xmllint的问题
报错信息:
解决方案:
(5)编译内存不足
报错信息
解决方案:
五.运行模拟器
启动模拟器
在编译完成之后,就可以通过以下命令运行Android虚拟机了,由于之前已经执行过source和lunch命令了,可以直接运行:
就会启动模拟器
六.AOSP源码编译某个单独的模块
上面的编译我们都是对整个Android系统进行编译的.如果我们要编译系统的Settings应用模块,这就属于源码单编某一个模块.
在AOSP根目录执行:
进入Settings的目录:
通过mm编译当前目录下的模块,不编译依赖模块。
mm
编译成功后会有提示生成文件的存放路径。除了Settings.odex文件,还会在out/target/product/generic_x86/system/priv-app/Settings目录下生成Settings.apk。
此外还有以下命令可以进行单编:
- mmm:编译指定目录下的模块,不编译它所依赖的其它模块。
- mma:编译当前目录下的模块及其依赖项。
- mmma:编译指定路径下所有模块,并且包含依赖。
如果对系统模块的源码进行修改,查看生成的APK文件,有两种方式:
- 通过adb push或者adb install 来安装APK。
- 使用make snod命令,重新生成 system.img,运行模拟器查看