Physical Address:
ChongQing,China.
WebSite:
最近出于工作需要,开始接触Android模拟器Cuttlefish。其实在接触Cuttlefish之前,我曾在AndroidStuido内使用过其内置集成的模拟器。而在AndroidStudio内集成的模拟器实际上是由Goldfish进行实现的,其可以用于Application的模拟运行,但是无法模拟整个系统的运行。而Cuttlefish能够在最大程度上地还原系统在真实硬件上的运行,非常适合用来测试编译出来的系统镜像。
今天这篇教程就来教大家如何在虚拟机内使用Cuttlefish模拟器来模拟运行Android系统。在写这篇教程之前,我曾Google与百度了很多资料,几乎没有太多有用的信息,希望这篇教程能够帮助到大家,欢迎各位转载~
在本教程中,所需环境为VMware® Workstation 16 Pro,安装的虚拟机为Ubuntu20,最终运行的Android为Android12。
由于Cuttlefish模拟器的运行需要系统支持KVM,所以 我们在使用VMware创建Ubuntu时,需要使能虚拟化Intel VT-x/EPT或AMD-V/RVI(V)选项,如图所示:
当我们的Ubantu系统启动后,使用如下命令检查是否支持KVM:
grep -c -w "vmx\|svm" /proc/cpuinfo
如果输出结果为非0,则表明支持KVM,否则代表不支持,无法运行Cuttlefish。
之后,我们需要安装一些必要的依赖,使用如下命令进行安装:
sudo apt install -y git devscripts config-package-dev debhelper-compat
事实上在编译运行Cuttlefish时是需要golang的,这里不推荐大家使用apt安装golang,因为apt中golang的版本还为1.13,版本比较老旧,这里推荐大家手动安装golang,手动安装golang的教程不在这里赘述,可以自行Google。在本教程中,使用的golang版本为:go version go1.18 linux/amd64。
安装好依赖之后,请在保证自己为root用户的情况下(这一点非常重要,可以避免后续一些问题)创建一个名为cuttlefish的文件夹,使用如下命令进行创建:
mkdir -p ~/cuttlefish
进入到cuttlefish目录,拉取cuttlefish相关代码:
git clone https://github.com/google/android-cuttlefish && cd android-cuttlefish
使用dpkg进行编译:
debuild -i -us -uc -b -d
进行安装:
dpkg -i ../cuttlefish-base_*_*64.deb
dpkg -i ../cuttlefish-user_*_*64.deb
dpkg -i ../cuttlefish-common_*_*64.deb
在这一步的过程中,有可能会提示缺少bridge-utils相关依赖,请使用如下命令进行安装相关依赖:
sduo apt-get install bridge-utils
在dpkg安装完成后,还需要针对模拟器的运行修改一些权限,使用如下命令:
sudo usermod -aG kvm,cvdnetwork,render $USER
权限更改完成后,使用sudo reboot命令重启系统,在重启的过程中将会安装一些关键的模块。
重启完成后,我们需要去Android官方的网站去下载我们需要模拟运行的版本镜像。进入http://ci.android.com/,这是Android持续集成编译的网站,我们需要关注的是下载镜像名中包含cf的镜像,如图所示:
如果你不太确定该选择哪一个,个人建议选择aosp_cf_x86_64_phone这个版本,点击下载按钮的地方,点击Artifacts
点击进入之后,我们下载名为aosp_cf_x86_64_phone-img-xxxxxx.zip与cvd-host_package.tar.gz的这两个文件(在Ubuntu内可以通过curl或者wget下载)。之后使用如下命令进行解压:
mkdir cf
cd cf
tar xvf /path/to/cvd-host_package.tar.gz
unzip /path/to/aosp_cf_x86_64_phone-img-xxxxxx.zip
注意事项:
1. /path/to/ 指存放以上两个文件的真实目录前缀,请勿照搬~
2. aosp_cf_x86_64_phone-img-xxxxxx.zip 与 cvd-host_package.tar.gz 必须是同一个Build下的文件
之后,我们启动Cuttlefish:
HOME=$PWD ./bin/launch_cvd
在实际运行过程中,我发现在某些CPU类型上是无法正常启动成功的,如果Intel的11代或者12代处理器上,往往无法正常启动。在咨询了Google官方开发者后,可以通过如下命令启动模拟器:
HOME=$PWD ./bin/launch_cvd --vm_manager=qemu_cli
原因大致是由于Cuttlefish的底层VM是crosVM,在平台兼容上存在问题,可以通过上述命令切换为QEMU,如果提示系统没有QEMU,通过如下命令进行安装:
sudo apt-get install qemu-kvm
在模拟器启动成功后,我们可以看到这样的输出:
这就代表我们的Cuttlefish已经成功开始运行Andoird系统。如在启动过程中提示权限相关问题,请使用如下命令之后再重启:
sudo usermod -aG kvm,cvdnetwork,render root
同时Cuttlefish支持使用adb模式进行debug,我们可以通过如下命令开启adb调试:
./bin/adb -e shell
效果如图所示:
此时我们可以看看系统运行的一些进程是否正常(此处system_server与surfaceflinger均正常运行):
我们再通过getprop命令观察一下系统信息:
这里可以明显看到,Android版本为1 2,sdk版本为32。
另外,我试了一下在系统内ping百度,居然是通的,想必是利用了宿主机的网络。
如果我们需要关闭Cuttlefish,使用如下命令进行关闭:
HOME=$PWD ./bin/stop_cvd
以上模拟运行的是我们下载的官方镜像,那么其实我们也可以模拟运行自己编译的镜像,此时我们需要在AOSP源码编译环境的顶层目录下进行操作:
source build/envsetup.sh
launch aosp_cf_****.img
launch_cvd
如果我们需要可视化界面怎么办呢,很简单。我们可以通过在launch_cvd命令后增加–start_webrtc=true来开启webrtc,此时我们可以在本机或者远程主机上通过Chrome浏览器网页进入可视化界面,网页地址为https://ip:8443,其中ip为cuttlefish运行环境所在的ip,如图所示:
以上就是本篇博客的全部内容啦,希望能够对大家有所帮助~
编译教程已经更新了