前言

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

一、环境准备

系统环境

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

下载源码

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

repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-12.0.0_r32

// 同步源码树
repo sync

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

编译源码

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

// 初始化环境,不执行之后的指令找不到,所以当指令找不到的话,先执行一下这个
source build/envsetup.sh
// 清除缓存
make clobber
// 选择编译版本
lunch aosp_x86-eng
// 编译,n代表线程数,一般是cpu核数的1-2倍之间,
// 我用一倍的几次成功了,用1.5倍编译到最后失败了 Q@Q,概率问题吧
make -jn
// 运行虚拟机
emulator

二、遇到的坑

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。

PRODUCT_BRAND := Android
PRODUCT_NAME := sdk_phone_x86_64
PRODUCT_DEVICE := emulator_x86_64

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


总结

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

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

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

AOSP12源码编译及遇到的坑相关推荐

  1. aosp12源码编译

    ##1.配置git # 安装git sudo apt-get install git # 配置账号信息 git config --global user.name "xxx" gi ...

  2. 从零开始搞起 Disney BRDF源码编译(含踩坑经历)

    前情背景资料: 项目在Github上的源码地址:BRDF 1. 读官网的readme介绍 readme 里介绍了编译方式: How to compile BRDF Explorer for Windo ...

  3. mac 源码编译yar遇见的坑

    先从下载:http://pecl.php.net/package/ tar zxvf yar-2.0.3.tgz cd yar-2.0.3 找到phpize 准备环境 编译 编译的时候遇见了这样的错误 ...

  4. java调用clang编译的so_写Java这么久,JDK源码编译过没?编译JDK源码踩坑纪实

    好奇害死羊 很多小伙伴们做Java开发,天天写Java代码,肯定离不开Java基础环境:JDK,毕竟我们写好的Java代码也是跑在JVM虚拟机上. 一般来说,我们学Java之前,第一步就是安装JDK环 ...

  5. Ubuntu18.04 编译Android 10源码 并烧录源码到pixel3的避坑指南

    Ubuntu18.04 编译Android 10源码 并烧录源码到pixel3的避坑指南 实验环境 下载Android源码树 在pixel3上安装手机驱动版本 编译Android源码 Android ...

  6. 写Java这么久,JDK源码编译过没?编译JDK源码踩坑纪实

    好奇害死羊 很多小伙伴们做Java开发,天天写Java代码,肯定离不开Java基础环境:JDK,毕竟我们写好的Java代码也是跑在JVM虚拟机上. 一般来说,我们学Java之前,第一步就是安装JDK环 ...

  7. 拒绝踩坑!源码编译 tensorflow 解决 cuda 不配套 万金油方法

    在使用tensorflow 的时候最头疼的问题就是跟cuda 之间的配套使用问题,加上Nvidia 新的 rtx 2080 ti 图灵架构目前官方声称只支持cuda-10, 以上版本,对于tensor ...

  8. 干货|TensorFlow开发环境搭建(Ubuntu16.04+GPU+TensorFlow源码编译)

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|机器学习算法工程师 安装平台 1 平台 目前Tensor ...

  9. 源码 linux下编译_Linux云服务器软硬链接及源码编译安装python3.8的一些备注

    推荐一个简书作者写的从零开始学习Linux,非常细,授人以鱼不如授人以渔. https://www.jianshu.com/p/54c0e6a1da99 正文:看一下服务器的版本 cat /proc/ ...

最新文章

  1. 使用python创建自己的第一个神经网络模型吧!
  2. Docker之几种storage-driver比较
  3. 轻松监听Azure service health 状态
  4. Storm概念学习系列之storm的特性
  5. 服务器能否只做c盘系统,我的云服务器只有一个c盘
  6. java中函数过载,Java继承中成员方法的overload(重载/过载)
  7. 计算机视觉识别简史:从 AlexNet、ResNet 到 Mask RCNN
  8. linux脚本 let,通过shell 脚本查看服务器的时时流量
  9. vs2017python配置opencv_关于VS2017配置OpenCV出现无法打开文件“opencv_ml249d.lib”的解决方案...
  10. android勾选控件_【Android 开发】:UI控件之复选框控件 CheckBox 的使用方法
  11. CTFshow——web入门——php特性(上篇)
  12. 看不见的竞争 文件和数据压缩
  13. IntelliJ IDEA 的 Code Coverage 测试
  14. 杂谈|程序员还是工程师
  15. 从我自己的角度总结一下移动互联网的技术
  16. htmlunit 使用代理IP
  17. 最小费用最大流之 zkw费用流与普通费用流
  18. 2-44 JQuery
  19. 魔方阵的实现(三种情况)
  20. MD5常用方法,不积硅步无以至千里

热门文章

  1. [译] 编程语言和平台:对一条推特思路的评论
  2. twisted网络框架
  3. 视频封面如何一键置入到视频第1帧的方法
  4. Java屏蔽输入法_输入框禁止输入法
  5. 金蝶专业版显示服务器异常,金蝶云专业版服务器连接异常
  6. 请教各位如何获取y轴的数值啊,需要把y轴的所有数据都输出
  7. hive 感染 蜂巢_『百科-角色』蜂巢(Hive),沃德就变成这个玩意了
  8. python饼图显示百分比_解决echarts饼图显示百分比,和显示内容字体及大小
  9. Java 基础语法 —— 厚积薄发
  10. python 3d绘图 拖动_在python中以交互方式旋转3D绘图 - matplotlib