作为一名Android开发者,你可能对Android源码充满了好奇,或者想尝试自己动手编译ROM。受限于网络环境及硬件配置,只能望而兴叹。本文将介绍一种以极低的成本实现这一目标的方法(共计花费半天时间和1美刀)。出发吧少年!

准备

Vultr注册帐号(Vultr相关优惠码请自行Google),充值并购买VPS主机,尽量选择高配置机器,不要被月付的费用吓倒,实际使用中是按小时计费。

编译环境

  • Ubuntu 16.04 64-bit
  • CPU:6 vCore RAM:16384 MB
  • 200 GB SSD

环境配置

安装依赖

1
$ sudo apt-get update && sudo apt-get install git ccache automake lzop bison gperf build-essential zip unzip curl zlib1g-dev zlib1g-dev:i386 g++-multilib python-networkx libxml2-utils bzip2 libbz2-dev libbz2-1.0 libghc-bzlib-dev squashfs-tools pngcrush schedtool dpkg-dev liblz4-tool make optipng maven bc pngquant imagemagick yasm

安装JDK
Android Open Source Project(AOSP)的master分支需要Java 8。在Ubuntu下可以使用OpenJDK。

1
2
$ sudo apt-get update
$ sudo apt-get install openjdk-8-jdk

下载源码

本文以MoKee源码为例(MoKee Open Source是基于Google AOSP开发的一个Android分支,并适配了多个机型)。

配置Git

1
2
$ git config --global user.name "Your Name"
$ git config --global user.email "you@example.com"

安装Repo
Repo是一个方便在Android中使用Git的工具

1
$ mkdir -p ~/bin

1
2
$ curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
1
$ echo "export PATH=~/bin:$PATH" >> ~/.bashrc

初始化Repo客户端
新建一个目录用来存放源码文件

1
$ mkdir -p ~/mokee

同步源码

1
2
3
$ cd ~/mokee
$ repo init -u https://github.com/MoKee/android -b mkn-mr1
$ repo sync -j4 -f --no-clone-bundle

同步结束,查看源码目录

1
2
3
4
5
6
7
8
9
root@AndroidDev:~/mokee# ls
Android.bp bootstrap.bash doc out system
Makefile build external packages toolchain
abi colors frameworks pdk tools
android cts hardware platform_testing vendor
art dalvik kernel plugin
autoload developers libcore prebuilts
bionic development libnativehelper sdk
bootable device ndk syntax

使用ccache编译缓存,让 C 和 C++ 更快的构建

1
2
$ echo "export USE_CCACHE=1" >> ~/.bashrc
$ ~/mokee/prebuilts/misc/linux-x86/ccache/ccache -M 25G

编译源码

1
$ cd ~/mokee

初始化环境

1
$ source ./build/envsetup.sh

选择编译目标(这里作了省略未列出全部编译目标)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ lunch
You're building on Linux

Lunch menu... pick a combo:
1. m_e_arm-userdebug 72. mk_kltechn-userdebug
2. mini_emulator_arm64-userdebug 73. mk_kltechnduo-userdebug
3. mini_emulator_x86-userdebug 74. mk_klteduos-userdebug
4. mini_emulator_x86_64-userdebug 75. mk_kltedv-userdebug
5. mk_a6000-userdebug 76. mk_kltekdi-userdebug
6. mk_a6020-userdebug 77. mk_kltekor-userdebug
7. mk_angler-userdebug 78. mk_kltespr-userdebug
8. mk_armani-userdebug 79. mk_klteusc-userdebug
9. mk_athene-userdebug 80. mk_lentislte-userdebug
10. mk_axon7-userdebug 81. mk_leo-userdebug
11. mk_bacon-userdebug 82. mk_lettuce-userdebug
12. mk_bullhead-userdebug 83. mk_libra-userdebug
13. mk_cancro-userdebug 84. mk_ls990-userdebug
14. mk_capricorn-userdebug 85. mk_lux-userdebug
15. mk_che10-userdebug 86. mk_m7-userdebug
16. mk_cherry-userdebug 87. mk_m7vzw-userdebug
17. mk_clark-userdebug 88. mk_m8-userdebug
18. mk_condor-userdebug 89. mk_m8d-userdebug
19. mk_d2att-userdebug 90. mk_mako-userdebug


Which would you like? [aosp_arm-eng]

选择Nexus4
可在mokee查找自己所需的设备代码,如Nexus4对应设备代码为mako

1
2
$ lunch mk_mako-userdebug
$ mka bacon

编译成功

1
#### make completed successfully (38:05 (mm:ss)) ####

编译结果
MK71.1-mako-201704110629-UNOFFICIAL.zip为刷机包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
root@AndroidDev:~/mokee/out/target/product/mako# ls
MK71.1-mako-201704110629-UNOFFICIAL.zip obj
MK71.1-mako-201704110629-UNOFFICIAL.zip.md5sum ota_script_path
android-info.txt previous_build_config.mk
boot.img ramdisk-recovery.cpio
build_fingerprint.txt ramdisk-recovery.img
cache ramdisk.img
cache.img recovery
clean_steps.mk recovery.id
data recovery.img
fake_packages root
gen symbols
install system
installed-files.txt system.img
kernel userdata.img
mk_mako-ota-cfcce54acd.zip

下载ROM

1
$ scp root@your server ip:/root/mokee/out/target/product/mako/MK71.1-mako-201704110629-UNOFFICIAL.zip /Users/Downloads/rom

1
MK71.1-mako-201704110629-UNOFFICIAL.zip       100%  335MB  79.7KB/s 1:11:39

The End

Tips:在Vultr中给当前机器添加一个Snapshots(快照),Vultr提供了免费保存Snapshots的服务,至此VPS可以暂且Destroy了,下次需要时直接使用Snapshots布署。

参考资料

Mokee wiki
Source Android