零、安装Open-JDK 8

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

一、安装python2

  1. sudo apt update
  2. sudo apt install python2
  3. python2 --version
  4. # 设置 Python 2 为默认解释器
  5. sudo ln -sf /usr/bin/python2 /usr/bin/python
  6. #验证:
  7. python --version

二、安装依赖包

  1. sudo apt-get install git-core gnupg flex bison libncurses5 gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip libelf-dev libssl-dev

三、修改交换空间大小

1. 禁用并删除现有的 /swapfile

先禁用当前的交换文件:

  1. sudo swapoff /swapfile

然后删除现有的 /swapfile

  1. sudo rm /swapfile

2. 创建新的 50GB 交换文件

使用 dd 创建一个大小为 50GB 的新的交换文件:

  1. sudo dd if=/dev/zero of=/swapfile bs=1M count=51200 status=progress

3. 设置权限

确保新创建的交换文件权限正确:

  1. sudo chmod 600 /swapfile

4. 格式化并启用交换文件

将新文件格式化为交换空间:

  1. sudo mkswap /swapfile

启用新的交换文件:

  1. sudo swapon /swapfile

5. 验证新的交换文件

确认新的交换空间是否启用:

  1. swapon -s
  2. free -h

6. 配置开机自动启用

编辑 /etc/fstab,确保新的 /swapfile 在每次启动时自动挂载:

  1. sudo nano /etc/fstab

在文件末尾确保有以下行:

  1. /swapfile none swap sw 0 0

四、编译AOSP

  1. cd aosp
  2. #配置编译环境
  3. source build/envsetup.sh
  4. # 编译前彻底清理 AOSP 构建环境,完全重置构建状态
  5. make clobber
  6. # 选择编译目标
  7. lunch aosp_x86_64-eng
  8. # 使用 make 数值 的命令进行指定线程数编译,也可以使用 m 命令自动选择最大线程数
  9. make -j$(nproc)
  10. # 建议使用 make -j4,因为线程数多可能会出现内存不足编译失败的情况

五、启动模拟器

  1. #内存不足会导致黑屏,此处加上参数2048
  2. emulator -partition-size 2048
  3. #指定Linux内核版本(前提是要编译好goldfish内核)并启动
  4. emulator -kernel /home/kinbos/goldfish/arch/x86/boot/bzImage -partition-size 2048

配置AOSP编译环境 - 图1

六、编译SDK

  1. # 初始化环境
  2. source build/envsetup.sh
  3. # 选择编译目标
  4. lunch sdk-eng
  5. # 开始编译
  6. make sdk

七、ASFP的配置

ASFP,它是 Android Studio for Platform 的简称,谷歌官方提供了该工具,可以方便的进行基于 AOSP 的开发。下载链接:https://developer.android.google.cn/studio/platform?hl=en 配置AOSP编译环境 - 图2

八、adb工具

Android源代码目录中包含了adb工具,它位于~/Android/out/host/linux-x86/bin目录中。通过adb工具查看内核版本。

配置AOSP编译环境 - 图9

九、常见问题解决

  • 遇到emulator: ERROR: x86 emulation currently requires hardware acceleration! Please ensure KVM is properly installed and usable. CPU acceleration status: This user doesn’t have permissions to use KVM (/dev/kvm).
  • 或者emulator: ERROR: x86 emulation currently requires hardware acceleration! Please ensure KVM is properly installed and usable. CPU acceleration status: Could not open /dev/kvm :Permission denied *解决办法:
    1. su root
    2. groupadd kvm
    3. usermod -G kvm -a 你的用户名
    4. echo 'KERNEL=="kvm",GROUP="kvm",MODE="0660"' >> /etc/udev/rules.d/androidUseKVM.rules
  • 如果出现如下关于测试的错误:
  1. [ 33% 45/136] test github.com/google/blueprint/pathtools
  2. FAILED: out/soong/.bootstrap/blueprint-pathtools/test/test.passed
  3. out/soong/.bootstrap/bin/gotestrunner -p ./build/blueprint/pathtools -f out/soong/.bootstrap/blueprint-pathtools/test/test.passed -- out/soong/.bootstrap/blueprint-pathtools/test/test -test.short
  4. --- FAIL: TestGlobEscapes (0.00s)
  5. --- FAIL: TestGlobEscapes/**/* (0.00s)
  6. glob_test.go:562: incorrect matches list:
  7. glob_test.go:562: pattern: "**/*"
  8. glob_test.go:562: got: []string{"**/", "a/", "b", "**/a", "**/b/", "**/b/b", "a/a"}
  9. glob_test.go:562: expected: []string{"*", "**/", "?", "a/", "b", "**/*", "**/a", "**/b/", "**/b/b", "a/a"}
  10. --- FAIL: TestGlobEscapes/**/\* (0.00s)
  11. glob_test.go:562: incorrect matches list:
  12. glob_test.go:562: pattern: "**/\\*"
  13. glob_test.go:562: got: []string(nil)
  14. glob_test.go:562: expected: []string{"*", "**/*"}
  15. --- FAIL: TestGlobEscapes/\*\*/* (0.00s)
  16. glob_test.go:562: incorrect matches list:
  17. glob_test.go:562: pattern: "\\*\\*/*"
  18. glob_test.go:562: got: []string{"**/a", "**/b/"}
  19. glob_test.go:562: expected: []string{"**/*", "**/a", "**/b/"}
  20. --- FAIL: TestGlobEscapes/\*\*/**/* (0.00s)
  21. glob_test.go:562: incorrect matches list:
  22. glob_test.go:562: pattern: "\\*\\*/**/*"
  23. glob_test.go:562: got: []string{"**/a", "**/b/", "**/b/b"}
  24. glob_test.go:562: expected: []string{"**/*", "**/a", "**/b/", "**/b/b"}
  25. FAIL
  26. 18:07:47 soong bootstrap failed with: exit status 1
  27. #### failed to build some targets (3 seconds) ####

解决办法: 把build/blueprint/Blueprints中第71行的两选项删除了,如下图:

配置AOSP编译环境 - 图10

  • 如果出现如下编译器崩溃的情况:
  1. clang++: error: unable to execute command: Segmentation fault (core dumped)
  2. clang++: error: clang frontend command failed due to signal (use -v to see invocation)
  3. Android (6052599 based on r353983c1) clang version 9.0.3 (https://android.googlesource.com/toolchain/clang 745b335211bb9eadfa6aa6301f84715cee4b37c5) (https://android.googlesource.com/toolchain/llvm 31c3f8c4ae6cc980405a3b90e7e88db00249eba5) (based on LLVM 9.0.3svn)
  4. Target: i686-unknown-linux-android

解决办法:这种情况通常是内存不足的原因,建议用make -j4 代替 make -j$(nproc)。并在 ulimit 中增加可用的虚拟内存,执行命令ulimit -s unlimited

当编译出错被中断时,并不需要清除前面编译的中间代码,也就是可以续编,这样更节省时间。