android 模拟器 goldfish 环境搭建

环境准备

硬件及主机系统

  • 使用AVD时需要硬件支持 KVM 。因此先在主机 bios 中将虚拟化设置开启。
  • x86架构的主机,安装了 Ubuntu 22.04 操作系统。

检查系统是否支持虚拟化的两条命令:

1
2
3
4
5
6
$ kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used

$ egrep -c '(vmx|svm)' /proc/cpuinfo
8

安装 java jdk

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

参考: Linux之Ubuntu18.04安装Java JDK8的三种方式

配置交叉编译环境

首先,需要下载交叉编译器,有以下几种方式:

  • 使用谷歌提供的 android llvm 或者 android gcc

    官方提供的独立编译工具链 android gcc 已被删除,需通过追溯提交记录,找到老版本。(也就只有 gcc 4.8 和 gcc 4.9)

  • 使用 android NDK 中的交叉编译器

根据需要,在以上链接中选择不同的交叉编译器(32位或64位)

下载到本地后,配置环境变量

1
2
3
4
5
6
7
vim ~/.bashrc

export PATH=xxx/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin:$PATH
export PATH=xxx/platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin:$PATH
export CROSS_COMPILE=aarch64-linux-android-

source ~/.bashrc

安装 linux 版 android studio

有两种方式可以安装android studio

sdk和ndk等等配置完成后,再配置ubuntu环境变量,将以下几个目录添加到环境变量中:emulator/ platform-tools/ ndk/ avd/

1
2
3
4
5
6
7
8
vim ~/.bashrc

export PATH=/xxx/xxx/android-sdk-linux/emulator:$PATH
export PATH=/xxx/xxx/android-sdk-linux/platform-tools:$PATH
export PATH=/xxx/xxx/android-sdk-linux/ndk:$PATH
export PATH=~/.android/avd:$PATH

source ~/.bashrc

创建 AVD

使用AVD manager创建完虚拟设备后,在~/.android/avd目录下会有xxx.ini和一个xxx.avd。这个xxx是我们后面启动 android 模拟器需要用到的。

模拟器相关命令参考:https://developer.android.com/studio/run/emulator-commandline?hl=zh-cn

加载低版本kernel

最新版的android studio和sdk均不支持加载版本<3.10的内核,想加载低版本内核做实验的话,可使用 此链接 提供的sdk。

android - 命令,启动android sdk管理器

android avd - 命令,启动avd manager

emulator -avd xxx - 命令,跟最新版相同

编译goldfish内核

通过如下命令,下载goldfish内核源码,并完成编译

1
2
3
4
5
6
7
8
9
10
11
12
13
mkdir goldfish4.4 
cd goldfish4.4
## 创建一个out44目录,用来存放编译输出
mkdir out4.4
git clone https://android.googlesource.com/kernel/goldfish.git
cd goldfish
git branch -a
## 从goldfish中拉出kernel4.4分支
git checkout -b android-goldfish-4.4-dev remotes/origin/android-goldfish-4.4-dev
## arch/arm64/configs目录下有编译配置文件defconfig和ranchu64_defconfig,我们使用ranchu64_defconfig
make ARCH=arm64 O=../out44 ranchu64_defconfig
## 如果后面需要调试该内核,这里最好改一下.config,将CONFIG_DEBUG_RODATA和CONFIG_RANDOMIZE_BASE设置为不开启
make ARCH=arm64 O=../out44/ -j16

编译完成后,如果需要更改配置(如允许内核加载自定义ko模块),操作如下

1
2
3
4
5
6
## 图形化配置内核选项
make ARCH=arm64 O=../out44/ menuconfig
## 配置变化的时候执行清理一下
make mrproper
## 开始编译
make ARCH=arm64 O=../out44/ -j16

编译生成的内核文件在如下位置:out4.4/arch/arm64/boot/Image.gz

使用编译的内核启动avd虚拟设备

执行以下命令以自编译的内核启动虚拟机

1
emulator -avd KernelTest -no-window -no-audio -show-kernel -kernel /.../out4.4/arch/arm64/boot/Image.gz -no-snapstorage