0
点赞
收藏
分享

微信扫一扫

AOSP12源码编译及遇到的坑

互联网码农 2022-04-13 阅读 75
android

前言

想进一步学习android,就需要去看源码,很早之前就下了源码,编了几次一直有问题就搁置。前段时间开始写博客,看了不少资料,也买了刘望舒大佬的三部曲,《Android进阶指北》第一章就是编译,所以将搁置的计划拾起来了。由于android 12去年才出,其他的文章基本都是Q的甚至更早的版本,12上还是有一些变化,遇到一些坑,所以打算整理一下。

一、环境准备

系统环境

1、ubuntu系统最好18以上(虚拟机也可以,笔者是双系统,感觉如果学源码的话,还是可以搞双系统玩一下)
2、磁盘越大越好,最好空闲300G+吧(我现在是300多一点,但是有ccache,还有编译的文件镜像等等,不排除我代码下的有问题)
3、JAVA开发环境,repo等
具体配置可以根据各种教程去配,跟着流程就没问题,由于笔者的环境是很早之前搞得,所以最新的一次没有额外配置,所以就不详细说了。可以参考
刘望舒大佬的教程1
官网教程

下载源码

源码下载,没有科学上网的的话,推荐使用清华镜像,推荐指定版本因为毕竟是学习的过程,不需要一直保持代码有多新,我用的是android-12.0.0_r32,不想折腾其实可以下11的。

这块文档还是蛮多的,大差不差,可以直接看清华镜像中说明。

编译源码

刘望舒大佬的教程2
还是推荐看一下这个文档,并没有什么额外的东西。内容设计很多编译的相关知识,主要编译只需要执行

二、遇到的坑

2.1 ccache

看官方文档和比较旧的文档,会这么一条指令prebuilts/misc/darwin-x86/ccache/ccache -M 50G,执行以后找不到指令,文件下也不存在ccache文件夹。由于笔者电脑是陪我多年的笔记本,性能比较差,所以还是挺需要这个东西的,所以郁闷了很久。

问题原因

源代码

// build/make/core/ccache.mk
# We no longer provide a ccache prebuilt.
#
# Ours was old, and had a number of issues that triggered non-reproducible
# results and other failures. Newer ccache versions may fix some of those
# issues, but at the large scale of our build servers, we weren't seeing
# significant performance gains from using ccache -- you end up needing very
# good locality and/or very large caches if you're building many different
# configurations.
#
# Local no-change full rebuilds were showing better results, but why not just
# use incremental builds at that point?
#
# So if you still want to use ccache, continue setting USE_CCACHE, but also set
# the CCACHE_EXEC environment variable to the path to your ccache executable.

大意就是没看到显著的性能提升,之前提供的版本也比较旧,就不提供了。如果还需要使用ccache,就需要自己下在一个,并把CCACHE_EXEC设置为自己的ccache程序。如果需要使用的话,就需要自己安装一个了(教程很多),在环境变量中( bashrc)配置一下,编译的时候看一下ccache -s就可以知道是否成功了。

// 开启缓存
export USE_CCACHE=1
// 缓存位置
export CCACHE_DIR=/source/.ccache
// ccache程序位置
export CCACHE_EXEC=/usr/bin/ccache
// 缓存空间大小
${CCACHE_EXEC} -M 50G

2.2 虚拟机启动

12之前的版本,make结束之后可以直接执行 emulator就可以启动虚拟机了,但是12开始就不行了,默认的编译的是通用系统映像(GSI)版本,可以直接刷物理设备,但是启动虚拟机会提示Error: out/target/product/generic_arm64/userdata-qemu.img': No such file or directory

解决方案

stackoverflow问题 需要科学上网

解决问题的原文
1.Apply below change on platform/build/make.
diff --git a/target/product/AndroidProducts.mk b/target/product/AndroidProducts.mk
index 7d9d90e..419cccb 100644
--- a/target/product/AndroidProducts.mk
+++ b/target/product/AndroidProducts.mk
@@ -84,3 +84,4 @@ COMMON_LUNCH_CHOICES := \
     aosp_arm-eng \
     aosp_x86_64-eng \
     aosp_x86-eng \
+    sdk_phone_x86_64-eng \
2.lunch sdk_phone_x86_64-eng
  1. 在/target/product/AndroidProducts.mk中增加一个编译的版本, 在COMMON_LUNCH_CHOICES加一个sdk_phone_x86_64-eng。加的时候一定要注意后面有空行,不要删除,或者结尾不要加\
  2. lunch sdk_phone_x86_64-eng 加完之后,lunch menu就会有这个选项,可以直接跳过

原理

COMMON_LUNCH_CHOICES 配置的一堆产品,对应的配置文件是之前就存在的,但是没有加到lunch列表中,可以在下载的源码/target/product/AndroidProducts.mk 目录下查看,在线查看

// build/make/target/product/AndroidProducts.mk
PRODUCT_MAKEFILES := \
    $(LOCAL_DIR)/aosp_arm64.mk \
    	...
    $(LOCAL_DIR)/sdk_phone_x86_64.mk \
    $(LOCAL_DIR)/sdk_phone_x86.mk \
    $(LOCAL_DIR)/sdk_x86_64.mk \
    $(LOCAL_DIR)/sdk_x86.mk \

COMMON_LUNCH_CHOICES := \
    aosp_arm64-eng \
    aosp_arm-eng \
    aosp_x86_64-eng \
    aosp_x86-eng \
    sdk_phone_x86_64-eng \
    
 // 有空行,没有空行lunch menu出不来

前面有sdk都是支持虚拟机的版本,sdk_x86.mk , sdk_x86_64.mk只是别名,实际相同。
水平有限,下面这块是通过比较得出的结论
对比sdk_phone_x86_64.mk文件,和其他的比如aosp_arm64.mk,会发现sdk的使用的是emulator设备,而其他则使用的PRODUCT_DEVICE := generic_arm64。

关于这块的内容,可以参考Android编译系统分析四:实战-新增一个产品
唯一需要注意的是add_lunch_combo的方式已经废弃了,需要直接在COMMON_LUNCH_CHOICES加。


总结

  1. 没有精力不要尝试最新的版本,可以看比较新的教程,跟着流程走,不然会耗不少时间,笔者之前就是这么放弃的,这次运气好吧,心态也稳,所以找到还算顺利
  2. 源码文档是有注释的,找不到原因,可以试试去源码里面查关键字。在线的网站查的飞快
  3. 科学上网,stackoverflow的问题重复率比较低,因为提问题的时候不允许重复提,国内有时候一搜几十篇都是复制粘贴,还是比较旧的,就很头大
  4. 需要一个好电脑,不然编译的很慢

希望能帮助到和笔者一样,明明刚开始学,放着11的教程,却非要用编译12的朋友,有问题可以一起沟通。

须知少年凌云志,曾许人间第一流

举报

相关推荐

0 条评论