文章目录
一、前言
二、Android源码编译
1、清理
2、设置环境
3、选择编译目标
什么是BUILD?
什么是BUILDTYPE?
Android的版本
4、开始编译
5、再次编译
6、运行模拟器
警告1:
警告2:
警告3:
最后:
上篇文章已下载全部的Android源码,其存放路径应该放在 “区分大小写的磁盘映像” 目录下,我的目录如下:
那么同步源码步骤为:
1、挂载区分大小写的磁盘映像
2、切换到源码目录:cd /Volumes/untitled/WORKING_DIRECTORY
3、执行源码更新:repo sync
解决 repo: command not found 问题,执行命令:
echo 'export PATH=$PATH:$HOME/bin' >> ~/.bashrc
export PATH=$PATH:$HOME/bin
更新源码完毕,如下图:
切换到源码目录:cd /Volumes/untitled/WORKING_DIRECTORY
为了确保新安装的二进制文件在解压后会被适当考虑在内,请使用以下命令删除所有以前编译操作的已有输出
我们在 Android 源码目录下执行如下清理命令:
make clobber
17:31:45 Entire build directory removed 意思是17:31:45删除了整个生成目录(以前的)
没有任何异常。
source build/envsetup.sh
没有任何异常
执行 lunch 命令后, 会输出一个列表让我们选择
lunch
这里来简单说一说,列表中各项是什么意思?
其实 lunch
命令的格式是 lunch BUILD-BUILDTYPE,
如果我们后面没有输入BUILD-BUILDTYPE,
则会弹出一个列表让我们选择,我们就以aosp_hammerhead_userdebug
来看BUILD-BUILDTYPE
aosp_hammerhead
是 BUILD
userdebug
是 BUILDTYPE
hammerhead
其实是 N5 手机的别名
BUILD指的是特定功能的组合的特定名称,即表示编译出的镜像可以运行在什么环境.其中,aosp(Android Open Source Project)代表Android开源项目;arm表示系统是运行在arm架构的处理器上,arm64则是指64位arm架构;处理器,x86则表示x86架构的处理器;此外,还有一些单词代表了特定的Nexus设备,下面是常用的设备代码和编译目标,更多参考官方文档
BUILD TYPE则指的是编译类型,通常有三种:
-user:代表这是编译出的系统镜像是可以用来正式发布到市场的版本,其权限是被限制的(如,没有root权限,不鞥年dedug等),适合生产环境
-userdebug:在user版本的基础上开放了root权限和debug权限,适合调试
-eng:代表engineer,也就是所谓的开发工程师的版本,拥有最大的权限(root等),此外还附带了许多debug工具
设备型号 | 设备代码 | 编译目标 |
---|---|---|
Nexus 6P | angler | aosp_angler-userdebug |
Nexus 5X | bullhead | aosp_bullhead-userdebug |
Nexus 6 | shamu | aosp_shamu-userdebug |
Nexus 5 | hammerhead | aosp_hammerhead-userdebug |
如果不需要刷入到手机上的话,选择 arm 或者 x86 的即可。
这里我选择直接输入: 2 或者 aosp_arm64-eng
可以得到该版本的基本信息列表,执行结果如下:
Android Q(按照字母表排序),版本号或将为Android 10.0
通过make指令进行代码编译,该指令通过-j参数来设置参与编译的线程数量,以提高编译速度。
比如这里我们设置8个线程同时编译:
make -j8
参与编译的线程并不是越多越好,通常是根据你机器cup的核心来确定:core*2,即当前cpu的核心的2倍.
比如:我的 mac 是4核心 4线程的,所有使用8个线程编译最好
可查看:关于本机-系统报告-核总数
编译二个小时左右,报错:
external/iptables/include/linux/netfilter_ipv4/ipt_ECN.h:13:10: fatal error: 'linux/netfilter/xt_DSCP.h' file not found
解决方式参考:external/iptables/include/linux/netfilter_ipv4/ipt_ECN.h:13:10: fatal error: 'linux/netfilter/xt_DSC_爱折腾的华哥的博客-CSDN博客
报错修改后,我再次执行命令:
make -j8
因为太费时间所以晚上睡觉的时候,让它自己运行,花了将近7个小时,编译完成、编译成功:
build completed successfully (04:13:31 (hh:mm:ss)) 表示你编译成功了。
在编译完成之后,就可以通过以下命令运行Android虚拟机了,命令如下:
source build/envsetup.sh
lunch(选择刚才你设置的目标版本,比如这里了我选择的是2)
emulator
如果你是在编译完后立刻运行虚拟机,由于我们之前已经执行过source及lunch命令了,因此现在你只需要执行命令就可以运行虚拟机:
emulator
emulator: WARNING: Couldn't find crash service executable /Volumes/untitled/WORKING_DIRECTORY/prebuilts/android-emulator/darwin-x86_64/emulator64-crash-service
这个警告一般没影响,是模拟器崩溃时进行处理的程序,对使用者意义不是很大。
emulator: WARNING: system partition size adjusted to match image file (813 MB > 800 MB)
调整系统分区大小以匹配图像文件,执行命令:emulator -partition-size 1024
WARNING: HAXM 6.0.5 is installed. Please install HAXM >= 6.2.1 to fix compatibility issues on Mac.
WARNING: HAXM 6.0.5 is installed. Please install HAXM >= 6.2.1 to fix compatibility issues on Mac._爱折腾的华哥的博客-CSDN博客
网上找了很多资料,还是一直卡在黑屏!
期间mac笔记本风扇呼呼响,摸了摸不是很烫,进行了几次尝试:
第一次(将近4个小时): 1
或者 aosp_arm-eng
第二次(将近7个小时): 2 或者 aosp_arm64-eng
第三次(将近10个小时):执行make clobber,再次尝试 2 或者 aosp_arm64-eng
下载源码花了2天多的时间、编译源码也花了2天多的时间,后面就没进行其他尝试了,大家也可以尝试其他版本。
编译还是成功了,只是模拟器运行出现黑屏,它应该不会影响后面看源码吧!
最后运行
cd /Volumes/untitled/WORKING_DIRECTORY
source build/envsetup.sh
lunch 2(选择刚才你设置的目标版本,比如这里了我选择的是2,输入命令:lunch 2)
emulator -partition-size 1280(内存不够,执行此命令:emulator -partition-size 1280)
Running an x86 based Android Virtual Device (AVD) is 10x faster.
We strongly recommend creating a new AVD.
运行基于x86的Android虚拟设备(AVD)的速度是10倍。
我们强烈建议创建一个新的AVD。
参考资料:
https://www.jianshu.com/p/1513fc9e1a74
https://www.jianshu.com/p/5cf755f05af4
Android各版本 发布时间 及对应API(2020.9.9截至Android最新版本 11)_Chin_style的博客-CSDN博客_android版本
Mac编译android源码中遇到的坑 - 掘金
https://www.jianshu.com/p/367f0886e62b
Mac 10.12 编译 Android 源码_crianzy的博客-CSDN博客