阅读 2150

启航!Android10源码编译之深入折腾Vmware虚拟机

前言

最近跟朋友组了个局,一起学习framework相关的源码。学习源码,首先就是要下载,编译源码啦。恰巧Android10的源码在本周刚刚发布,所以索性就拿它来进行framework的研究学习

因为我目前使用的是Mac的本子,但是在Mac上搭建环境进行源码下载和编译会出现各种问题,所以使用Wmware加载ubanbu系统的方式来进行下载和编译。虽然说解决了一部分问题,但是也产生了新的问题,也算是填了不少的坑

这篇文章主要是记录下遇到的坑以及填坑的过程,给其他也有着相同问题的小伙伴把路铺平,尽快下载并编译起源码,开始源码学习

正文

准备阶段

在源码下载和编译的过程中,真的是感觉各种劝退。我先说说我准备什么硬件和软件吧

准备清单

  • Mac电脑,16G内存
  • 固态硬盘,500G磁盘空间
  • Vmware Fussion Mac版
  • ubuntu 18.0.4 镜像
  • 梯子一个(你懂的),为了阅读相关文档

源码下载

一切准备就绪(默认认为你已经在虚拟机中跑起了ubantu系统),就可以搭建编译和下载的环境了,这个直接按章Google官方文档去配置相关环境就ok了

配置完环境,就可以准备下载源码了,这里我们需要下载的分支是android_10.0.0-r2,因为国内网络环境原因,这里使用清华源替换Google的下载源进行下载,具体看这篇文章,写的很详细了,不再重复赘述

还需要提醒的一点是,整个AOSP的源码大概需要100G左右的磁盘空间,如果加上编译,至少需要300G,所以在创建虚拟机的时候要提前分配好足够的磁盘空间,物理磁盘空间也必须保证足够,这就是准备清单里为什么有固态硬盘这一项。当然内存空间足够的可以忽略。

还有一点,源码下载和编译的环境是必须区分的内存分区格式,Mac上下载和编译出现各种问题也是跟这一点有很大关系

最重要的指令有两条

$ repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-10.0.0_r2

$ repo sync

复制代码

接下来就是等着下载完就OK了

源码编译

恭喜进行到第三步,你已经超越了90%的人--因为大多数卡在了第一步

编译教程直接参考Google的这篇,基本上问题不大,如果想再电脑模拟器上运行,最好执行lunch后选择x86的架构来编译

因为咱们是在虚拟机环境下运行的,所以我在这一步遇到的最大的问题只有一个,就是内存不足导致进程被kill,甚至有一次我编译了90%了,因为内存不足导致进程被kill了,真是欲哭无泪...

在不增加现有硬件的情况下,我采用了两个方法

方法一,给虚拟机分配更多的内存空间和CPU核心数(为了加快编译)

我Mac主机16G内存,给虚拟机分了12G,你们可以看着办,反正越多越好

方法二,增加SWAP空间大小

这个具体的原理还没有深入去研究,反正参考这篇文章解决了。需要注意的是,增大2048MB是远远不够的(多次编译失败的经验...),我唯一成功的一次,直接增大到了8192MB

编译过程中也可以另开一个terminal窗口,通过top指令查看实时的内存使用情况

接下来的编译时间大概需要3-8个小时,根据硬件的不同,可以去休息下了...

运行编译镜像

到了这一步基本上就算是完成了,那来运行下我们编译的镜像吧!按照官方教程咱们现在模拟器上跑跑,直接运行emulator! 然后过了好久...好久...好久...我发现就是运行不起来啊

既然直接使用指令运行不起来,那咱们换个思路,来个偷梁换柱!

打开咱们熟悉的工具AS,创建一个AVD虚拟机,使用官方提供的Android10的镜像。创建完毕后找到sdk所在的相关目录sdk/system-images/android-P/google_apis/x86,然后找到我们编译好的镜像的目录,大概在./out/target/product这个目录中,也是找到编译版本的目录,我参考了这篇文章,找到编译好的核心文件

  • Linux Kernel
  • system.img
  • userdata.img
  • ramdisk.img

把这四个文件替换创建AVD模拟器的相关目录去,然后通过AS运行模拟器,不出意外的话,你就可以看到编译好的Android10运行起来了。

恭喜你,完成所有下载和编译工作,但是framework的学习之路才刚刚开始

一起,继续加油吧!

后记

下载和编译的过程中确实遇到了许多问题,感谢路遥大哥的相关指导,和阿拉神农(邓老师)提供的学习社群神农班,以及一起学习的朋友提供的宝贵建议

最最重要的一点是,遇到困难不要放弃,攻克它,拿下下,然后收获属于自己的经验

最后的最后

觉得不错?不妨点个赞,然后关注一下?