其实早在 2016 年的时候,我就使用 ubuntu 编译过 Android 的源码,可是那个时候并没有深耕,所以一直也没有再进行过相关文章的发布。
时隔至今,当我想再深入 framework 的时候,我已经没有设备来安装 Linux 系统了,因为现在一直都是用 Mac os 电脑来开发。
不过翻阅了 Android Developer 官网,发现现在 Mac os 也能够编译 Android 源码了,这是惊喜万分啊!
那么如果你也有学习 framework 的想法,或者想单纯的编译一下源码,那么就继续读下去吧~~~
其实按照官网给的流程走一遍就能够成功了,不过由于我在走流程的过程中不是那么顺利,所以写下这篇文章,算为各位读者老爷趟一下。
从准备工作到编译一共分为 9 步:
第一步、创建区分大小写的磁盘映像
上图是官网的提示操作,当然不建议自己去磁盘工具那去搞,只需要直接在 terminal 中用下方的命令创建即可
hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS ' -size 200g ~/android.dmg
这样,我们就创建了大小为 200 G 的磁盘映像文件。该文件在装载后可用作具有 Android 开发所需格式的存储卷。为什么这么大呢?因为后期的源码和编译需要用到这么大的空间,所以最好是准备这么大了。
如果你的电脑存储不够大,那么也可以使用下方的命令对大小进行调整。
hdiutil resize -size <new-size-you-want>g ~/android.dmg.sparseimage
比如
hdiutil resize -size 60g ~/android.dmg.sparseimage
这样就把刚才的映像文件调整为 60G 大小。
建立好之后,我们先不要急着挂载操作,我们先看后面的步骤。
第二步、安装 JDK
我们都安装过 JDK ,所以本步骤略。
第三步、安装 xcode
去官网安装对应的 xcode 版本即可,我电脑系统是 10.14
安装的 xcode 11.3.1
同时也安装了 11.3 版本的 xcode 命令行工具。
第四步、安装MacPorts
通过 macports.org 安装 MacPorts。
需要注意的是,我的电脑在进入安装过程的时候很慢,不知道是不是都这样,如果你的安装也很慢,那么就多等会儿吧,我大概等了5分钟
安装完后,修改 ~/.bash_profile 配置文件
将
export PATH=/opt/local/bin:$PATH
添加到配置文件 ~/.bash_profile中。
第五步、通过 MacPorts 获取 Make、git 和 GPG 程序包
使用下面命令即可
POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg
同样,安装过程依旧很慢,主要和获取程序包的速度有关系,这一步我等了几十分钟…
不过耐心点,最后都是能装好的。
第六步、设置文件描述符数量上限
在 Mac os 中,可同时打开的文件描述符的默认数量上限太低,在高度并行的编译流程中,可能会超出此上限。
要提高此上限,请将下列行添加到 ~/.bash_profile 中:
ulimit -S -n 1024
这样我们就把「可同时打开的文件描述符的默认数量上限」调整为了 1024 个。
第七步、准备源代码
① 安装 Repo
首先确保主目录下有一个 bin/ 目录,并且该目录包含在路径中
mkdir ~/binPATH=~/bin:$PATH
然后下载 Repo 工具,并确保它可执行:
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repochmod a x ~/bin/repo
② 初始化 Repo 客户端
创建一个空目录来存放工作文件。WORKING_DIRECTORY 名字自己定义
mkdir WORKING_DIRECTORYcd WORKING_DIRECTORY
然后,配置 git 信息
git config --global user.name "Your Name"git config --global user.email "you@example.com"
最后,初始化 Repo
repo init -u https://android.googlesource.com/platform/manifest
如果报 repo: command not found 的问题,那么只需执行下方命令即可
echo 'export PATH=$PATH:$HOME/bin' >> ~/.bashrc export PATH=$PATH:$HOME/bin
很可惜,这一步不能顺利进行下去了…
这个时候我们只能通过「镜像」来解决了,这里我们用「清华镜像」,整个镜像大小为 80 G 左右,所以一定要将电脑的剩余空间多腾一些… 或者是外接移动硬盘。
继续下载,于是开始了漫长的等待…
功夫不负有心人,终于下载完了。
不过下一步,该看下你的电脑硬盘的剩余空间了,因为这个压缩版就有80 G,那么解压之后就会超过100G,所以如果你的电脑剩余空间没有100 G 以上,那么建议把这个源码包放到移动硬盘里面,然后再从移动硬盘解压吧。
解压
解压完成后,我们会得到一个.repo 的文件夹
然后,我们将源码进行同步
repo sync
同步时间很长,我这个电脑同步了差不多25分钟,这样我们的Android 源码就准备好了,同步完成后的 aosp 结构如下
第八步、准备编译
① 下载预览二进制文件
下载下来后,解压得到
② 然后运行这个 sh 文件
sh 文件名.sh
需要看下协议
安装完成
③ 安装完成后,会在执行 su 命令的目录下创建一个 vendor 的文件夹
将此文件夹复制到源代码的根目录下,即 aosp 目录下。
④ 然后执行
make -f Makefile clobber
以避免之前进行的 build 干扰到接下来的 build。
第九步、开始编译
① 先初始化环境
source build/envsetup.sh
② 然后使用 lunch 展示要编译的目标
这里我选择了 24,所以后期可以直接执行 lunch 24 即可,注意这里的选择跟你手上有什么型号的设备有关系,由于我手头上没有 Google 亲儿子的机器,所以这里就随便编译一个了。
现在我们直接进入下一步:编译阶段
使用 make 编译代码,如果想增加编译速度,可以借助 -jN 参数处理并行任务,比如我的电脑是双核4线程的,最快编译速度可以达到 8个线程同时编译,所以可以使用
make -j8
进行编译。第一次编译的时间很长很长,建议早上把电脑打开,然后让他开始编译去吧,我是快要吃晚饭的时候发现编译好了…
看到绿色的字出现,我就松了一口气,这几天的折腾没有白费啊!
#### build completed successfully (01:04:37 (hh:mm:ss)) ####
这样我们的源码就算编译好了,在
aosp->out->target->product 下就有我们要用的源码了。
运行模拟器
如果在 Linux 系统下,直接运行 emulator 命令就能将我们编译好的 aosp 跑到虚拟机里面去。
而 Mac os 则比较费劲了,反正我尝试了各种办法,最终还是没有将编译好的代码跑到虚拟机上。
这两天考虑搞个 nexus 手机或者 pixel 手机,来刷下 aosp 源码。
现在先将输入的流程标记一下,等手机送到时再开搞,到时候说不定我会再发一个后续的文章。
将 “编译后的代码” 刷入到真机流程
① 插上真机
② 执行
sudo adb reboot bootloader
让手机重启成为 fastboot 模式
如果此时手机界面展示
DEVICE_STATE – locked
那么需要再执行
fastboot oem unlock
让手机解锁
③输入
fastboot flashall -w
刷入我们编译好的 “源码”,然后等待即可。
由于目前没有真实的测试刷入的流程是否会有异常,这里我就不多说了。
如果看了这篇文章的朋友,恰好手头上有 nexus 手机 或者 pixel 手机,一定要先搜索了解自己的手机可以恢复原系统的方法之后,再进行本文章的刷机操作;
并且在编译源码的时候,一定要先选择自己手机支持的源码,再进行后续操作。
否则手机刷成砖后就刷不回来,那就浪费了~~~
本篇文章就到这里,虽然历时将近一周,其实本身并不难,只要按照流程一步一步来就行,只不过由于下载源码、解压、同步、编译会耗费点时间,所以拖到了今天。
后续有关 framework 的文章也会持续输出,敬请期待!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。