最近终于将了解 AOSP 提到日程上。在折腾了两晚后总算给吃了很久灰的 Nexus 3 刷了自己编译出来的 4.3 系统,本文仅为记录这一过程。
设备
编译机: Ubuntu LTS 14.04
手机: Galaxy Nexus (maguro)
目标系统: Android 4.3 (Jelly Bean)
流程
按照官方流程,从开始到最终将系统运行于手机上,主要分四个流程:
- 配置编译环境
- 下载源码
- 编译源码
- 刷机并运行
下文亦依照该流程进行描述。
配置编译环境
选择分支
首先是选择我们的设备支持的最高版本,通过 Build Numbers 中可以查到官方对 Galaxy Nexus 的支持最高只到 4.3,对应的最新分支为 android-4.3_r1.1
。
安装 JDK
确定了 Android 版本为 4.3 后,在 JDK Requirements 中了解到编译 4.3 系统需要 JDK 6。
由于相关许可问题,Ubuntu 已经不能直接安装 Oracle JDK 6。然而 Webupd8 Team 为我们提供了相关的脚本下载 JDK。
|
|
如果需要自动配置 Java 环境变量,可以使用下列命令:
|
|
安装编译所需的包
由于使用的是 Ubuntu 14.04,根据官方文档,我们还需下载下列包:
|
|
然而只有这部分包编译 4.3 的时候会出现 Can't locate Switch.pm in @INC (you may need to install the Switch module)
错误,解决办法是安装 perl 的 switch 库(参照此文):
|
|
优化编译环境(可选)
使用 ccache 能够加快 C/C++ 的编译速度,可以在 .bashrc
中添加以下配置打开 ccache:
|
|
并在源码根目录中指定 ccache 的大小(建议 50-100G):
|
|
下载源码
安装 repo
由于某些因素,Google 已“不可以”访问,这里我们改用清华源的 repo:
|
|
并且,为了避免 repo 更新时访问 Google 官方的 git 源,将下列内容添加到 .bashrc
中:
|
|
配置 Git
在开始下载源码前,确保已经安装 git 并已经配置 user.name
及 user.email
:
|
|
下载源码
在真正下载代码前,我们还需要根据前面确定的分支初始化 repo。同样的,改为清华源:
|
|
初始化完毕后,使用下列代码下载代码:
|
|
接下来就是漫长的等待……
编译源码
初始化编译环境变量
在开始编译前,我们需要初始化编译的环境变量:
|
|
下载设备相关 so
由于设备的正确运行还需要相关硬件驱动支持,所以我们还需要下载手机各硬件的供应商提供的 so 库并添加到 AOSP 中。
下载完 Galaxy Nexus for Android 4.3 相关包后,解压并将所有脚本移至源码根目录下执行,并同意所有的条款。
当执行完所有的脚本后,相关的 so 会添加到 vendor/
目录下。
选择编译目标
|
|
或直接执行 lunch
后选择对应的设备
开始编译
|
|
其中 -j8
意思为指定使用 8 条线程同时编译,主要看 cpu 支持的并发数量。
接着又是漫长的等待~
刷机并运行
先将手机切换至 bootloader 模式并解锁:
|
|
接着在源码根目录中执行:
|
|
当命令执行完后,手机会自动重启,此时只需等待手机完成初始化,之后便可以看到编译的系统以及准确运行在设备上。
最后
至此,我们就已经完成了一次简单的 AOSP 编译及运行流程,顺着官方文档的说明做下来其实蛮简单的。