Android源码:3、编译详解(最后卡在黑屏)
发布日期:2021-06-29 01:43:26 浏览次数:2 分类:技术文章

本文共 3241 字,大约阅读时间需要 10 分钟。

文章目录


一、前言

上篇文章已下载全部的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

更新源码完毕,如下图:

 

二、Android源码编译

切换到源码目录:cd /Volumes/untitled/WORKING_DIRECTORY

1、清理

为了确保新安装的二进制文件在解压后会被适当考虑在内,请使用以下命令删除所有以前编译操作的已有输出

我们在 Android 源码目录下执行如下清理命令:

make clobber

17:31:45 Entire build directory removed     意思是17:31:45删除了整个生成目录(以前的)

没有任何异常。

2、设置环境

source build/envsetup.sh

没有任何异常

3、选择编译目标

执行 lunch 命令后, 会输出一个列表让我们选择

lunch

这里来简单说一说,列表中各项是什么意思?

其实 lunch命令的格式是 lunch BUILD-BUILDTYPE,如果我们后面没有输入BUILD-BUILDTYPE,则会弹出一个列表让我们选择,我们就以aosp_hammerhead_userdebug来看BUILD-BUILDTYPE

aosp_hammerhead是 BUILD

userdebug是 BUILDTYPE

hammerhead其实是 N5 手机的别名

什么是BUILD?

BUILD指的是特定功能的组合的特定名称,即表示编译出的镜像可以运行在什么环境.其中,aosp(Android Open Source Project)代表Android开源项目;arm表示系统是运行在arm架构的处理器上,arm64则是指64位arm架构;处理器,x86则表示x86架构的处理器;此外,还有一些单词代表了特定的Nexus设备,下面是常用的设备代码和编译目标,更多参考

 

什么是BUILDTYPE?

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的版本

Android Q(按照字母表排序),版本号或将为Android 10.0

4、开始编译

通过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

解决方式参考:

 

5、再次编译

报错修改后,我再次执行命令:

make -j8

因为太费时间所以晚上睡觉的时候,让它自己运行,花了将近7个小时,编译完成、编译成功:

 build completed successfully (04:13:31 (hh:mm:ss))  表示你编译成功了。

 

6、运行模拟器

在编译完成之后,就可以通过以下命令运行Android虚拟机了,命令如下:

source build/envsetup.shlunch(选择刚才你设置的目标版本,比如这里了我选择的是2)emulator

如果你是在编译完后立刻运行虚拟机,由于我们之前已经执行过source及lunch命令了,因此现在你只需要执行命令就可以运行虚拟机:

emulator

 

警告1:

emulator: WARNING: Couldn't find crash service executable /Volumes/untitled/WORKING_DIRECTORY/prebuilts/android-emulator/darwin-x86_64/emulator64-crash-service

这个警告一般没影响,是模拟器崩溃时进行处理的程序,对使用者意义不是很大。

警告2:

emulator: WARNING: system partition size adjusted to match image file (813 MB > 800 MB)

调整系统分区大小以匹配图像文件,执行命令:emulator -partition-size 1024

警告3:

WARNING: HAXM 6.0.5 is installed. Please install HAXM >= 6.2.1 to fix compatibility issues on Mac.

最后:

网上找了很多资料,还是一直卡在黑屏!

期间mac笔记本风扇呼呼响,摸了摸不是很烫,进行了几次尝试:

第一次(将近4个小时): 或者 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://blog.csdn.net/YuDBL/article/details/86496890 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:WARNING: HAXM 6.0.5 is installed. Please install HAXM >= 6.2.1 to fix compatibility issues on Mac.
下一篇:Android源码:5、阅读详解(二)

发表评论

最新留言

很好
[***.229.124.182]2024年04月28日 00时23分59秒