编译源码需要在Linux环境下进行。在搭建好Linux环境之后,还要安装增强工具gcc编译器和perl库。安装增强工具是目的有:实现虚拟机和主机的文件共享;可以使用全屏模式。
AOSP源码的下载:
AOSP是由google开发的Android开源项目。简单来说,AOSP就是一个Android系统源码项目,通过它就可以定制Android操作系统,而国内手机厂商就是在此基础上开发定制系统的。下载AOSP的第一步就是下载repo。
1.下载repo:
因为Android的系统源码包含数百个git库,下载那么多的git库是一个繁重的任务,因此google开发了repo,它是一个用于管理Android版本库的工具,使用了python进行了一定的封装,简化了对多个git版本库的管理任务。
2.下载源码:
下载AOSP源码包括内核源码的下载,因为内核源码是单独的且有很多版本。
系统源码的整编和单编:
为了实现这些需求,我们需要编译系统源码:
- 动态调试Android系统源码。
- 定制Android系统。
- 将最新版本的Android系统刷入自己的Android设备中。
- 将系统源码导入Android Studio中。
1.编译系统的概述:
1.1:常见概念:
1.Makefile:
Android平台的编译系统,其实就是用Makefile写的一个独立项目。它定义了规则,实现了“自动化编译”,不仅能把分散在数百个Git库中的代码整合起来进编译,而且还能把产物分门别类地输出到一个目录中,打包成手机ROM,还可以生成应用开发时所使用的SDK、NDK等。因此,采用Makefile编写的编译系统,也可以称为Makefile编译系统。
2.Android.mk:
Makefile编译系统的一部分Android.mk,定义了一个模块的必要参数,使模块随着平台编译。通俗来讲,就是告诉编译系统以什么样的规则来编译源码,并生成对应的目标文件。
3.Ninja:
Ninja是一个致力于提升速度的小型编译系统,如果把其他编泽系统看作高级语言,那么Ninja的目标就是汇编语言。
4.Soong:
Soong是Google用来替代此前Makefile编译系统的替代品,负责解析Android.bp文件,并将之转换为Ninja文件。
5.Blueprint:
Blueprint用来解析Android.bp文件,并将其翻译为Ninja语法文件。
6.kati:
kati是Google专门为Android开发的一个基于Golang和C++的小项目,其用处是将Android中的Makefile转换成Ninja文件。
7.Android.bp:
Android.bp是用来替换Android.mk的配置文件。
1.2:图解:
Blueprint负责解析Android.bp文件的内容,Blueprint类似一个处理相关语法的库文件,Soong则用于定义具体如何处理相应的语法及命令实现。通俗来讲,就是 Soong借助于Blueprint定义的Android.bp语法,完成对Android.bp的解析,并最终将其转换成 Ninja文件。Makefile文件会通过kati转换为Ninja文件。Makefile默认的文件名为Makefle或makefile,也常用.make或.mk作为文件的后缀,Ninja的默认文件名为build.ninja,其他文件以.ninja作为文件后级,Makefile与 Ninja的区别在于Makefile是为开发编写的,而Ninja则用于生成其他程序,如果说 Makeflie是高级语言,那么Ninja就是汇编语言。
1.3:编译源码的方式:
Android系统源码的编译方式有很多种,其中主要有以下几种:
- 在Linux中直接进行系统源码编译(Android官方支持)。
- 在macOS中直接进行系统源码编译(Android官方支持)。
- 使用Docker编译,支持macOS和Windows。
2.源码的整编:
整编就是对整个Android源码进行编译,整编主要有三个步骤,分别是:
- 初始化环境。
- 选择编译的目标。lunch命令。
- 通过-jN参数来设置编译的并行任务数,提高编译的速度。
补充:
- 编译目标的格式为:BUILD-BUILDTYPE。例如:aosp_arm-eng它的BUILD是aosp_arm,BUILDTYPE是eng。其中BUILD指的是编译出的镜像可以在什么样的环境下运行,而aosp代表Android开源项目,arm代表系统运行在ARM架构的处理器上。BUILDTYPE指的是编译类型,有以下三种:user(正式发布到市场的版本),userdebug(在user版本的基础上开放了root权限和debug权限),eng(开发工程师使用的版本,拥有最大的权限和额外调试工具的开发配置)。
- 编译之后会生成三个重要的镜像文件,分别是system.img(系统镜像,其中包括了Android系统的主要目录和文件),userdata.img(用户镜像,是Android系统中用来存放用户数据的地方),ramdisk.img(根文件系统镜像,包括一些启动Android系统的重要文件)。
3.源码的单编:
常见的编译命令有:
- mm:编译当前目录下的模块,不编译依赖的模块,成功后系统提示生成文件的存放路径。
- mmm:编译指定目录下的模块,不编译它所依赖的其他模块。
- mma:编译当前目录下的模块以及其的依赖项。
- mmma:编译指定的路径下的所有模块,并且包含其的依赖项。
如果修改了源码,想要查看生成的apk文件,则有如下方式:
- 通过adb push或者adb install来安装apk。
- 使用make snod命令,来重新生成system.img,然后运行模拟器。
导入系统源码:
- 使用Source Insight导入系统源码,但是不能调试。
- Android studio导入系统源码,