零、安装Open-JDK 8
sudo apt-get update
sudo apt-get install openjdk-8-jdk
一、安装python2
sudo apt update
sudo apt install python2
python2 --version
# 设置 Python 2 为默认解释器
sudo ln -sf /usr/bin/python2 /usr/bin/python
#验证:
python --version
二、安装依赖包
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
先禁用当前的交换文件:
sudo swapoff /swapfile
然后删除现有的 /swapfile
:
sudo rm /swapfile
2. 创建新的 50GB 交换文件
使用 dd
创建一个大小为 50GB 的新的交换文件:
sudo dd if=/dev/zero of=/swapfile bs=1M count=51200 status=progress
3. 设置权限
确保新创建的交换文件权限正确:
sudo chmod 600 /swapfile
4. 格式化并启用交换文件
将新文件格式化为交换空间:
sudo mkswap /swapfile
启用新的交换文件:
sudo swapon /swapfile
5. 验证新的交换文件
确认新的交换空间是否启用:
swapon -s
free -h
6. 配置开机自动启用
编辑 /etc/fstab
,确保新的 /swapfile
在每次启动时自动挂载:
sudo nano /etc/fstab
在文件末尾确保有以下行:
/swapfile none swap sw 0 0
四、编译AOSP
cd aosp
#配置编译环境
source build/envsetup.sh
# 编译前彻底清理 AOSP 构建环境,完全重置构建状态
make clobber
# 选择编译目标
lunch aosp_x86_64-eng
# 使用 make 数值 的命令进行指定线程数编译,也可以使用 m 命令自动选择最大线程数
make -j$(nproc)
# 建议使用 make -j4,因为线程数多可能会出现内存不足编译失败的情况
五、启动模拟器
#内存不足会导致黑屏,此处加上参数2048
emulator -partition-size 2048
#指定Linux内核版本(前提是要编译好goldfish内核)并启动
emulator -kernel /home/kinbos/goldfish/arch/x86/boot/bzImage -partition-size 2048
六、编译SDK
# 初始化环境
source build/envsetup.sh
# 选择编译目标
lunch sdk-eng
# 开始编译
make sdk
七、ASFP的配置
ASFP,它是 Android Studio for Platform 的简称,谷歌官方提供了该工具,可以方便的进行基于 AOSP 的开发。下载链接:https://developer.android.google.cn/studio/platform?hl=en
点击Import Asfp Project
配置编译好的SDK
调试代码
注意:如果报如下错误的解决方法
按照如下操作步骤把导入的子模块添加进去即可。参考链接:https://blog.csdn.net/LucasXu01/article/details/50097491
成功进入断点!
八、adb工具
Android源代码目录中包含了adb工具,它位于~/Android/out/host/linux-x86/bin目录中。通过adb工具查看内核版本。
九、常见问题解决
- 遇到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
*解决办法:
su root
groupadd kvm
usermod -G kvm -a 你的用户名
echo 'KERNEL=="kvm",GROUP="kvm",MODE="0660"' >> /etc/udev/rules.d/androidUseKVM.rules
- 如果出现如下关于测试的错误:
[ 33% 45/136] test github.com/google/blueprint/pathtools
FAILED: out/soong/.bootstrap/blueprint-pathtools/test/test.passed
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
--- FAIL: TestGlobEscapes (0.00s)
--- FAIL: TestGlobEscapes/**/* (0.00s)
glob_test.go:562: incorrect matches list:
glob_test.go:562: pattern: "**/*"
glob_test.go:562: got: []string{"**/", "a/", "b", "**/a", "**/b/", "**/b/b", "a/a"}
glob_test.go:562: expected: []string{"*", "**/", "?", "a/", "b", "**/*", "**/a", "**/b/", "**/b/b", "a/a"}
--- FAIL: TestGlobEscapes/**/\* (0.00s)
glob_test.go:562: incorrect matches list:
glob_test.go:562: pattern: "**/\\*"
glob_test.go:562: got: []string(nil)
glob_test.go:562: expected: []string{"*", "**/*"}
--- FAIL: TestGlobEscapes/\*\*/* (0.00s)
glob_test.go:562: incorrect matches list:
glob_test.go:562: pattern: "\\*\\*/*"
glob_test.go:562: got: []string{"**/a", "**/b/"}
glob_test.go:562: expected: []string{"**/*", "**/a", "**/b/"}
--- FAIL: TestGlobEscapes/\*\*/**/* (0.00s)
glob_test.go:562: incorrect matches list:
glob_test.go:562: pattern: "\\*\\*/**/*"
glob_test.go:562: got: []string{"**/a", "**/b/", "**/b/b"}
glob_test.go:562: expected: []string{"**/*", "**/a", "**/b/", "**/b/b"}
FAIL
18:07:47 soong bootstrap failed with: exit status 1
#### failed to build some targets (3 seconds) ####
解决办法: 把build/blueprint/Blueprints中第71行的两选项删除了,如下图:
- 如果出现如下编译器崩溃的情况:
clang++: error: unable to execute command: Segmentation fault (core dumped)
clang++: error: clang frontend command failed due to signal (use -v to see invocation)
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)
Target: i686-unknown-linux-android
解决办法:这种情况通常是内存不足的原因,建议用make -j4 代替 make -j$(nproc)。并在 ulimit 中增加可用的虚拟内存,执行命令ulimit -s unlimited
。
当编译出错被中断时,并不需要清除前面编译的中间代码,也就是可以续编,这样更节省时间。