编译环境:Ubuntu 16.04
镜像文件:清华大学AOSP镜像 Android7.0
一、源码下载
1 镜像地址
清华大学AOSP(Android Open Source Project)
https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/
2 过程摘录
下载Repo 工具
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
使用每月更新的初始化包
由于首次同步需要下载 24GB 数据,过程中任何网络故障都可能造成同步失败,我们强烈建议您使用初始化包进行初始化。下载 https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar,下载完成后记得根据 checksum.txt 的内容校验一下。由于所有代码都是从隐藏的 .repo
目录中 checkout 出来的,所以我们只保留了 .repo
目录,下载后解压 再 repo sync
一遍即可得到完整的目录。
使用方法如下:
wget https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar # 下载初始化包
tar xf aosp-latest.tar
cd AOSP # 解压得到的 AOSP 工程目录
# 这时 ls 的话什么也看不到,因为只有一个隐藏的 .repo 目录
repo sync # 正常同步一遍即可得到完整目录
# 或 repo sync -l 仅checkout代码
此后,每次只需运行 repo sync
即可保持同步。 我们强烈建议您保持每天同步,并尽量选择凌晨等低峰时间
3 解决repo sync下载代码时Failed connect错误的办法:
下载android代码时错误提示:error: Failed connect to android.googlesource.com:443
解决方法:编辑/etc/hosts文件
vim /etc/hosts
增加下面内容,保存
173.194.72.82 http://www.googlesource.com
173.194.72.82 android.googlesource.com
37.61.54.158 cache.pack.google.com
173.194.74.82 gerrit.googlesource.com
4 其他
- 初始化包大小21.4G,我的网速5-6M/s,下载时间基本一个小时左右。
- Android7.0,aosp目录编译完之后的大小是54.6G,安装Ubuntu时要注意留够足够的空间,推荐100G+以上。
二、源码编译
1 搭建编译环境
- openJdk is needed !我自己平时开发用的是JDK1.8,这里就要安装一下openjdk,并且更改环境变量。
sudo apt-get update
sudo apt-get install openjdk-7-jdk
但是如果你是刚安装完Ubuntu,那么就可以跳过此步骤,Ubuntu自带openjdk
sudo apt-get install bison g++-multilib git gperf libxml2-utils make python-networkx zlib1g-dev:i386 zip
sudo apt-get install gcc
- Setting up ccache , 使用ccache
ccache是一个编译器ccache用于C和C++。可以让构建更加快速。在源代码的根目录处,做如下操作:
$export USE_CCACHE=1
$export CCACHE_DIR=/<path_of_your_choice>/.ccache
$prebuilts/misc/linux-x86/ccache/ccache -M 50G</path_of_your_choice>
建议的cache大小为50-100G
可以使用如下操作来查看使用的ccache大小
$watch -n1 -d prebuilts/misc/linux-x86/ccache/ccache -s
若使用Ice Cream Sandwich(4.0.x)或更老的版本,需要用prebuilts来代替prebuilts/misc
2 开始编译 Building the System
$ source build/envsetup.sh
or
$ . build/envsetup.sh
$ lunch YouLunch menu... pick a combo:1. aosp_arm-eng2. aosp_arm64-eng3. aosp_mips-eng4. aosp_mips64-eng5. aosp_x86-eng6. aosp_x86_64-eng7. aosp_manta-userdebug8. aosp_flo-userdebug9. aosp_deb-userdebug10. full_fugu-userdebug11. aosp_fugu-userdebug12. aosp_tilapia-userdebug13. aosp_grouper-userdebug14. aosp_mako-userdebug15. aosp_hammerhead-userdebug16. aosp_flounder-userdebug17. aosp_shamu-userdebug18. mini_emulator_x86-userdebug19. mini_emulator_arm64-userdebug20. mini_emulator_x86_64-userdebug21. mini_emulator_mips-userdebug22. m_e_arm-userdebugWhich would you like? [aosp_arm-eng]
- 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
- 27
- 28
- 29
使用make构建,GNU make可以通过使用-jN参数来处理并行任务。此处的N,根据所用的计算机的硬件的核数来指定,一般N指定为CPU核心的1到2倍。例如我的CPU是i5-6500(CPU4个核,每个核2个线程),那么最优的构建是使用make -j8。
make -j8
3 build successfully
#### make completed successfully (01:04:27 (hh:mm:ss)) ####
7 9月 24 00:36 android-info.txt62 9月 24 00:22 build_fingerprint.txt4.0K 9月 24 10:34 cache66M 9月 24 12:26 cache.img70K 9月 23 23:51 clean_steps.mk38 9月 24 00:22 current_build_config.mk4.0K 9月 24 10:41 data4.0K 9月 24 09:51 dex_bootjars4.0K 9月 24 01:33 gen1.4K 9月 24 12:25 hardware-qemu.ini70K 9月 24 11:00 installed-files.txt1.1M 9月 24 00:30 module-info.json4.0K 9月 24 11:00 obj38 9月 23 23:51 previous_build_config.mk1.5M 9月 24 10:40 ramdisk.img4.0K 9月 24 10:39 recovery4.0K 9月 24 10:39 root4.0K 9月 24 10:39 symbols4.0K 9月 24 10:50 system1.8G 9月 24 11:01 system.img550M 9月 24 10:58 userdata.img550M 9月 24 12:41 userdata-qemu.img~/aosp/out/target/product/generic$
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
4 编译中的问题解决
- 第一次编译,在编译到82%的时候失败,报错 : Increase Java heap size
including ./tools/external/fat32lib/Android.mk ...
Starting build with ninja
ninja: Entering directory `.'
[ 0% 1/21542] Ensure Jack server is installed and started
Jack server already installed in "/home/smile/.jack-server"
Server is already running
[ 0% 2/21542] Building with Jack: out/target/common/obj/JAVA_LIBRARIES/core-all_intermediates/with-local/classes.dex
FAILED: /bin/bash out/target/common/obj/JAVA_LIBRARIES/core-all_intermediates/with-local/classes.dex.rsp
Java heap space
Try increasing heap size with java option '-Xmx<size>'
Warning: This may have produced partial or corrupted output.
ninja: build stopped: subcommand failed.
build/core/ninja.mk:146: recipe for target 'ninja_wrapper' failed
make: *** [ninja_wrapper] Error 1 \#### make failed to build some targets (08:25 (mm:ss)) ####
stackoverflow上关于此问题的解决方法([详见这里](http://stackoverflow.com/questions/34940793/increasing-heap-size-while-building-the-android-source-code-on-ubuntu-15-10)),在make之前进行heap size配置:
1. export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096m"
2. out/host/linux-x86/bin/jack-admin kill-server
3. out/host/linux-x86/bin/jack-admin start-server
三、运行
1 推送设备(真机运行)Flash device
- To flash a device, you will need to use fastboot, which should be included in your path after a successful build. Place the device in fastboot mode either manually by holding the appropriate key combination at boot, or from the shell with
$ adb reboot bootloader
- Once the device is in fastboot mode, run
$ fastboot flashall -w
- The -w option wipes the /data partition on the device; this is useful for your first time flashing a particular device but is otherwise unnecessary.
2 模拟器运行 Flash emulator
lunch 1即可
~/aosp$ emulator emulator: WARNING: system partition size adjusted to match image file (1536 MB > 200 MB)emulator: WARNING: data partition size adjusted to match image file (550 MB > 200 MB)emulator: WARNING: Increasing RAM size to 1GB
Creating filesystem with parameters:
Size: 576716800
Block size: 4096
Blocks per group: 32768
Inodes per group: 7040
Inode size: 256
Journal blocks: 2200
Label:
Blocks: 140800
Block groups: 5
Reserved block group size: 39
Created filesystem with 11/35200 inodes and 4536/140800 blocks
resize2fs 1.42.13 (17-May-2015)
The filesystem is already 140800 (4k) blocks long. Nothing to do!Creating filesystem with parameters:
Size: 69206016
Block size: 4096
Blocks per group: 32768
Inodes per group: 4224
Inode size: 256
Journal blocks: 1024
Label:
Blocks: 16896
Block groups: 1
Reserved block group size: 7
Created filesystem with 11/4224 inodes and 1302/16896 blocks
emulator: UpdateChecker: skipped version check
- 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
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
3 注意事项
-
1 因为上面的环境变量配置的是临时的,所以终端关闭后,直接运行emulator是不行的,需要重新运行下/build/envsetup.sh 和lunch 选择之前编译的版本
-
2 安装kvm,开启硬件加速
无论是在Windows平台还是Linux平台,或者还是Mac OSX平台,虚拟机的硬件加速全靠这个。
$ sudo apt-get install qemu-kvm
直接执行,完成安装即可。
开启之后我们可以使用下面的指令来验证
$ egrep -c '(vmx|svm)' /proc/cpuinfo
执行的结果不为0
表示开启成功(我的是4
)。
更好的阅读体验,请访问http://timeriver.com.cn/