aosp编译
一、编译步骤
1.1 下载源码
如果网络允许,可以从Google直接下载源码。本节介绍如何使用国内的镜像源下载,清华源由于目前限速,所以选择中科大源。
首先下载谷歌的源码管理工具repo,该工具源于depot_tool
,可以直接下载depot_tool
并在PATH
下建立符号链接,也可以仅下载repo的代码,这里以后者为例。
建立源码目录并进入,以android 10代码为例。
初始化源码仓库,其中-b
选项用于设定要同步的Android版本,这里以Android 10的第一个发行版为例。完整的可选参数在这里。类似于git,这一步执行完后会在该目录下生成.repo
文件。
最后开始同步代码,选项-j
用于表示同步的线程数,建议不要选择太大,4个线程足够,线程数太多可能会有同步失败的可能。
1.2 编译环境部署
硬件要求:
64位的操作系统只能编译 2.3.x 以上的版本,如果你想要编译 2.3.x 以下的,那么需要32位的操作系统.
磁盘空间越多越好,至少在 100GB 以上;如果你想要在是在虚拟机运行linux,那么至少需要16GB的 RAM/swap.
软件要求:
操作系统要求
在AOSP开源中,主分支使用Ubuntu长期版本开发和测试的,因此也建议你使用Ubuntu进行编译,下面我们列出不同版本的的Ubuntu能够编译那些android版本:
Android版本
编译要求的Ubuntu最低版本
Android 6.0 至 AOSP master
Ubuntu 14.04
Android 2.3.x 至 Android 5.x
Ubuntu 12.04
Android 1.5 至 Android 2.2.x
Ubuntu 10.04
JDK版本要求
除了操作系统版本这个问题外,我们还需要关注JDK版本问题,下面列出的不同Android版本的源码需要用到的JDK版本:
Android版本
编译要求的JDK版本
AOSP的Android主线
OpenJDK 8
Android 5.x 至 android 6.0
OpenJDK 7
Android 2.3.x 至 Android 4.4.x
Oracle JDK 6
Android 1.5 至 Android 2.2.x
Oracle JDK 5
更具体的可以参看:Google源码编译要求
其它要求
Google官方构建编译环境指南中已经说明了Ubuntu14.04,Ubuntu 12.04,Ubuntu 10.04需要添加的依赖(推荐使用ubuntu 14.04)
而Ubuntu16.04添加的依赖为:
下载硬件驱动程序(刷入到真机时使用)
我们从google下载的源码编译后不能直接的刷入到我们的手机上,主要就是因为我们需要将设备对应的驱动放到源码里面一起编译,google旗下的nexus产品的驱动你可以通过以下的链接下载到: https://developers.google.com/android/nexus/drivers 将对应的三个文件下载下来,解压得到sh文件并放到Android源码根目录下。然后在终端中分别执行上述三个sh文件,即可在源码根目录下的 vendor
文件夹下自动释放相应文件
1.3 编译
在使用Android源码之前,需要完整编译整个源码
进入Android源码根目录:
lunch
的作用是选择选择编译目标,编译目标的格式为:BUILD-BUILDTYPE
BUILD 指的是特定功能的组合的特定名称,即表示编译出的镜像可以运行在什么环境
aosp(Android Open Source Project)代表Android开源项目
arm 表示系统是运行在arm架构的处理器上
arm64则是指64位arm架构处理器
x86 则表示x86架构的处理器
BUILD TYPE 则指的是编译类型,通常有三种:
user
- 代表这是编译出的系统镜像是可以用来正式发布到市场的版本,其权限是被限制的(如:没有root权限,不能dedug等)userdebug
- 在user版本的基础上开放了root权限和debug权限eng
- 代表engineer,也就是所谓的开发工程师的版本,拥有最大的权限(root等),此外还附带了许多debug工具
我们平时常用的设备代码和编译目标:
设备型号
设备代码
编译目标
Nexus 5
hammerhead
aosp_hammerhead-userdebug
Nexus 6
shamu
aosp_shamu-userdebug
Nexus 5X
bullhead
aosp_bullhead-userdebug
Nexus 6P
angler
aosp_angler-userdebug
公司的小辣椒手机
pxa1908sl_tz-userdebug
更多参考:官方文档
可以在编译前修改源文件中的 ro.secure,避免以后在adb shell中无法 remount 的情况。
在文件 /build/core/main.mk 和 /build/core/build-system.html中,将 ro.secure = 1 改为 ro.secure = 0(两个文件中共有4个值)
二、单个编译编译
以反汇编作为case检测策略时,有时需要编译单个模块来获取汇编代码打补丁前后变化,常用指令如下。
编译指令
解释
m
在源码树的根目录执行编译
mm
编译当前路径下所有模块,但不包含依赖
mmm [module_path]
编译指定路径下所有模块,但不包含依赖
mma
编译当前路径下所有模块,且包含依赖
mmma [module_path]
编译指定路径下所有模块,且包含依赖
make [module_name]
无参数则表示编译整个Android代码
Tips:
对于m、mm、mmm、mma、mmma这些命令的实现都是通过make方式来完成的;
mm/mmm 默认只会编译发生改变的部分,如果要编译模块的所有文件,需要
-B
选项mmm/mm编译的效率很高,而make/mma/mmma编译较缓慢;
make/mma/mmma编译时会把所有的依赖模块一同编译,但mmm/mm不会;
建议:首次编译时采用make/mma/mmma编译;当依赖模块已经编译过的情况,则使用mmm/mm编译
三、代码刷入实机
用USB将手机与PC连接;
sudo adb reboot bootloader
进入fastboot模式如果fastboot是锁定状态(屏幕下方有一个小锁),需要执行
fastboot oem unlock
在 out/target/product/xxx 目录下执行
fastboot -w flashall
(需要先执行. build/envsetup.sh
设置必要的环境变量),会将目录下的所有 .img 文件烧录到手机中
fastboot 的常用命令:
四、remount
将修改后的 xxx.so 文件写入手机:
关于无法remount的问题
检查系统的ro.secure是否为0
如果不是,修改代码makefile,在build/core/main.mk 和 build/core/build-system.html将其中的ro.secure = 1 改为 ro.secure = 0,再full build
Last updated
Was this helpful?