想进一步学习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
还是推荐看一下这个文档,并没有什么额外的东西。内容设计很多编译的相关知识,主要编译只需要执行
二、遇到的坑 2.1 ccache// 初始化环境,不执行之后的指令找不到,所以当指令找不到的话,先执行一下这个
source build/envsetup.sh
// 清除缓存
make clobber
// 选择编译版本
lunch aosp_x86-eng
// 编译,n代表线程数,一般是cpu核数的1-2倍之间,
// 我用一倍的几次成功了,用1.5倍编译到最后失败了 Q@Q,概率问题吧
make -jn
// 运行虚拟机
emulator
看官方文档和比较旧的文档,会这么一条指令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
在/target/product/AndroidProducts.mk中增加一个编译的版本, 在COMMON_LUNCH_CHOICES加一个sdk_phone_x86_64-eng。加的时候一定要注意后面有空行,不要删除,或者结尾不要加\
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加。
总结 没有精力不要尝试最新的版本,可以看比较新的教程,跟着流程走,不然会耗不少时间,笔者之前就是这么放弃的,这次运气好吧,心态也稳,所以找到还算顺利源码文档是有注释的,找不到原因,可以试试去源码里面查关键字。在线的网站查的飞快科学上网,stackoverflow的问题重复率比较低,因为提问题的时候不允许重复提,国内有时候一搜几十篇都是复制粘贴,还是比较旧的,就很头大需要一个好电脑,不然编译的很慢
希望能帮助到和笔者一样,明明刚开始学,放着11的教程,却非要用编译12的朋友,有问题可以一起沟通。
须知少年凌云志,曾许人间第一流
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)